Rambler's Top100 Service калинин.ru / комментарии / книги /  << 27.08.00 >>

C & C++: правила программирования

Еще одна книга по C и C++, о которой мне хотелось бы рассказать. Она совсем тоненькая и маленькая, всего 270 страниц. Сейчас она стоит в Библио-Глобусе 15 (!) рублей, судя по всему из-за того что выпущена в 1996 году тиражом в 11000 экземпляров. Несмотря на такую смешную цену (по отношению к другим книгам по C/C++) ее очень сложно переоценить.

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

Вообще я заметил, что каждый программист приходит, в основном, к одим и тем же выводам, т.е., можно предположить, что если человек придет, прочитает какую-нибудь книжку по C/C++ с тем, что бы ознакомиться с синтаксисом, а затем прочитает "правила программирования", то он сэкономит массу времени и нервов потому что сразу же "перепрыгнет несколько ступенек".

Это только на первый вгляд. "Правила программирования" мне посоветовали прочитать (это было несколько месяцев назад и я только сейчас удосужился это сделать) со словами "два года назад я пытался ее прочитать и ничего в ней не понял, зато недавно перечитал с громадным удовольствием". Это очень правильные слова --- потому что ценность книги поймут только те, для кого подобные правила не пустой звук.

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

Но перейду непосредственно к комментированию. Правила разделены по тематике:

  • процесс проектирования;
  • общие проблемы разработки программ;
  • форматирование и документация;
  • имена и идентификаторы;
  • общие правила программирования;
  • препроцессор;
  • правила, относящиеся к языку C;
  • правила программирования на C++.

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

Правило 6 гласит: "если вы не можете выразить что-то на повседневном языке, то вы не сможете сделать это на C/C++":

  Цитата
 

Акт записи на обычном языке описания того, что делает программа, и что делает каждая функция в программе, является критическим шагом в мыслительном процессе. Хорошо построенное, грамматически правильное предложение --- признак ясного мышления. Если вы не можете это записать, то велика вероятность того, что вы не полностью продумали задачу или метод ее решения.

Это настолько разумно, что мне нечего добавить к этому. Вообще, часть книги, которая не относится к языкам программирования C/C++, а посвящена программированию вообще, имеет свою отдельную ценность даже для тех программистов, кто не использует C/C++ в повседневной жизни.

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

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

Мне очень понравился комментарий автора к "венгерской" нотации (это та, которая используется программистами, начинавшими с использованием Windows SDK, т.е. когда в название переменной включается ее тип, например lpzstr). Автор книги совершенно прав, говоря следующее:

  Цитата
 

Венгерская запись дает многое для Ассемблера, в котором все, что вы знаете о переменной --- это ее размер. Включение информации о типе в имя переменной сразу говорит о ее использовании. В этих целях языки более высокого уровня, как C и C++, используют объявление переменных.

Доктор Саймони (автор венгерской записи) несколько раз защищал такую нотацию в своих публикациях, но я не хотел бы рекомендовать это для вас в применении к C или C++. По моему мнению, венгерская нотация не дает ничего, кроме ухудшения читаемости программ. Простые str или string значительно легче читаются и содержат ту же информацию. Если вам на самом деле нужно узнать тип, то для этого достаточно вернуться к определнию.

Честно говоря, я никогда не мог смотреть без содрогания на код в венгерской нотации. И никогда не понимал, почему это вдруг названия классов начинаются с T или C --- все лишнее только ухудшает читабельность программы. Кстати, я обычно придерживаюсь того правила, что названия классов начинается с "большой" буквы, а переменных --- с маленькой. Кроме того, несмотря на то, что относительно недавно для переменных я предпочитал что-то в духе someGoodVariable, то теперь пишу some_good_variable, потому что разделение подчеркиваниями значительно лучше читается.

Или вот такая цитата:

  Цитата
 

Тут вообще нет ничего неверного при присваивании в цикле:

        while(p = f())
            g(p);

Даже если новичок в программировании может воспользоваться символом = вместо ==. (Трудности новичков не должны приниматься во внимание, когда вы обсуждаете рекомендуемый стиль для профессионалов. Это похоже на принятие закона, который требует, чтобы все велосипеды оснащались боковыми колесиками, потому что двухлетним малышам без них тяжело кататься.)

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

Резюме

Книга будет несомненно полезна всем, кто знает C++. Т.е., даже не столько полезна, сколько интересна тем, что в ней собрана такая структура реальных правил программирования.

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


Версия для печати


  Ссылки по теме:
http://www.cs.umd.edu/users/cm
   C and C++ Style Guides.
http://corelinux.sourceforge.n
   Сайт, посвященный (в частности) формализации требований к тексту программ на C++.
  Рядом в разделе:
Ядро Linux в комментариях (02.09.00)
   Есть вещи, которые, как мне кажется, будут интересны любому программисту. В частности, это объяснение того, как устроены реально работающие программные системы....   >>>>
Java 2: руководство разработчика (22.08.00)
   Я решил, что мне нужна книга по Java тогда, когда появилось требование что-то написать на этом языке более серьезное, чем рисование...   >>>>
  Рядом по дате:
dmt.df.ru, digital mind transform (28.08.00)
   Строго говоря, это страница веб-дизайнерской конторы (коих сейчас развелось в превеликом множестве, как хороших, так и не очень), но я не...   >>>>
Дети... (26.08.00)
   Меня вот интересует, почему "взрослые" люди считают детей "глупыми"? Совсем не понимаю... недавно видел в маршрутке такую ситуацию: на задних сидениях...   >>>>
  Содержание:
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
   C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Просто так
Студенческое
Туризм
  Байки
Фотографии
Комментарии
   Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Благодарности
Форум
Хронология
 
  В этом разделе:
High Perfomance Computing, second edition. (05.07.01)
   Название книги можно перевести как "Высокопроизводительные вычисления" и эта тематика в русскоязычной литературе не освещена совсем. Традиционно считается, что самой важной...   >>>>
Плагиат (19.06.01)
   В последнее время мне стало казаться, что с моим сайтом что-то не в порядке. Вроде, текст есть, живые люди тоже иногда...   >>>>
TCP/IP Illustrated, volume I. The Protocols (22.04.01)
   И опять, книга, о которой мне хочется рассказать, насколько мне известно, отсутствует в русском переводе. Тем не менее, в разделе сетевого...   >>>>
Decline and Fall of the American Programmer (28.02.01)
   Эдвард Йордон является одним из самых известных специалистов в области создания больших программных систем. Широко известна его нотация, предназначенная для структурного...   >>>>
Unix internals: the new frontiers (03.12.00)
   Хочу сразу же предупредить, что эта книга, насколько мне известно, в переводе на русский язык не существует, поэтому прошу прощения, если...   >>>>
Операционная система Unix (31.10.00)
   Unix получил очень широкое распространение в современном компьютерном мире. При этом, даже если большая часть домашних компьютеров работает под управлением операционной...   >>>>
Язык UML, рукводство пользователя (29.09.00)
   UML (Unified Modeling Language, унифицированный язык моделирования) является еще одной популярной аббревиатурой, которой очень часто пользуются, не понимая того, что за...   >>>>
Содержание раздела полностью...
   Примерно в тоже время
dmt.df.ru, digital mind transform (28.08.00)
   Строго говоря, это страница веб-дизайнерской конторы (коих сейчас развелось в превеликом множестве, как хороших, так и не очень), но я не...   >>>>
Дети... (26.08.00)
   Меня вот интересует, почему "взрослые" люди считают детей "глупыми"? Совсем не понимаю... недавно видел в маршрутке такую ситуацию: на задних сидениях...   >>>>
Хронология полностью...
   Содержание
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
  C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Туризм
  Байки
Фотографии
Комментарии
  Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Студенческое
Просто так
Благодарности
Форум
Хронология
© 2000-2008, Andrey L. Kalinin
mailto:andrey@kalinin.ru
Rambler's Top100