Как обеспечить выполнение методов в правильном порядке? - PullRequest
3 голосов
/ 10 марта 2011

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

class foo {
    boolean isInitialised = FALSE;
    boolean isSthDone = FALSE;
    float importantData;

    public void initialise {

        ...

        isInitialised = TRUE;
    }

    public void doSth1 { 

      if (isInitialised) {

         importantData = 2134234; 

         }   ...

          isSthDone = TRUE;

    }

    public void doSth2 { 

        if (isInitialised && isSthDone1) {

            ...

          }
    }
}

Этот тип дизайна не дает никакой подсказки, как должен использоваться алгоритм - какой метод должен быть выполнен первым, есть ли шаблон проектирования для этой проблемы?

Ответы [ 4 ]

8 голосов
/ 10 марта 2011

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

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

6 голосов
/ 10 марта 2011

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

Class foo{

  public: 
  foo(){
    a = 1;
    b = "something";
  }

   int a;
   string b;

}
4 голосов
/ 10 марта 2011

@ D. Ламберт и @ Дэвид дают хороший совет.

Если вам нужен шаблон проектирования, который обеспечивает последовательность вызовов, посмотрите Template Method . Это, вероятно, не то, что вы хотите здесь, и я сожалел, что выбрал этот шаблон в прошлом, поэтому используйте его с осторожностью. Он обеспечивает исполнение заказа, нравится вам это или нет.

2 голосов
/ 10 марта 2011

Вам следует рассмотреть возможность использования State здесь. Для меня ваш код выглядит так:

  • «Я в состоянии, которое позволяет мне только инициализировать»
  • "Я нахожусь в инициализированном состоянии, поэтому могу выполнить необходимую логику - Sth1 "
  • Наконец: «Я нахожусь в последнем состоянии, так что я могу сделать сейчас Sth2

http://sourcemaking.com/design_patterns/state

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

...