代码之家  ›  专栏  ›  技术社区  ›  Berlin Brown

可测试Java代码:使用模型bean和构造函数

  •  0
  • Berlin Brown  · 技术社区  · 15 年前

    据Misko Hevery说,他有一个可测试性博客。开发人员应该避免使用“holder”、“context”和“kitchen-sink”对象(这些对象包含各种其他对象,并且是合作者的一袋)。传递您需要的特定对象作为参数,而不是该对象的持有者。

    在示例中,这个代码有气味吗?我应该只传递所需的参数,还是传递包含所需数据的模型/bean。

    例如,您是否会这样做:注意。我可能已经将数据作为构造函数参数传递了。这是代码味吗?

    public Parser {
      private final SourceCodeBean source;
    
      public Parser(final SourceCodeBean s) {
        this.source = s;
      }
    
      public void parse() {
         // Only access the source field
         this.source.getFilename();
         ...
         ... assume that the classes uses fields from this.source
         ...
      }
    
    }
    
    public SourceCodeBean {
       private String filename;
       private String developer;
       private String lines;
       private String format;
    
       ...
       ...
       <ONLY SETTERS AND GETTERS>
       ...
    }
    
    ...
    
    Or 
    
    public Parser {
    
    
      public Parser(String filename, String developer, String lines ...) {
        ...
      }
    
    }
    
    And building a test case
    
    public void test() {
      SourceCodeBean bean = new SourceCodeBean():
      bean.setFilename();
    
      new Parser().parse();
    }
    

    另一个问题:编写可测试代码时,您是否倾向于编写过多的类?有太多的类或一个方法太多的类是错误的吗?这些类是有用的,并且只有一个用途。但是,我可以看到它们在哪里可以重构成一个更大的类……但是这个类有多个用途。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Bozho    15 年前

    您还将注意到misko hevery建议在类中分组参数,无论何时参数计数增加,或者在逻辑上可以接受的情况下。

    所以在你的情况下,你可以通过 SourceCodeBean 没有悔恨。

        2
  •  0
  •   James McMahon    15 年前

    你所要求的很多东西都是非常主观的,如果不知道你想要完成的全部工作范围,很难提出有用的建议,但我给你2美分。

    我同意你后一种设计。创建一个名为sourcecodeparser的类,让构造函数接受文件名、开发人员等,并让它有一个parse方法。这样,对象就负责解析自身。

    通常,如果参数不太多,我更喜欢将它们传递给构造函数。代码完成建议最多7个参数。如果您发现构造函数参数的数量很繁琐,那么您总是可以从前面提到的sourceCodeParser类中创建setter。

    如果您想要一种方法来建立不同的解析行为,我建议使用sourcecodeparser内部的解析器委托,并将其作为构造函数参数或setter传入。

        3
  •  0
  •   jdmichal    15 年前

    如果您有一个类,它的唯一目的是将各种信息组合在一起,那么我就没有理由不将该类直接用作参数。原因是类被编码成可以做到这一点,那么为什么不让它完成它的工作呢?所以我肯定更喜欢前者。

    现在,假设 Parser 实际上需要信息,因为它在语义上呈现在 SourceCodeBean .如果所有的 语法分析器 实际上需要的是一个文件名,那么它应该只取文件名,我更喜欢第二种方法。

    我想唯一让我担心的是 源代码bean 成为一种“厨房水槽”的信息。例如,这里的文件名和格式字段非常有意义。但你真的需要开发人员和线路吗?是否可以将它们放在某种关联的元数据信息类中?