Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按照SRP原则编写Java类?我的具体案例研究_Java_Solid Principles_Single Responsibility Principle - Fatal编程技术网

如何按照SRP原则编写Java类?我的具体案例研究

如何按照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()

我正在做一个小项目/练习,其中我必须创建一个html解析器来评估服务器端脚本,给其中的所有变量赋值-${…},仅此而已

为了实现这一点,我编写了一个名为“Parser”的类,它有一个公共方法“parseHtml()”,还有两个私有方法,可以完成所有的艰苦工作。当我想到五个s.o.l.I.d原则中的一个时,问题就来了:SRP=一个类应该只有一个改变的理由:

我不知道如何构造我的类,必须知道所有私有方法都是在公共方法中调用的。它就像一种被做成方法的门面图案

+ 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,但我想对于这个小项目/练习,它将完成以下工作:

  • Parser.java

    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();
    }
    
    }

  • Processor.java

    • public Map processServerSide(字符串文件,字符串脚本)//此方法使用下面的private-facade列表
    • 私有脚本引擎processJavascript(字符串脚本)
    • 私有void getDataAttributes(字符串文件)
    • 私有void evaluateDataAttributes(脚本引擎)
    所有这些私有方法都相互依赖。如果不首先调用“getDataAttributes”,您将评估哪些属性

  • Reader.java

    • 公共void readFile(字符串文件路径)
    • 公共字符串getScriptSnippet()//我得到Javascript部分
    • 公共字符串getHtmlFile()//我得到整个html

  • 在没有看到代码的情况下,很难对代码进行注释。考虑到您的方法名称,我建议在一个类中有许多职责,这就是您的SRP问题。为了解决这个问题,您通常会确定多重责任,并将它们推到各自独立的类中。但是如果没有看到更多的代码,就不可能确定。我已经确定了责任,这不是那么容易,我会更新以供您阅读,这样我可以证明自己是否正确。为西西弗斯欢呼!在没有看到代码的情况下,很难对代码进行注释。考虑到您的方法名称,我建议在一个类中有许多职责,这就是您的SRP问题。为了解决这个问题,您通常会确定多重责任,并将它们推到各自独立的类中。但是如果没有看到更多的代码,就不可能确定。我已经确定了责任,这不是那么容易,我会更新以供您阅读,这样我可以证明自己是否正确。为西西弗斯欢呼!