Боюсь, что нет универсального универсального магического ответа - все это действительно зависит от «почти» части И от сил, которые будут стимулировать изменения в этих частях кода.Итак, на самом деле можно ответить только на конкретном примере ...
Как говорится, есть несколько уроков, извлеченных из опыта, которые в основном суммированы в известной (но, к сожалению, часто неправильно понятой) GOFКнига «Узоры дизайна» .Если вы потратите время на first чтение части first книги, вы поймете, что большинство (если не все) шаблонов в каталоге основаны на том же принципе: отделить вариант от инварианта .Как только вы можете отличить одно от другого в своем коде (предупреждение: здесь есть ловушка, и новичок почти всегда попадает в нее), какой шаблон для применения обычно очевиден (иногда до такой степени, что вы понимаете, что использовали только этот и тот шаблоны после вы реорганизовали свой код).
Теперь, как я уже сказал, есть ловушка: случайное дублирование.Тот факт, что два фрагмента кода выглядят похожими, не означает, что они являются дубликатами - довольно часто они только "случайно" похожи сейчас , но силы, которые будут вносить одно или другое изменениев основном не связаны.Если вы попытаетесь немедленно провести рефакторинг этого кода, вы вскоре обнаружите, что делаете «универсальный» случай все более и более сложным, чтобы поддержать изменения, которые на самом деле не связаны, и в итоге вы получите чрезмерно усложненный неразборчивый беспорядок, который только делает ваш код неуправляемым.Таким образом, хитрость здесь заключается в том, чтобы тщательно изучить весь контекст, спросить себя, что могло бы привести к изменениям в одной или других «похожих» частях, и, если сомневаетесь, подождать, пока вы не узнаете больше.Если это произойдет, чем каждый раз, когда вы меняете A, вы должны вносить одно и то же изменение в B по тем же причинам, тогда у вас действительно есть дубликат.
Для более практического, краткосрочного совета, основанного на том, что мыИсходя из вашего слишком абстрактного примера (и из собственного опыта), можно предположить, что существует как минимум два шаблона, которые чаще всего участвуют в устранении дублирования в иерархии классов: метод шаблона и стратегия.
NB: я сказал «к сожалению, часто неправильно понимают», потому что большинство людей, кажется, прыгают в каталог шаблонов и пытаются принудительно вписать их все в свой код (имеет ли это смысл для рассматриваемой проблемы или нет)) и обычно путем копирования-вставки канонического учебника _implementation_ (обычно на основе Java или C ++) вместо понимания _concept_ и его реализации таким образом, который одновременно идиоматичен и адаптирован к конкретному случаю использования (пример: когда функции являются объектом первого класса,вам не обязательно нужен Strategie
класс с абстрактным основанием и конкретными подклассами - чаще всего это простые старые функции обратного вызова JustWork (tm)).