Глава 1. Избор на имена

Съдържание

Локални променливи
Функции и методи
Поправяне на грешки
Класове

Имената служат, за да означаваме с тях различни неща. От тях не зависи по никакъв начин дали ще компилираме добра или лоша програма — компилаторът въобще не се интересува как точно сме нарекли дадена променлива или функция, или метод. Струва ли си тогава да им обръщаме прекалено голямо внимание? Дали не е по-добре вместо да мислим какво име да дадем на дадена променлива, да я наречем с първото нещо, което ни дойде наум, и след това да свършим нещо по-полезно?

Поне на теория за повечето програмисти отговорът на този въпрос е ясен: добрите имена са важни за четливостта на програмата. Практиката обаче показва, че твърде често имената в програмите са неразбираеми. В крайна сметка името на една функция се състои само от 1–2 думи, което е далеч по-малко от дължината на тялото на функцията. Забравяме, че това име после може би ще бъде използвано многократно, а писаното в тялото скоро ще забравим. Лошо написаното, но работещо тяло много по-рядко ще ни създава проблеми отколкото едно лошо избрано име.

В това разминаване между намеренията и практиката няма нищо странно. Умението да се избират добри имена е съвсем различно от умението да се кодира даден алгоритъм добре; едното изисква добро владеене на компютърния език, а другото на нашия собствен… Понякога това умение се придобива след дългогодишен опит. А има и отлични във всичко останало програмисти, които обаче никога не съумяват да се научат да дават добри имена. В някои големи колективи пък понякога се случва обратното — има специалисти, които се подбират добри имена в интерфейсите на библиотеките, а реално почти не програмират.

Локални променливи

Практиката показва голямо разнообразие при изборът на имена за локалните променливи. Така например срещаме:

  • еднобуквени променливи — a, i, x1, y1;

  • думи или комбинации от думи — buffer, length, buffer_length, BufferLength;

  • съкращения с началата на думите — buf, len, buflen, BufLen;

  • съкращения само от съгласни — bfr, lth.

Кой от тези подходи е правилен?

Не можем да преувеличаваме твърде много важността на избора на добри имена на локалните променливи. Все пак обикновено те се използват само в рамките на 20–30 реда програмен код. Понякога е по-лесно да отгатнем предназначението на дадена променлива гледайки как тя се използва, отколкото мъчейки се да „разгадаем“ сложното й название. Лунус Торвалдс (авторът на Линукс) в [TorCS] пише:

C is a Spartan language, and so should your naming be. Unlike Modula-2 and Pascal programmers, C programmers do not use cute names like ThisVariableIsATemporaryCounter. A C programmer would call that variable tmp, which is much easier to write, and not the least more difficult to understand.

Казаното дотук съвсем не означава, че може да именоваме локалните променливи съвсем произволно. При запознаване с непознат код загадъчни имена като abq и cvr дразнят, защото човек се опитва да отгатне какво е имал предвид авторът на едно такова „мистериозно“ име. Затова добре е имената да бъдат или думи, или ясно разбираеми съкращения на думи, или просто еднобуквени (напр. a, i, x1, y1).

Добре е да имаме предвид още и следното. Понякога някои знаци визуално доста си приличат и може по погрешка да се объркат. До голяма степен това зависи от използвания шрифт. Дори и шрифтът, който използваме да ни предпазва от повечето такива грешки, не можем да бъдем сигурни, че това ще бъде така и в бъдеще, нито че всеки, който чете кода, написан от нас, ще притежава добър шрифт. Затова за да се избегнат грешки, които компилаторът не може да открие автоматично, е препоръчително да не се използват едновременно две различни имена, когато разликата по между им се състои само в някои различни, но визуално приличащи си знаци. Такива приличащи си (понякога) знаци са: a-o, l-I-1-J-j-i-f-t, O-D-Q-0, S-s-5, b-6, g-q-9, B-8, C-G, H-N, P-p, U-V-Y и K-k [1].



[1] При използване на шрифт, отличаващ добре посочените тук знаци, очите се уморяват повече. Димитър Жеков, автор на шрифта Terminus, пише: “In order to be easy for reading the font has to meet two contradictory requirements: (1) the glyphs have to be different enough in order to be recognisable without efforts and (2) the glyphs have to be similar enough in order not to stop the look over any of them.