Является ли дублирование кода достаточной причиной для извлечения метода ...? - PullRequest
4 голосов
/ 18 ноября 2010

... когда извлеченный метод будет страдать от низкой когезии (не образующей хорошую абстракцию и имеющей плохое имя)?

Например, какое имя вы бы дали следующему методу?

private void foobar() {
    Server.checkAllowedDeviceCount(socketAction._sess.getDeviceID();
    socketAction.registerSession();
    socketAction._sess.runApplication();
}

Это возможный дубликат другого моего вопроса: СУХОЙ или СУХОЙ?Об избежании дублирования кода и сохранении сплоченности - или о моем отчаянном способе получить некоторые предложения от более опытных программистов (надеюсь, вы простите меня).Пожалуйста, проверьте ссылку выше - она ​​содержит код, на котором основан пример, который я представляю здесь.

Ответы [ 4 ]

1 голос
/ 18 ноября 2010

Я строю кодовые детекторы клонов . Часто я вижу множество наборов кода A B C P Q, найденных в виде клонов, где A B C концептуально согласованы, а P Q концептуально согласованы, но ABC и PQ не связаны. Детектор клонов (или необразованный читатель о вашем коде) будет видеть ту же последовательность, что и клоны. Да, вы можете попытаться сделать плохую абстракцию FOOBAR из A B C P Q, но с точки зрения принципиального читателя, вам лучше сделать просто A B C inyo абстракцией, а затем подумать, что делать с клонами P Q.

Я не знаю, применимо ли это в вашей ситуации, поскольку все ваши звонки являются сокетами (A B C?), И я незнаком с вашим интерфейсом.

0 голосов
/ 19 октября 2014

Вот ключ, если бы вам пришлось изменить один из дубликатов (чтобы исправить ошибку или добавить функцию), вам также пришлось бы изменить другие? Если ответ «да», объедините их в одну функцию.

Я также заметил, что все три строки вашей функции имеют дело с socketAction, а на this / self вообще нет ссылок. Это говорит о том, что этот метод должен быть частью класса socketAction.

0 голосов
/ 19 ноября 2010

Взглянув на вопрос "To DRY ...", я думаю, что эту функцию следует извлечь - дублирование достаточно запаха, чтобы оправдать его.

Попытка вывести назначение класса SocketAction из внутренних классов, которые вы показали в этом вопросе, кажется, что StartSession - разумное имя для этой функции.

0 голосов
/ 18 ноября 2010

Если бы дублирование было «плохим», тогда да, я бы подумал извлечь его, но вы всегда захотите сбалансировать это с другими проблемами.

Кроме того, согласно Рефакторинг метода извлечения (C #) , существует 4 причины для извлечения метода, и дублирование является одним из них.

Другие (как указано в связанной статье):

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