Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

I hate all this code style formatting (braces layout)

Ненавижу придерживаться глупых правил.

Одно из важнейших качеств "хорошего" кода - "хорошее" форматирование. Компилятор способен прочесть любую корректную программу, не важно какой кашей (точнее, кем) она написана. С людьми дело обстоит иначе. Способность быстро понимать чужой код особенно важна, когда над проэктом работают десятки и более разработчиков, находящихся териториально далеко друг от друга. Хорошее Форматирование позволяет единообразно и точно показывать логическую структуру кода, визуально разбивать код на удобные для понимания человеком абстракции.

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

Цели хорошего форматирования

  • Точно представлять логическую структуру кода
  • Единообразно показывать логическую структуру кода
  • Улучшать читабельность
  • Упрощать модификацию кода

Основное влияние на стиль форматирования имеет семантика языка программирования. Например, в языке Python с форматированием особо не повоюешь - язык его строго определяет сам. Блоки кода и подчинение блоков определяются исключительно отступами, т.е. форматированием:

if (x == 0):
SomeOperator
SomeOperator
SomeOperator

Здесь if (x == 0): является единственной частью управляющей структуры, а подчиненные операторы должны иметь положительный от ее начала отступ.

Управляющие структуры могут иметь вид:

  1. Явных блоков (Visual Basic, ADA, PL/SQL, ...)

    if (x == 0) [then]<--then может быть опущен
    SomeOperator
    SomeOperator
    SomeOperator
    end if;

  2. Эмуляций явных блоков (C++, Java, C#, ...)

    if (x == 0) {<-- начало блока является частью управляющей конструкции
    SomeOperator
    SomeOperator
    SomeOperator
    }<-- конец блока говорит об окончании управляющей конструкции и является эквивалентом end if;

  3. Управляющая конструкция, за которой следует блок с границами ( begin - end или { - })

    if (x == 0)
    {<-- начало блока не является частью управляющей конструкции
    SomeOperator
    SomeOperator
    SomeOperator
    }<-- конец блока

  4. Отформатированных блоков, когда пробельный символ является конструкцией языка (Python)

    if (x == 0):
    SomeOperator
    SomeOperator
    SomeOperator

Из всех вариантов хуже всего смотрится вариант 3 (а в HTML - намного хуже :), причем некоторые энтузиасты умудряются делать его еще уродливей:

if (x == 0)
{<-- начало блока не является частью управляющей конструкции и визуально ей не подчиняется
SomeOperator<-- Этот блок на самом деле не подчиняется {, хотя визуально выглядит иначе
SomeOperator
SomeOperator
}<-- конец блока на уровне управляющей конструкции

Или:

if (x == 0)
{<-- начало блока не является частью управляющей конструкции
SomeOperator
SomeOperator
SomeOperator<-- Этот блок на самом деле не подчиняется {, хотя визуально выглядит иначе
}<-- конец блока

Поубивал бы.

Продолжение следует...

0 коммент.:

Отправить комментарий

Copyright 2007-2011 Chabster