Иногда дублирование кода является результатом «каламбура»: две вещи выглядят одинаково, но не являются таковыми.
Вполне возможно, что чрезмерное абстрагирование может нарушить истинную модульность вашей системы. В режиме модульности вы должны решить, «что может измениться?» и "что стабильно?". Все стабильное помещается в интерфейс, а нестабильное инкапсулируется в реализацию модуля. Затем, когда что-то изменится, нужное вам изменение будет изолировано от этого модуля.
Рефакторинг необходим, когда то, что вы считали стабильным (например, этот вызов API всегда будет принимать два аргумента), нужно изменить.
Итак, для этих двух дублированных фрагментов кода я бы спросил: обязательно ли изменение, необходимое для одного, означает, что другой также должен быть изменен?
То, как вы ответите на этот вопрос, может дать вам лучшее представление о том, какой может быть хорошая абстракция.
Шаблоны проектирования также являются полезными инструментами. Возможно, ваш дублированный код выполняет какой-то обход, и следует применить шаблон итератора.
Если ваш дублированный код имеет несколько возвращаемых значений (и именно поэтому вы не можете использовать простой метод извлечения), то, возможно, вам следует создать класс, который содержит возвращаемые значения. Класс может вызывать абстрактный метод для каждой точки, которая различается между двумя фрагментами кода. Затем вы должны сделать две конкретные реализации класса: по одной для каждого фрагмента. [По сути, это шаблон проектирования Template Method, не путать с концепцией шаблонов в C++. В качестве альтернативы то, что вы ищете, может быть лучше решено с помощью шаблона стратегии.]
Другой естественный и полезный способ думать об этом — использовать функции высшего порядка. Например, создание лямбда-выражений или использование анонимных внутренних классов для передачи кода в абстракцию. Как правило, вы можете удалить дублирование, но если между ними действительно нет связи [если одно меняется, то должно измениться и другое], тогда вы можете навредить модульности, а не помочь ей.
Прикрепляю к посту несколько видео по теме: