2010-01-07 2 views
0

Согласно Misko Hevery, который имеет блог с возможностью тестирования. Разработчикам следует избегать объектов «держатель», «контекст» и «кухонная раковина» (они берут всевозможные другие объекты и являются сумкой для коллабораторов). Перейдите в конкретный объект, который вам нужен в качестве параметра, вместо владельца этого объекта.Тестируемый Java-код: использование фасоли модели с конструктором

В примере удар, этот код запах? Должен ли я передавать только те параметры, которые необходимы, или модель/компонент, с данными, которые мне нужны.

Например, вы бы сделали следующее: Примечание. Вероятно, я мог бы передать данные в качестве аргументов конструктора. Это запах кода?

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

Другой вопрос: при написании проверяемого кода вы склонны писать TOO многих классов. Неправильно ли иметь слишком много классов или один класс со слишком многими методами. Классы полезны и имеют одну цель. Но я мог видеть, где они могут быть реорганизованы в один более крупный класс ... но этот класс будет иметь несколько целей.

+0

Почему для второго анализатора требуется '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''? – notnoop

+0

Просто псевдо пример, я не выписал весь код (потому что не существует всего кода).Предположим, что используются строки разработчика и, возможно, 10 других членов. –

ответ

3

Вы также заметите, что Misko Hevery советует группировать параметры в классах, когда увеличивается количество параметров или в случаях, когда это логически приемлемо.

Так что в вашем случае вы можете передать SourceCodeBean без угрызений совести.

0

Многое из того, что вы просите, очень субъективно, и трудно сделать полезные предложения, не зная полного объема того, что вы пытаетесь выполнить, но вот мои 2 цента.

Я бы пошел с вашим последним дизайном. Создайте один класс с именем SourceCodeParser, создайте конструктор в имени файла, разработчике и т. Д., И у него есть метод parse. Таким образом, объект отвечает за разбор себя.

Обычно я предпочитаю передавать параметры конструктору, если они не слишком многочисленны. Code Complete рекомендует использовать максимум 7 параметров. Если вы обнаружите, что количество параметров конструктора является громоздким, вы всегда можете создавать сеттеры с вышеупомянутого класса SourceCodeParser.

Если вы хотите использовать различные методы синтаксического анализа, я бы рекомендовал использовать делегат Parser внутри SourceCodeParser и передать его в качестве параметра конструктора или сеттера.

+0

Подробнее об использовании геттера/сеттера и концепции неизменности, http://stackoverflow.com/questions/996179/. –

0

Если у вас есть класс, единственная цель которого - связать разные части информации, то я не вижу причин, по которым этот класс не должен использоваться напрямую в качестве параметра. Причина в том, что класс был закодирован таким образом, поэтому почему бы вам не позволить ему выполнять свою работу? Поэтому я бы предпочел первый.

Теперь это предполагает, что Parser действительно нуждается в информации, поскольку она семантически представлена ​​в SourceCodeBean. Если все Parser действительно является именем файла, тогда он должен просто взять имя файла, и я предпочел бы второй метод.

Я думаю, что единственное, что может меня беспокоить, это SourceCodeBean, превращаясь в своего рода «кухонную раковину» информации. Например, поля имени файла и формата имеют здесь смысл. Но вам действительно нужен разработчик и линии? Могут ли они быть вместо этого в каком-то связанном метаданных-информационном классе?

Смежные вопросы