Обобщить пару методов без потери статических проверок - PullRequest
0 голосов
/ 23 января 2019

Я работаю с любимым проектом, пытающимся практиковать (чистый?) ОО и не могу понять, как разложить на части обычное поведение из пары классов. enter image description here enter image description here

public Solution improve(Solution initialSolution)
{
    stopCondition.setInitialSolution(initialSolution);

    Solution nextSolution = initialSolution;
    do
    {
        nextSolution = nextSolutionGenerator.generate(nextSolution);
    }
    while(!stopCondition.isStopConditionReached());

    return nextSolution;
}

Как видите, генерирование является общим для BinaryNextSolutionGenerator и PermutationNextSolutionGenerator. Я знаю, что решение generate (решение решения) должно быть в NextSolutionGenerator, однако я не хочу потерять проверку типа во время компиляции, если я отправлю экземпляр PermutationSolution в экземпляр BinaryNextSolutionGenerator. Похоже, я должен использовать общее программирование, или мой дизайн в корне неверен (или это общий компромисс?), Но я бы предпочел какое-то опытное мнение раньше.

Кстати, генерировать только вызовы doGenerate, потому что я планирую добавить туда общий код регистрации.

1 Ответ

0 голосов
/ 23 января 2019
  1. Make / refactor Solution и Generator для интерфейсов.
    • «хорошим местом» для дженериков будет рефакторинг Integer getVariable(int idx) в <V extends java.lang.Number> getVariable(int idx)
    • другое «хорошее место дженериков» - это (точный) тип Soultion «generator.generate"...
  2. Представьте abstract реализации этих интерфейсов!И поместите туда как можно больше общего кода (public Solution<V> generate() {...}), используйте необходимые методы (<S extends Solution<V>> proteced abstract S doGenerate(S prev);) AbstractGenerator - это также место, где вы бы поместили методы imporvepublic generate).
  3. Расширение этих абстрактных классов и реализация принудительных методов (с конкретными реализациями решений)
  4. То же самое с компоновщиком решений: работа с абстракцией, расширением

...

https://github.com/xerx593/soq54317950 объясняет мои вопросы лучше ... также обрисовал в общих чертах improve() и StopCondition<V extends Number, S extends Solution>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...