Насколько сложным должен быть код? - PullRequest
38 голосов
/ 17 января 2009

Я изучаю алгоритмы, которые могут помочь мне написать меньший, но более сложный код. Вместо того чтобы писать 150 строк операторов if-else, я могу разработать алгоритм, который делает это в 20 строк. Проблема в том, что многие из этих алгоритмов могут быть сложными и требовать много математики, чтобы понять их. Я также здесь единственный, кто понимает их.

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

Ответы [ 28 ]

54 голосов
/ 17 января 2009

Как сказал Эйнштейн:

Сделай все как можно проще, но не проще.

Это относится как к коду, так и к физике.

Используйте свое суждение - станет легче поддерживать? Зачастую, уменьшая большие ошибки if / else до чего-то меньшего, вы удаляете угловые случаи, которые не должны были присутствовать, предотвращая ошибки, которые могли появиться в будущем. Конечно, сводя четкий набор условий к неясному повороту логической логики, которая только случается, вы можете значительно усложнить поддержание вещей, когда что-то меняется.

EDIT:
В приведенном вами случае, если формула будет работать, то это, вероятно, лучший вариант - вы даже можете оставить комментарий со ссылкой на источник. Впрочем, вполне возможно, что формула была там раньше, но была отброшена, чтобы можно было обойти конкретный случай. Это может помочь в комментариях в вашем хранилище версий.

Поскольку никто еще не опубликовал ссылку, вот описание алгоритма PID , на который он ссылается.

28 голосов
/ 17 января 2009

Код пишется один раз, а читается 10 раз. Поэтому вы должны постараться сделать это как можно более простым для понимания.

Кроме того, отладка намного сложнее, чем написание кода. Итак, как вы можете отлаживать свой код, когда уже вложили весь свой ум в написание сложного кода?

Просто попробуйте следовать Три закона разработки программного обеспечения :

  1. Разработчик должен написать код, который создает значение.
  2. Разработчик должен упростить поддержку своего кода, кроме случаев, когда такие расходы будут противоречить первому закону.
  3. Разработчик должен уменьшить свой код до минимально возможного размера, если это сокращение не противоречит первым двум законам.
23 голосов
/ 17 января 2009

Роберт К. Мартин использует этот комикс как введение в свою книгу Чистый код :

The only valid measurement of code quality: WTFs/minute
(источник: osnews.com )

13 голосов
/ 17 января 2009

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

11 голосов
/ 17 января 2009

Уровень «сложный» здесь может быть немного рискованным, но до тех пор, пока для решения алгоритма не требуется доктор математических наук,

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

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

9 голосов
/ 17 января 2009

Старая добрая цитата ....

Любой дурак может написать код, который компьютер может понять. Хорошо программисты пишут код, который люди могут понимать

  • Мартин Фаулер
8 голосов
/ 17 января 2009

Не могу поверить, что кто-то считает, что 150 строк чего-либо проще, чем 20 строк чего-либо.

Пройдите 20 строк и защитите своих коллег следующим образом:

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

  • Если вы используете математические формулы в своем коде или для получения в своем коде, включает ссылки в комментариях (или статических строках). В идеале следует включить две ссылки: веб-ссылку, которая, вероятно, станет доступной в считанные секунды, и уважаемый учебник, который, скорее всего, будет долго печататься и находиться в университетских библиотеках.

Если для понимания вашего кода требуются специальные знания (понимание уравнений в частных производных, степень по физике, теория Галуа, вы называете это), тогда, чтобы защитить себя, вы можете обратиться к своему руководству и сказать: «У меня есть этот специальный опыт что позволяет мне писать код меньшего размера (и, следовательно, более быстрый, более надежный и более простой в обслуживании), но когда вам придется заменить меня, вам придется нанять кого-то с аналогичным опытом. Что вы хотите от меня? сделать?" Будет полезно, если вы скажете своему руководству, как легко можно получить такую ​​экспертизу. Например, многие люди с инженерными степенями могут выучить уравнения в частных производных, но теоретики Галуа довольно слабы на земле.

P.S. Вот пример комментария от хобби-проекта, чтобы я мог отладить свой собственный код позже:

/* 
 * Compute the position of a point partially along the geodesic from 
 * pt1.lat,pt1.lon to pt2.lat,pt2.lon
 * 
 * Ref: http://mathworld.wolfram.com/RotationFormula.html
 */
6 голосов
/ 17 января 2009

Это действительно зависит от того, что означает комплекс. Если ваш «простой» алгоритм состоит из 150 строк почти одного и того же кода, мои глаза застекятся, и я не смогу его понять. Если вы поместите эти условия в матрицу или что-то в этом роде, а ваш код будет циклом для чтения матрицы и принятия решений, я пойму это лучше, хотя цикл может быть менее «простым», чем набор операторов if / else.

Если в основном вы говорите о программе на Perl, в которой вы делаете все в одной строке, широко используя переменную по умолчанию $ _, я бы сказал, придерживайтесь более длинной и более подробной версии.

Если есть принятая формула, чтобы сделать что-то, вы можете использовать принятую формулу. Если существует простая алгебраическая формула, которая занимает 3 или 4 строки, а комплексное дифференциальное уравнение занимает одну строку, вам следует использовать простую алгебраическую формулу. В случае, упомянутом в комментариях, я думаю, что алгоритм PID "проще", чем 150 строк кода if / else. Я не думаю, что вы используете алгоритм, чтобы скрыть что-либо, скорее вы используете стандартные методы в области проблемы. Просто обязательно прокомментируйте его и, возможно, даже добавьте ссылку на веб-страницу, описывающую формулу.

6 голосов
/ 17 января 2009

Сложно, как должно быть, и не более.

5 голосов
/ 17 января 2009

Поиск пути через 100 строк операторов if / else часто (на мой взгляд) сложнее для выносливости сопровождающего, чем тратить то же время на понимание лучшего алгоритма (который следует объяснить или связать в комментариях) и, наконец, проверка того, что 20 строк реализации действительно выполняют эту строку. Он также имеет преимущество обучения на рабочем месте, что делает его гораздо более интересным (в позитивном смысле), а зачастую и лучшим профилем исполнения (меньшее использование ресурсов).

Хитрость, которой вы должны избегать, - это «умные хаки», которые ругают язык без реальной выгоды. Ум, который вы должны принять, всегда использует лучший алгоритм для работы.

edit: Что касается примера PID: мне очень трудно представить, что функциональность PID может быть разумно заменена кучей операторов if-else. Решение if-else всегда будет работать хуже (менее плавные переходы), его будет очень сложно поддерживать и очень сложно настроить (настройка частей PID очень важна для получения желаемого поведения). Я хотел бы добавить, что понимание PID не слишком сложно, даже если вы не знаете математику, которую можно легко найти.

...