Рефакторинг GPOptimiser
Предложения по рефакторингу:
- Сделайте блок-схему текущей версии алгоритма. Выделите на ней все этапы кастомизирования: виды регуляризации, тип inheritance, генетические операторы и прочее.
- Попробуйте (хотя бы мысленно) набросать абстрактный алгоритм или шаблонный метод GPChainOptimiser.optimize так, чтобы все выделенные выше методы можно было передавать из-вне, например, в конструкторе.
- Реализуйте пример такой "реализации" абстрактного алгоритма. Составные (кастомные) блоки можно реализовать либо с применением функционального программирования, либо через паттерн Command.
- Не получается все-таки избежать if-else конструкций в алгоритме (например, в зависимости от того, выбрана ли схема регуляризации, нужно применять (или нет) соответствующий метод для популяции?
- Попробуйте набросать для этого метод по умолчанию, который, например, возвращает популяцию без изменений.
- Возможно, это все еще будет выглядеть не очень. Тогда имеет смысл задуматься: а, может быть, не все возможные кастомизации натягиваются на единственную абстракцию (алгоритм)?
- Если да, то, возможно, имеет смысл реализовать несколько шаблонных методов / алгоритмов. Да, может частично возникнуть дублирование, но 2 простых версии алгоритма проще поддерживать, чем одну, но чересчур сложную.
- Убедитесь, что все составные элементы покрыты тестами, а также реализации алгоритмов тоже.
- Неудобно постоянно дублировать сборку алгоритма из составных операторов?
- Задумайтесь насчет создания специального объекта - Builder-а, который будет за вас его собирать. Составные блоки алгоритма можно продублировать за счет его методов. Пример неплохого билдера см. тут: https://habr.com/ru/post/244521/
Подробности в https://github.com/nccr-itmo/FEDOT/pull/89#discussion_r435338199