Java Object Oriented Design Вопрос: обновить внутреннее состояние или вернуть новый объект - PullRequest
1 голос
/ 23 февраля 2010

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

В этом примере я рассматриваю два подхода. В приведенном ниже методе execute я должен вернуть неизменный объект «data / bean / model» с выводом метода execute или обновить состояние класса BusinessLogic.

Оба выполняют одну и ту же цель, я хочу получить результат выполнения, и либо данные должны содержаться в контейнере компонента или внутри класса BusinessLogic.

Я предпочитаю иметь класс BusinessLogic, потому что SomeObject - это бесполезный бин, который ничего не делает.

Что ты думаешь?

public class SomeObject  {
    private String data1;
    private String data2;
}

public class BusinessLogic {

    private final IWebObject webObject;

    /* String data1; String data2 */    

    public BusinessLogic(final IWebObject webObject) {
        this.webObject = webObject;
    }

    // Approach 1        
    public SomeObject execute() {
        return new SomeObject();
    }

    or
    ...
    ...

    // Approach 2
    public void execute() {
        // Do something
        this.data1 = "data1";
        this.data2 = "data2";
    }

    public String getData1() { }
    public String getData2() { } 

} // End of the Class //

Моя единственная проблема с подходом 2 состоит в том, что data1 и data2 не будут неизменными, поэтому. Я могу вызвать выполнить произвольно и изменить эти значения.

Ответы [ 3 ]

4 голосов
/ 23 февраля 2010

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

1 голос
/ 23 февраля 2010

Это не общий вопрос объектно-ориентированного проектирования - он зависит от домена, который вы пытаетесь смоделировать.

  • Должно ли execute изменить состояние BusinessLogic или нет? (Вариант 2)
  • Как этот класс потребляется? Используются ли данные1 и данные2 по-разному? В другом контексте? (Вариант 1)
  • У данных1 и данных2 время жизни отличается от BusinessLogic? (Вариант 1)
1 голос
/ 23 февраля 2010

По большей части, я бы сказал, что это зависит от природы кода, который вызывает метод execute (). Если он будет просто читать результаты «как есть», тогда было бы неплохо сохранить их в классе BusinessLogic. Если вы собираетесь передавать результаты в разные методы, вы должны поместить результаты в отдельный класс (вы могли бы реализовать в BusinessLogic интерфейс, который содержит только методы результата, но это могло бы размыть грань между реализацией BusinessLogic заканчивается и где начинается реализация результата).

Для начала, вероятно, было бы лучше сохранить его внутренним - следуя принципу "Тебе это не нужно". Когда придет время, когда вы увидите, что вам понадобится передать результаты другим методам и другим объектам, вы можете изменить его в соответствии с вашими потребностями.

...