如何按照SRP原则编写Java类?我的具体案例研究
我正在做一个小项目/练习,其中我必须创建一个html解析器来评估服务器端脚本,给其中的所有变量赋值-${…},仅此而已 为了实现这一点,我编写了一个名为“Parser”的类,它有一个公共方法“parseHtml()”,还有两个私有方法,可以完成所有的艰苦工作。当我想到五个s.o.l.I.d原则中的一个时,问题就来了:SRP=一个类应该只有一个改变的理由: 我不知道如何构造我的类,必须知道所有私有方法都是在公共方法中调用的。它就像一种被做成方法的门面图案如何按照SRP原则编写Java类?我的具体案例研究,java,solid-principles,single-responsibility-principle,Java,Solid Principles,Single Responsibility Principle,我正在做一个小项目/练习,其中我必须创建一个html解析器来评估服务器端脚本,给其中的所有变量赋值-${…},仅此而已 为了实现这一点,我编写了一个名为“Parser”的类,它有一个公共方法“parseHtml()”,还有两个私有方法,可以完成所有的艰苦工作。当我想到五个s.o.l.I.d原则中的一个时,问题就来了:SRP=一个类应该只有一个改变的理由: 我不知道如何构造我的类,必须知道所有私有方法都是在公共方法中调用的。它就像一种被做成方法的门面图案 + public parseHtml()
+ public parseHtml()
- private getExpressionsFromHtml() //method that grab all ${..} from the file
- private evaluateJavascript(script)
- private deleteJsSnippetFromHtml()
- private setValuesToExpressionsInHtml()
- private evaluateDataIf()
- private evaluateDataFor()
这里有一个链接,作者很好地解释了单一责任原则。。。但我还是有些怀疑:
那么,我缺少什么呢?
当我编写代码时,我倾向于按照以下设计进行编码:我定义单个参与者将要使用的相关方法,然后是一种处理所有这些小型私有方法的接口/公共方法。我总是尽我所能把它们分类好,也就是说不到20个?每个方法的行数,有时甚至是1或2行
如上所示,方法名称尽可能具有描述性,以避免写不必要的注释
问候
编辑
我的应用程序的目标是,给定一个“index.html”,我将能够:
*读文件
*在.html-Javascript引擎-Rhino中处理Javascript
*解析器将在浏览器中呈现的最终html
servlet将接受该程序,并在浏览器中呈现“已解析的文件”。servlet看起来像
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = request.getServletContext().getRealPath("index.html") ;
Parser parser = new Parser();
String screen = parser.doParseHtmlFile(path);
PrintWriter out = response.getWriter();
out.println(screen); // Rendering page, is it ok with this?
}
现在我将列出使解析成为可能的类。作为记录,解析完全是通过使用正则表达式完成的,我听过很多次,由于嵌套的标记,这不适合Html,但我想对于这个小项目/练习,它将完成以下工作:
public String doParseHtmlFile(String fileName) {
/*Not sure if this method could be all extract into another class called for instance: ProccessHtml. It looks to me like a Facade class?*/
// readFile
read.readFile(fileName);
this.htmlParsed = read.getHtmlFile();
// processServerSide
this.attributesMap = processor.processServerSide(this.htmlParsed, read.getScriptSnippet());
// parseHtml
parseHtml();
return this.htmlParsed;
}
private void parseHtml() {
/*This method is the one keeping the responsability in this class of formatting the htmlParsed variable*/
if( !htmlParsed.isEmpty() && !attributesMap.isEmpty() ) {
this.removeJSFromHtml();
this.setValuesToExpressionsInHtml();
this.evaluateDataIf();
this.evaluateDataFor();
}
}- public Map processServerSide(字符串文件,字符串脚本)//此方法使用下面的private-facade列表
- 私有脚本引擎processJavascript(字符串脚本)
- 私有void getDataAttributes(字符串文件)
- 私有void evaluateDataAttributes(脚本引擎)
- 公共void readFile(字符串文件路径)
- 公共字符串getScriptSnippet()//我得到Javascript部分
- 公共字符串getHtmlFile()//我得到整个html
在没有看到代码的情况下,很难对代码进行注释。考虑到您的方法名称,我建议在一个类中有许多职责,这就是您的SRP问题。为了解决这个问题,您通常会确定多重责任,并将它们推到各自独立的类中。但是如果没有看到更多的代码,就不可能确定。我已经确定了责任,这不是那么容易,我会更新以供您阅读,这样我可以证明自己是否正确。为西西弗斯欢呼!在没有看到代码的情况下,很难对代码进行注释。考虑到您的方法名称,我建议在一个类中有许多职责,这就是您的SRP问题。为了解决这个问题,您通常会确定多重责任,并将它们推到各自独立的类中。但是如果没有看到更多的代码,就不可能确定。我已经确定了责任,这不是那么容易,我会更新以供您阅读,这样我可以证明自己是否正确。为西西弗斯欢呼!