Несмотря на то, что схожесть проще обнаружить, различия более полезны, так как несут больше смысла.
Суть в том, что наличие схожих фрагментов кода говорит о существовании какой-то пока неназванной абстракции. А вот различающиеся части этих фрагментов - это абстракция поменьше, входящая в более общую абстракцию. И вот именно эту маленькую абстракцию необходимо обнаружить, правильно назвать и понятным образом выразить в коде.
Отличная техника выбора имен для абстракций:
- Представить отличающиеся части кода в виде таблицы из двух столбцов: в первом - конкретные отличающиеся значения, во втором - соответствующие им последствия в коде (другие значения, вызовы методов и т.п.).
- Обычно для первого столбца легко придумать название (концепцию), а вот для второго - сложно, но это как раз цель поиска абстракции.
- Важно понимать, что абстракция должна быть лишь на 1 уровень выше конкретных примеров, а не значительно выше (более общей).
- В поиске имени для новой концепции (абстракции) помогает определение других конкретных примеров (значений в первом столбце или последствий в коде), которые могли бы быть использованы в других программах или других предметных областях.