Главная   Новости   Поиск   
Азбука программиста




Яндекс.Метрика

Стиль программирования C/C++

Стиль программирования C/C++

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

Язык

Здесь нужно придерживаться английского языка в именовании идентификаторов. Нередко попадаются куски кода примерно такового вида:

void main( void)
  {
    int stipendiya, eda, na_devchonok;
    ...
    na_devchek= stipendiya- eda;
    printf( "%d", na_devchek);
  }
  

Eсли на этот исходник поглядит какой-либо Билл Гейтс (который желает взять вас на работу), то он ничего не усвоит потому что русским языком, наверняка, не знаком. А вдруг вам придется читать китайский код или исходники в немецком и итальянском исполнении? Во вторых - английский язык довольно ёмкий, сравните на сколько стало короче:

void main( void)
  {
    int pay, food, for_girls;
    ...
    for_girls= pay- food;
    printf( "%d", for_girls);
  }
  

Для того что бы использовать англоязычные идентификаторы, сам язык знать не надо (хотя для разработчика очень полезно), для этого довольно лексикона из 400-500 более употребимых слов.

Сокращения. Быть или не быть

Как аркадные флеш игры с http://www.igroflash.ru/arkady

Допустим у вас есть переменная либо функция значащая "Убрать из строчки все пробелы", программер, именующий идентификаторы в стиле операционных систем Unix записал бы ее заглавие так "strsptr" либо даже "strst". Другими словами все было бы очень коротко и в нижнем регистре. Да, я тоже читал про то что когда-то терминалы воспринимали данные со скоростью 10 знаков за секунду и хитрые программеры специально записывали все как можно короче. Полностью может быть что эта привычка осталась к тому же поэтому, что некие программеры писали свои 1-ые программки на Бейсике, в старенькых версиях которого для имени переменной разрешалось использовать только один либо два знака.

При таком подходе у начальных текстов ПО имеется один большой недочет. Если в тексте нет комментариев (а это быстрее правило чем исключение), то через полгода просматривая исходник вы будете длительно вспоминать, чего бы это значило - "if( !strst( mystr)) printf...". На мой взор, не надо лениться набивать "излишние" буковки. Короткое заглавие идентификатора уместно использовать только для именования индексных переменных в теле цикла либо в качестве локальной переменной маленький процедуры. К примеру:

for( int n= 0; n

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

for( int nLineNo= 0; nLineNo

Можно называть идентификаторы и по другому. Допустим у вас все есть та же функция "Убрать из строчки все пробелы", заглавие может смотреться приблизительно так "StrRemoveSpaces". В связи с таким подходом программка становится самодокументируемой и в данном случае можно уже вправду обойтись без комментариев. Хотя увлекаться самодокументированием тоже не следует, по другому если эта функция именуется "RemoveAllSpacesFromThisString", то читать ее уже тоже проблемно. Кстати, вот вам некое из WinAPI: FindClosePrinterChangeNotification, SystemTimeToTzSpecificLocalTime, INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY - песня какая-то, а не константа.

Префиксы


У вас есть переменная имеющая тип DWORD, переменная в данном случае записывается к примеру, так dwMyVar, другими словами заглавие переменной начинается с неких (либо всех) букв взятых из наименования ее типа. Так же время от времени принято называть глобальные переменные с префиксом g_... (g_dwMyVar). Переменные-члены класса в MFC начинаются с m_... (m_dwMyVar), а далекий указатель на строчку которая завершается нуль-терминатором (LPSTR в WinAPI) так - lpsz... (lpszMyVar - Long Pointer String Zero).

Имеется огромное количество таблиц префиксов переменных. Часто программисты составляют свою, и удачно ею пользуются. Хотя без тупиков в данном деле не обходится, это касается составных типов данных. Я к примеру поначалу для каждого класса (это было с Delphi VCL) разработчики выдумали собственный префикс, таблица вышла большой. Равномерно эта таблица разрослась до внушительных размеров и, уже перейдя на Visual C++, решили что объекты будут иметь префикс "o" (CMyObj -> oMyObj), а структуры вообще его не будут иметь (SYSTEMTIME -> SystemTime), хотя это и не является безупречным решением.

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

Внедрение сокращений


Не стоит увлекаться внедрением сокращений и аббревиатур в именовании идентификаторов, исключением могут быть только "принятые" сокращения, к примеру: str -> string, src -> source, tbl -> table и т.д., потому что если написать заместо server - srv, может либо получиться неурядица (может быть это значит - service), либо ваш коллега этого сокращения вообщем не усвоит.

Внедрение разделителей


Некие программеры употребляют в качестве разделителей слов в идентификаторах знак подчерка "_", имя нашей функции вышло бы таким - "str_remove_spaces". Некие вообщем не употребляют разделителей ("strremovespaces" - читать проблемно). Более упрямые употребляют таковой стиль именования - "Str_Remove_Spaces". Другие употребляют в качестве разделителей большие буковкы - "strRemoveSpaces" либо "StrRemoveSpaces". Наверное стоит придерживаться последнего варианта, т.к. "экономится" одна буковка на слово и читать при всем этом полностью комфортно.

Именование в составе класса


Допустим вы написали класс с именованием "CFile", выполняющий некие операции с файлом. Сверхизбыточно именовать способы этого класса так: CFile::FileOpen() либо CFile::FileClose(), ведь и так понятно, что класс работает с файлом. Tак и короче и логичней: CFile::Open(), CFile::Close().

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




Безопасность

В этой статье приводятся методы борьбы с вирусами. Опишем типовую ситуацию, которая знакома многим пользователям ПК: установлен новый антивирус, раз в день обновляются базы, все подозрительные файлы сразу удаляются. В один ясный, солнечный день вы приходите к другу и чтобы показать новые фотки, подключаете свою флешку к его компу. Но антивирус начинает вам говорить, сколько вирусов он отыскал на вашей флешке...

Читать далее