Когда прекратить высушивать код? - PullRequest
4 голосов
/ 07 октября 2009

Так что засыхание кода должно быть хорошей вещью, верно? В одном из проектов, над которым я работал, была ситуация, когда были определенные модели / сущности, которые были более или менее одинаковыми, за исключением контекста, в котором они использовались. То есть каждый такой объект имеет заголовок, описания, теги, идентификатор пользователя и т. Д. И некоторые другие атрибуты. Следовательно, их действия CRUD в соответствующем контроллере выглядели очень похоже.

Мой менеджер утверждал, что его повторение кода и должно быть высушено. Поэтому он придумал модуль CRUD ruby, который, когда include d позаботился о действиях CRUD для контроллеров всех этих объектов. Но в конце концов Простота была скомпрометирована. Код потерял читабельность, поскольку каждая «вещь» была названа «объектом». Отладка стала трудной, и весь смысл СУШКИ кода был утерян.

Это был только один случай. Есть несколько из них, где DRYing up привел к сложному, трудно отлаживаемому коду. Итак, вопрос в том, когда мы прекратим высушивать код? Потому что не каждый раз, когда вы понимаете, что код потерял простоту (и часто автор кода никогда не понимает, что простота кода теряется). Кроме того, если нам придется выбирать между простотой и DRYed-кодом, что следует выбрать, если вообще возникает ситуация, когда вы можете получить только один из них.

Ответы [ 8 ]

4 голосов
/ 07 октября 2009

Насколько я понимаю, если сушка кода приводит к потере простоты, мы делаем что-то ужасно неправильное. Я думаю, мы должны высушить код, который повторяется и несет единоличную ответственность. Если обязанности кода различны и / или абстракция сущностей не может быть названа, мы не повторяем код. Шаблон кода может повторяться, но это совершенно другой код с собственной ответственностью. Если DRYing приводит к расплывчатому коду, вы, вероятно, пытаетесь засушить код с разными обязанностями, которые имеют похожий шаблон, что не очень хорошая практика. СУШКА должна усиливать простоту, а не подавлять ее.

2 голосов
/ 07 октября 2009

Если вы следуете REST, тогда да, контроллеры будут очень похожи и в значительной степени шаблонны. Я согласен с вашим менеджером, что это проблема.

Звучит так, будто он нашел неоптимальное решение. Для лучшего взгляда посмотрите на плагин Джозе Валима *, который включен в Rails 3 .

0 голосов
/ 07 октября 2009

Для меня дублированный код - это запах, который может иметь несколько источников:

  • Отсутствующие переменные (введите переменную).
  • Отсутствующие методы (вставить выражение в метод).
  • Зависть к функциям (поведение в классе завидования).
  • Чрезмерное обобщение (разбить универсальный класс на конкретные конкретные классы).
  • Недостаточная абстракция (перенести атрибуты и поведение в новый класс).

Этот список, вероятно, неполон. Считай это отправной точкой.

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

  • Вы неправильно определили проблему в корне дублирования (отменить, переосмыслить, повторить попытку).
  • Дублирование является необходимым компромиссом (отмените свое изменение и живите с ним).
  • Ваше программное обеспечение обязательно является сложным (внесите изменения и живите с ним).

Если возможно, рассмотрите возможность размещения примера кода вместе с такими вопросами. Они предоставляют что-то конкретное для обхода. И помните, многие из этих вещей очень субъективны.

0 голосов
/ 07 октября 2009

Основная причина применения DRY для улучшения удобства сопровождения состоит в том, чтобы гарантировать, что когда изменение кода необходимо, это изменение необходимо вносить только в одном месте, что исключает риск того, что оно не получит изменилось везде, где это нужно.

Но я не рассказываю всю историю:

Это интервью с Дейвом Томасом говорит DT:

DRY говорит, что каждая часть системы знание должно иметь авторитетный, однозначный представление.

Первый раз, когда я увидел "СУХОЙ", был в Прагматичный программист , поэтому я склонен пойти с Дейвом на это.

Есть еще одна статья, которую стоит прочитать здесь

Но СУХОЙ - это принцип, а не правило: чем лучше мы понимаем этот принцип, тем больше у нас возможностей распознавать ситуации, в которых он должен применяться.

(И, наконец, я думаю, что я хотел бы немного больше, чем "более или менее то же самое", прежде чем я начал "СУШИТЬ" этот код: если бы я мог видеть ясный путь, которым эти две вещи могут расходиться в будущем я был бы склонен оставить их в покое).

0 голосов
/ 07 октября 2009

Целью принципа СУХОЙ является повышение качества кода.

Если изменения не улучшают качество кода, пора остановиться. Способность судить об этом приходит с опытом. По мере изменения требований меняется и наиболее подходящий способ рефакторинга кода, поэтому невозможно получить все идеальное - по крайней мере, сначала необходимо заморозить требования.

Минимизация размера кода, как правило, не должна учитываться при определении качества, если только вы не занимаетесь разработкой кода, поэтому не СУШИТЕ, если единственная цель - уменьшить размер кода.

Сложные трюки могут принести больше вреда, чем пользы.

0 голосов
/ 07 октября 2009

Если бы кто-то сказал мне - с открытым лицом - что мой код нуждался в СУШКЕ, я бы, вероятно, воспринял это как знак того, что все, что они собираются сделать, будет действительно надуманным и для -sake-оф-нем.

Как уже было сказано, существует также разница между простотой написания кода (лень) и простотой в самом коде (элегантность). Я согласен, однако, что есть баланс. У меня была такая ситуация однажды (в PHP, но как она напоминает мне о вашей дилемме):

$checked = ($somevariable) ? "checked=\"checked\"" :"";
echo "<input type="radio" $disabled_checked />";
$checked = ($someothervariable) ? "checked=\"checked\"" :"";
echo "<input type="radio" $checked />";

Это даже не очень хороший пример того, с чем я имел дело. По сути, потому что это радиовход, оба входа нуждались в некотором способе узнать, что нужно было всплывать. Я знал, что у него есть то, что ваш босс мог бы назвать проблемами «сырости», поэтому я ломал голову, пытаясь найти какое-то решение, которое было бы изящно и по существу. Наконец я показал его старшему разработчику, и он сказал: «Нет, все в порядке, он делает то, что ему нужно. Это всего лишь одна дополнительная строка».

Я почувствовал облегчение, когда мне напомнили, что я больше вредил своему проекту, чем помогал, переживая из-за этого, но в то же время я все еще разочарован тем, что он так небрежно относился к фундаментальному принципу (как будто это не так). один из его, хотя я уверен, что это так).

Так что, хотя я согласен, ваш менеджер, вероятно, делал что-то только ради этого, только когда мы стремимся придумать лучшие методы и подходы, мы получаем лучшие языки, такие как Ruby и Python, и более холодные библиотеки, такие как Jquery.

В основном, что если на следующей неделе у вас вдруг будет 70 things вместо 2? Если объекты вашего босса делают это совсем несложно, он был прав. Если это та же самая проблема (в коде или в исполнении), он ошибся. Но это не значит, что нет лучшего ответа, чем простота, потому что это всего лишь пара вещей.

0 голосов
/ 07 октября 2009

Что касается проблемы «отладки», я имею обыкновение создавать такой «базовый класс», чтобы включить в него дополнительное поле. Это поле представляет собой простую строку, которая идентифицирует наиболее производный класс (и, таким образом, передается из конструктора в конструктор). Затем каждое сообщение будет печатать это поле + идентификатор объекта "realtype [id]", и все внезапно становится намного проще для отладки.

Теперь на СУХОЙ.

Есть две вещи, чтобы высушить:

  • построение иерархии
  • с использованием общего кода

Первый пункт теперь должен быть хорошо понят. Иерархия классов означает отношения IS-A. Если два класса имеют сходное поведение, но в остальном функционально не связаны, то они НЕ ДОЛЖНЫ быть частью одной иерархии. Это только сбивает с толку плохого сопровождающего и ухудшает читабельность.

Второй пункт может использоваться гораздо чаще, особенно с языками сценариев. В предыдущем примере я бы сказал, что вместо иерархии классов вы можете просто определить универсальные методы, которые будут принимать разные классы (моделировать разные бизнесы) и обрабатывать их одинаково. Таким образом, вы избегаете повторения (СУХОЙ), но не жертвуете читабельностью (imho).

Мои 2 кар.

0 голосов
/ 07 октября 2009

Удобочитаемость и ремонтопригодность - две наиболее важные функции хорошего кода.К сожалению, иногда приходится идти на компромисс.Это вопрос баланса, и не все согласятся.

Я тоже склоняюсь к вашей точке зрения.Я предпочел бы иметь некоторое очевидное повторение, если это означает, что код легче понять.

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