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