2013-12-20 2 views
7

Я задаюсь вопросом, является ли это хорошая практика, чтобы получить код, который который используется так:Соответствует ли это классу одним способом?

new TemplateProcessor(inputStream).processTemplate("output-path.xhtml"); 

Здесь TemplateProcessor содержит только один публичный метод. Кажется, что код выше может быть выражен статическим методом, но я бы хотел этого избежать. Причина проста: объект может содержать инкапсулированное состояние (возможно, сейчас, возможно, в будущем). Уважаемые эксперты, что бы вы предпочли в этом случае?

+3

Если объект несет в себе состояние, то класс, кажется, путь. Полезные статические методы кажутся хорошим способом, когда ни одно государство не переносится. – skiwi

+1

Код будущего кода - хороший код – Bathsheba

+1

@skiwi Статические методы не выглядели хорошо, так как я начал использовать DI/IoC ..:> – user2864740

ответ

2

Разумно инкапсулировать код в статическом методе, со статическим импортом становится очень просто в использовании:

processTemplate(inputStream, "output-path.xhtml"); 

выше статический метод будет просто фасад, метод удобства быть используемый для этого конкретного случая , что ваш класс решает, предположительно, тот, который очень распространен. Это не мешает классу развиваться, даже добавляя состояние. Для более специализированных случаев использования потребители могут создавать экземпляры класса и использовать его методы как обычно.

Чтобы сделать это разделение еще более выраженным, вы можете добавить статический метод класса родственного, как TemplateProcessorFacade, который не является instantiatable утилиты класса:

public final class TemplateProcessorFacade { 
    private TemplateProcessorFacade() {} 
    public static void processTemplate(...) { 
    ... 
    } 
} 
0

Класс должен рассматриваться как объект или модуль, который выполняет ключевую роль или функцию в программе. Роль, которую не выполняет ни один класс или модуль. Например, вы можете иметь класс Animal, который предоставляет функции sleep(), run(). Но вам может понадобиться класс для плотоядных, который также kill(), hunt() и т. Д. Итак, вы реализуете класс Carnivores, расширяя его от Animal, что делает все переменные типа Animal, но также дополнительно убивает и охотится.

Если ваш класс имеет только один общедоступный метод, но если для дизайна важно иметь его как отдельный модуль, то для него класс хорош. Вы можете продлить его позже, если это необходимо.

Также вы можете, держать sleep() и run() функции статическим и общественность, все Animal «s сделать это, и поэтому вы можете просто сделать Animal.sleep() и такой, без создания отдельного экземпляра. Но такой функции, как roar(), быть не должно.

Update: Поэтому я сказал, sleep() и run() могут быть статичными, там может быть классом Man, который также спит и работает.

вопрос спросить:

ли смысл называть sleep() и run() или любую функцию класса без инициализации объекта этого класса? Если да, то имеет смысл сделать его статичным.

+0

Извините, последнее предложение немного неясно для меня. Зачем здесь создавать статический метод? Все 'Animal' 'sleep()' и 'run()', все они наследуются от 'Animal'. – dazu

+0

@dazu Я объяснил это в обновленном ответе. –

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