Стиль програмування на C / C + +, Різне, Програмування, статті

Напевно скільки людей, стільки і стилів написання исходников. Я багато читав на цю тему, але, як і слід було очікувати, нічого універсального не знайшов.

Стиль, на мій погляд, ключ до красивих, добре налагодженим програмам. Адже якщо програміст суворо дотримується якогось стилю, значить і “бачить” свою програму краще і помилок робить менше, і супровід цієї програми не перетворюється на кошмар.

Є думка, що не потрібно захоплюватися виробленням власного стилю, що на це йде багато часу. Але, панове, якщо не займатися цим з самого початку, то поступово розгільдяйське ставлення до свого вихідного тексту увійде в звичку, позбутися якої згодом буде дуже складно.

Мова



Можливо цей пункт здасться дивним, але я вирішив його вкласти так як він стосується саме використання англійської мови в іменуванні ідентифікаторів.

Мені часто трапляються фрагменти коду приблизно такого вигляду:

  void main( void)
{
int stipendiya, eda, na_devchonok;

na_devchonok= stipendiya- eda;
printf( “%d”, na_devchonok);
}

Eсли на цей исходник подивиться небудь Білл Гейтс (який хоче взяти вас на роботу), то він нічого не зрозуміє так як російської мови не знає. До речі, мені траплялися исходники німецькою та італійською. По друге – англійська мова досить ємний, порівняйте на скільки стало коротше:

  void main( void)
{
int pay, food, for_girls;

for_girls= pay- food;
printf( “%d”, for_girls);
}

Всупереч поширеній думці, для того що б використовувати англомовні ідентифікатори, англійської мови знати не потрібно (хоча для програміста дуже бажано), для цього достатньо лексикону з 400-500 найбільш вживаних слів.


Розмір


Допустимо у вас є змінна або функція означає “Прибрати з рядка всі прогалини”, програміст, що іменує ідентифікатори в стилі операційних систем Unix записав би її назва так “strsptr” або навіть “Strst”. Тобто все було б максимально стисло і в нижньому регістрі. Так, я теж читав про те що колись термінали брали дані зі швидкістю 10 символів в секунду і хитрі програмісти спеціально записували все якомога коротше. Цілком можливо що ця звичка залишилася ще й тому, що деякі програмісти писали свої перші програми на Бейсіку, в старих версіях якого для імені змінної дозволялося використовувати тільки один або два символи.

При такому підході у вихідних текстів програми є один великий недолік. Якщо в тексті немає коментарів (а це швидше правило ніж виняток), то через півроку переглядаючи исходник ви будете довго згадувати, чого б це значило – “if (! strst (mystr)) printf …”. На мій погляд, не потрібно лінуватися набивати “зайві” букви. Коротка назва ідентифікатора доречно використовувати тільки для іменування індексних змінних в тілі циклу або як локальної змінної невеликий процедури. Наприклад:

  for( int n= 0; n< nCount; n++)
{
printf( “%d
“, n);
}

Хоча і в цьому прикладі якщо використовувати замість n, що-небудь більш осмислене, то ви потім самі собі (або той хто буде користуватися вашим ісходником) скажете спасибі. Наприклад:

  for( int nLineNo= 0; nLineNo< nLineCount; nLineNo++)
{
printf( “%d
“, 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 років виробляли свій стиль і тепер потрібно переходити на загальнокорпоративні – вам потрібно буде ще дуже довго плювати на свої пальці і терпіти докори начальника.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*