Свести к минимуму побочные эффекты (в идеале их нет)
Функцию, которая вызывает 3 изменения состояний вне своей собственной области, гораздо сложнее рассуждать и поддерживать, чем функцию, которая просто вводит что-то и выводит что-то еще. Вы не можете просто знать, что делает функция, вы должны помнить, что она сделала и как это влияет на все другие соответствующие функции.
Под минимизацией ООП побочные эффекты также подразумевают классы с меньшим числом членов, и особенно с меньшим числом членов, которые могут изменять состояние класса, поскольку функции-члены могут изменять состояния, отличные от своих собственных, и иметь побочные эффекты (например, они могут манипулировать внутренними объектами класса). Это также означает, что классы имеют меньше собственных членов данных, так что у этих методов меньше состояния для изменения и меньше побочных эффектов, которые они могут вызвать.
В качестве простого примера представьте, что вы пытаетесь спроектировать причудливую структуру данных, которая может поддерживать sorted
состояние, которое она использует для определения, выполнять ли двоичный или линейный поиск. В таком случае может быть полезно разделить дизайн на два класса. Вызов sorted
несортированного класса может затем вернуть структуру данных другого класса, которая всегда сохраняет его содержимое отсортированным. Теперь у вас меньше побочных эффектов (следовательно, меньше подвержено ошибкам и легче для понимания кода), а также более широко применимый код (прежний дизайн был бы расточительным как в обработке, так и в интеллектуальном обеспечении человека для небольших массивов, которые никогда не нужно сортировать).
Избегайте лишних внешних зависимостей
Возможно, вам удастся реализовать самый краткий из всех возможных кодов с максимальным повторным использованием кода, используя 13 различных библиотек для выполнения относительно простой задачи. Однако это переносит интеллектуальную нагрузку на ваших читателей, заставляя их понимать по крайней мере части 13 различных библиотек. Эта неотъемлемая сложность должна быть немедленно оценена любым, кто пытался создать и понять стороннюю библиотеку, для которой требовалось задействовать и создать дюжину других библиотек для функционирования.
Это, вероятно, очень противоречивое представление, но я бы предпочел, чтобы какое-то скромное дублирование кода было противоположным, если конечный результат хорошо проверен (ничем не хуже, чем непроверенный неисправный код, дублирующийся много раз). Если выбор между 3 строками дублированного кода для вычисления векторного перекрестного произведения или извлечением эпической математической библиотеки только для того, чтобы сократить 3 строчки кода, я бы предложил первый, если вся ваша команда не участвует в этой математической библиотеке. в этот момент вы все равно можете подумать о написании 3 строк кода вместо 1, если это достаточно тривиально в обмен на преимущества разделения.
Повторное использование кода является балансом. Повторное использование слишком много, и вы переносите интеллектуальную сложность одним-ко-многим способом, так как в этих трех строчках простого кода, который вы сохранили выше, стоит цена, требующая от читателей и сопровождающих понимать намного больше информации, чем три строчки кода , Это также делает ваш код менее стабильным, так как если математическая библиотека изменится, ваш код тоже может измениться. Повторное использование слишком мало, и вы также умножаете интеллектуальные издержки, и ваш код перестает извлекать выгоду из центральных улучшений, так что это балансирование, но идея о том, что это балансирование, стоит упомянуть, поскольку попытка искоренить каждую маленькую форму скромного дублирования может привести к результат, который так же трудно поддерживать, если не больше, чем противоположная крайность.
Испытай дерьмо из этого
Это само собой разумеющееся, но если ваш код не обрабатывает все входные случаи и пропускает некоторые крайние случаи, то как вы можете ожидать, что другие будут поддерживать написанный вами код, который вы даже не поняли, до того, как он был передан им в глаза? Достаточно сложно внести изменения в код, который прекрасно работает, не говоря уже о коде, который никогда не был совершенно правильным с самого начала.
Кроме того, код, который проходит тщательные тесты, обычно находит меньше причин для изменения. Это относится к стабильности, которая является еще большим достижением, чем просто ремонтопригодность, поскольку стабильный код, который никогда не нужно изменять, не требует затрат на обслуживание.
Документация по интерфейсу
Приоритет «что делаешь», а не «как дела», если ты не можешь посвятить одинаковое время документированию обоих. Четкий интерфейс, который очевиден в своих намерениях относительно того, что он будет делать (или, по крайней мере, что он должен делать) во всех возможных входных случаях, даст ясность контекста его собственной реализации, которая поможет понять не только как использовать код, но и как он работает.
Между тем, код, которому не хватает этих качеств, когда люди даже не знают, что он должен делать, - это SOL независимо от того, насколько хорошо документированы детали его реализации. 20-страничное руководство о том, как реализован исходный код, бесполезно для людей, которые даже не могут понять, как именно он должен использоваться в первую очередь и что он вообще должен делать во всех возможных сценариях.
Для реализации, отдавайте предпочтение документированию того, что вы делаете, отличным от других. Например, у Intel есть ограничивающая иерархия томов для их ядер трассировки лучей. Поскольку я работаю в этой области, я могу сразу понять большую часть того, что делает их код, не просматривая документацию. Тем не менее, они делают нечто уникальное - идею обхода BVH и параллельного выполнения пересечений с использованием лучевых пакетов . Вот где я хочу, чтобы они расставили приоритеты в своей документации, потому что эти части кода экзотичны и необычны для большинства исторических реализаций BVH.
читабельность
Эта часть очень субъективна. Меня не особо волнует удобочитаемость, близкая к мыслительным процессам человека. Мне все еще трудно следовать наиболее хорошо документированному коду, описывающему вещи на самом высоком уровне, если автор использует странные и запутанные мыслительные процессы для решения проблемы. Между тем краткий код, использующий имена из 2 или 3 символов, часто может быть проще для меня, если логика очень проста. Я полагаю, вы могли бы рассмотреть и посмотреть, что предпочитают другие люди.
В основном меня интересует ремонтопригодность и, что еще важнее, стабильность. Код, который не находит причин для изменения, - это код с нулевыми затратами на обслуживание.