Стоит ли создавать новый класс для вариации алгоритма?

195
24 декабря 2017, 08:58

Есть класс А, который реализует некий алгоритм.
На главной форме есть чекбокс, при отметке которого алгоритм выполняется с небольшими изменениями в логике.
Также могут появиться еще много чекбоксов, которые по-немногу меняют логику алгоритма.
Получается, для обработки всех чекбоксов в алгоритме класса А надо будет писать много условий, код усложняется как визуально, так и для понимания.

Или лучше создавать новые классы А2, А3 и т.д., которые "в чистом виде" будут реализовывать свои вариации алгоритма?

Answer 1

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

Т.е. вы создаете интерфейс допустим такой:

interface AlgoritmExecutor{
     execute();
}

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

Но остается вопрос как выбирать нужный класс. Тут моё предложение не лучшее. Создать фабрику, которая будет принимать пачку boolean за каждый чекбокс.

class AlgoritmFactory{
    static AlgoritmExecutor chooseAlgoritm(boolean... checkbox){
        //тут исходя из включенных чекбоксов выбираете нужный класс алгоритма 
    }
}

Это удобно тем, что в слое вида вы обращаетесь к фабрике, передаете ей все чекбоксы и получаете выбранный алгоритм в виде интерфейса.

public void algoritmAction(){
     AlgoritmExecutor  algoritm = AlgoritmFactory(checkbox1.isEnabled(), checkbox2.isEnabled(), checkbox3.isEnabled());
     algoritm.execute();
}

но фабрика становится не очень понятна для стороннего читателя из-за пачки булевых значений.

READ ALSO
Как писать на Spring 4 + Hibernate 4?

Как писать на Spring 4 + Hibernate 4?

Делаю проект учебных целях на spring + hibernateПо примерам написал часть функционала, но в зависимостях указал Spring 4

209
Mac Book Pro 2009 для программирования Scala в IntelijIdea

Mac Book Pro 2009 для программирования Scala в IntelijIdea

ПриветПодойдёт ли Mac Book Pro (Intel Core 2 duo 2

180
Передача массива, как параметрa @Query в Retrofit 2

Передача массива, как параметрa @Query в Retrofit 2

Допустим, есть массив объектов Rating[], содержащий 5 элементовКак его можно передать в параметр интерфейса запроса, чтобы на выходе я получил...

189
Как работать с ресурсами из проекта?

Как работать с ресурсами из проекта?

Сюда нужно поместить txt файл, который должен лежать в jar файле(уже скомпилированной программе)Какие методы нужны, и в по какому пути положить...

141