Код должен быть как можно более кратким и не более. :)
Замечания Беглого, кроме нескольких факторов, влияющих на то, насколько кратким (или иным образом) должно быть:
Все эти вещи в совокупности порождают набор иногда конкурирующих сил, которые могут хотеть более или менее многословия.
Балансировка - это ключ к эффективному развитию. Что важнее, полностью зависит от проблемы, которую пытается решить ваше программное обеспечение.
Прежде всего, давайте возьмем легкие биты:
Компьютеры.
Когда они читают ваш код, они вполне способны сделать это независимо от многословия. Они могут быть немного медленнее, но это то, что обычно трудно измерить (маловероятно, что вы превысите 1 или два порядка многословия, чем минимальная теоретическая возможность).
Известные исключения - это когда вы (ab) используете что-то вроде метапрограммирования через препроцессор, чтобы сделать для вас множество расширений. Это может занять long время при компиляции. Здесь вы должны решить, стоит ли этот компромисс.
Humans.
Как правило, это люди с похожим контекстом на вас, и они будут читать источник в ситуации, аналогичной той, которую вы написали. Это означает, что если функция находилась в файле / классе / модуле с именем Foo, то нет необходимости ставить Foo на передний план, аспект Foo должен быть совершенно ясен из контекста. Это облегчает изменение этого аспекта в будущем.
Программисты, знакомые с идиомами языка / стиля программирования, которые вы используете, будут вполне способны понять некоторые конструкции, которые чрезвычайно кратки.
Например, переменные индекса цикла, называемые «i», настолько кратки, насколько это возможно, но обычно они не являются проблемой, пока цикл не станет большим.
Здесь вы видите интересную дихотомию. Значение краткости часто пропорционально сложности блока кода, в котором он находится. Поскольку этот блок становится более кратким, переменные внутри него получают больше преимуществ от сокращения. Путем написания кода в функциях / классах с ограниченной ответственностью становится проще и полезнее держать вещи лаконичными, поскольку у человека меньше возможностей для путаницы. Как это ни парадоксально, это может привести к тому, что контекст должен быть более явным, а значит, более длинные имена методов и классов.
Lifespan
Срок службы и вероятность ошибок учитывают частоту, с которой вам придется либо читать код, либо отлаживать его. Многие отладчики поддерживают точки останова в нескольких точках на линии (правильно определяя, где есть два оператора), но некоторые этого не делают. Поэтому следует проявлять осторожность, если вы намерены много раз переломить точку, чтобы убедиться, что вы можете разместить и контролировать их с минимальными усилиями.
Если код имеет низкую вероятность ошибок, но длительный срок службы, у вас есть другая интересная ситуация. Вероятность того, что код станет понятным, когда вам понадобится изменить его, намного ниже (у вас будет хуже память или, возможно, ее больше не будет). Таким образом, этот код будет более кратким, чем обычно.
Производительность
Иногда вам, возможно, придется пожертвовать компактным, но четким представлением чего-либо, чтобы удовлетворить цель производительности, например, вы должны битпак, например, нехорошо читать в коде, но неизбежно, если вам нужно соответствовать определенному количеству памяти.
Такие случаи, как мы надеемся, редки.
Общие понятия
Некоторые языковые конструкции могут поощрять краткий код (автоматические свойства, анонимные внутренние классы, лямбды и многое другое). Там, где эти понятия целесообразно использовать, используйте их разумно. Идея состоит в том, что они уменьшают котельную плиту и выставляют намерение .
Если вы делаете одно и то же несколько раз и имеете определенное количество дубликатов кода, рассмотрите общую функцию / класс / модуль, но помните, что если вам нужно сделать общий код менее понятным (скажем, дополнительный оператор if или неиспользуемые переменные в одном из пути к коду) тогда у вас может не быть чистого выигрыша.
Вывод типа является мощным, но помните, что компилятор иногда намного лучше, чем человек. Если вы говорите flibble x = new flibble()
, то var x = new flibble()
вовсе не растягивается (и становится лучше по мере того, как flibble становится больше). Сравните с var flibble = SomeMethodWhoseReturnTypeIsNotClear()
. Здесь помогает здравый смысл, если вам никогда не придется использовать intellisense для его решения, вам, безусловно, следует рассмотреть возможность его использования.
Некоторые другие полезные (и краткие) эмпирические правила:
- Несколько действий в одной строке часто сбивают людей с толку.
- Побочные эффекты часто смущают людей (например, ++ x или x ++ вообще не имеют значения, если не являются частью более широкого выражения)
- Отступ помогает большинству людей вывести структуру гораздо больше, чем скобки
- Правила приоритета часто «усваиваются» людьми, а не запоминаются как набор правил. Это означает, что ненужные (для компилятора) брекетинг может быть вреден для читабельности, где идиома распространена, но полезна, когда использование не так распространено.
- Логически не часто это один символ. При использовании этого в операторе if подумайте, можно ли его реструктурировать, чтобы он не требовался. Это может быть невозможно (если результирующие искажения имени переменной / метода или порядка кода перевешивают удаление, оставьте его в этом)