Инкапсуляция алгоритма в класс

6 ответов

Это не плохая стратегия вообще. На самом деле, если у Вас есть способность на Вашем языке (который Вы делаете в C++) определить некоторый тип абстрактного суперкласса, который определяет непрозрачный интерфейс к базовой функциональности, можно загрузить различные алгоритмы, и во времени выполнения (думайте, сортируя алгоритмы, например). Если Ваш выбранный язык имеет отражение, у Вас может даже быть код, который бесконечно расширяем, позволяя алгоритмам быть загруженным и использовал, который не мог даже существовать, когда потребитель упомянутых алгоритмов был записан. Это также позволяет Вам слабо связывать свои другие функциональные классы и алгоритмические классы, который полезен в рефакторинге и в сохранении в целости Вашей исправности при работе над крупными проектами.

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

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

5
ответ дан 2 December 2019 в 21:04
поделиться

Ваш вопрос мог в более общем плане формулироваться как, "как мы используем объектно-ориентированное проектирование, когда основная идея программного обеспечения просто выполняет алгоритм?"

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

Я думаю, что хороший общий дизайн похож на то, что Вы имеете там...

class InputData {};
class OutputData {};

class TheAlgorithm 
{
private:
     //functions and common data

public:
   TheAlgorithm(InputData);      
   //other functions
   Run();
   ReturnOutputData();
};

Затем позвольте, которые взаимодействуют с основным () или Ваш GUI однако, Вы хотите.

2
ответ дан 2 December 2019 в 21:04
поделиться

Существует шаблон разработки, который решает проблему; это называют "Шаблоном разработки Стратегии" - можно найти некоторую хорошую информацию о нем здесь.

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

5
ответ дан 2 December 2019 в 21:04
поделиться

Я обычно создаю функтор или Функциональный объект для инкапсуляции моих алгоритмов.

Я обычно использую следующий шаблон

class MyFunctor {
    public:
       MyFunctor( /* List of Parameters */ );
       bool execute();
    private:
       /* Local storage for parameters and intermediary data structures */
}

Затем я использовал свои функторы этот путь:

    bool success = MyFunctor( /*Parameter*/ ).execute();
1
ответ дан 2 December 2019 в 21:04
поделиться

Возможно, лучший подход (если я не пропускаю что-то) является к ecapsualte алгоритмом в классе, и имейте его, выполняются через вызов метода. Можно или передать во всех параметрах общественным собственностям, через конструктора, или создать структуру, что ecapsulates все параметры, который передается в классу, который содержит алгоритм. Но обычно это не хорошая идея выполнить вещи в конструкторе как этот. Прежде всего, потому что это не интуитивно.

public class MyFooConfigurator
{
   public MyFooConfigurator(string Param1, int, Param2) //Etc...
   {
      //Set all the internal properties here
      //Another option would also be to expose public properties that the user could
      //set from outside, or you could create a struct that ecapsulates all the
      //parameters.
      _Param1 = Param1; //etc...
    }

    Public ConfigureFoo()
    {
       If(!FooIsConfigured)
          return;
       Else
          //Process algorithm here.
    }
}
1
ответ дан 2 December 2019 в 21:04
поделиться

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

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

0
ответ дан 2 December 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: