19 март 2016 г.

CODE TIPS #4 - Именуване на идентификатори (aka "Спрете с 'br' и подобни")

Всеки знае, че има значение как именуваме променливите си когато пишем код. Едно просто правило - кодът трябва да е лесно четим и разбираем, защото в реалността големите проекти се разработват от екипи хора и шансът да сме единствените "свидетели" на гениалния си код е минимален. Всеки знае това... нали?

Чудех се как точно да демонстрирам някои лоши практики в именуването на идентификатори (именуване на променливи, класове, функции).  И ето че открих чудесен пример - една програма, която беше пример от учебник, който целеше да ми покаже основите на обектно-ориентираното програмиране. Страшното беше, че дори и в неграмотно състояние виждах, че това е просто бъркотия!


Просто гледайте.

  1. #include <iostream>
  2. using namespace std;
  3. class Student {
  4. public:
  5.     char Ime[11];
  6.     short Ocenki[10];
  7.     float Uspeh;
  8.     void SrUspeh();
  9.     // ...
  10. };
  11. void Student::SrUspeh()
  12. {
  13.     float s = 0;
  14.     for (int i = 0; i<10; i++) s += Ocenki[i];
  15.     Uspeh = s / 10;
  16. }
  17. class newStud {
  18.     // ...
  19. };
  20. void main()
  21. {
  22.     char KodOp; int BrLica = 0; Student Grupa[10]; newStud newGrupa[10];
  23.     do {
  24.         cin >> KodOp;
  25.         // ...
  26.     } while (KodOp != '0');
  27. }

Нека игнорираме:
- използването на именното пространство std
public нивото на достъп на член-данните
- използването на char масив вместо std::string
постинкрементацията на брояча във for цикъла
- декларирането на променливи от различен тип на 1 ред
- факта, че main() е от тип void, а не int, както е по конвенция

Нека забравим всичко и това и се съсредоточим само върху имената на идентификаторите.

Бих казал, че единствено името на класа Student си е OK, но това, предполагам, е абсолютна случайност.

1. Не използвайте български имена!


BAD
  1. char Ime[11];
  2. short Ocenki[10];
  3. float Uspeh;

GOOD
  1. char name[11];
  2. short grades[10];
  3. float average;

Ако бяхте от друга страна и не знаехте български език - каква щеше да е реакцията ви когато ви сервират първия вариант? Просто използвайте имена на английски. Английският е единственият универсален език в света на програмирането.

2. Не съкращавайте имената!


BAD
  1. char KodOp; 
  2. void SrUspeh();
  3. int BrLica = 0;
  4. float s = 0;

GOOD
  1. char operationCode; 
  2. void getAverage();
  3. int numberOfStudents = 0;
  4. float sum = 0;

Няма нужда от съкращения в повечето случаи. По-ценно е кодът да е лесно разбираем, отколкото да е кратък. Постоянно виждам в примери променливи с имена по една буква. Понякога това е допустимо - ако искаме да илюстрираме някаква концепция от програмирането или пък да приложим някаква математическа формула, но в повечето случаи няма нужда от това. 

Също така бих казал че изключение могат да направят например променливите за брояч във for цикъл, които имат малък обхват и няма да затруднят съществено четимостта на кода, тъй като съществуват единствено в цикъла.

3. Спазвайте конвенциите и бъдете постоянни!


Първоначално мислех да напиша за това, че обикновено класовете започват с главна буква, но проблемът се свежда до нещо по-общо - просто спазвайте конвенциите на езика, с който програмирате!

За всеки език е различно и задължение на програмиста да се информира за конкретните конвенции.

Още по-важно - бъдете постоянни. Ако ще пишете camelCase имена на променливи - добре, но се опитвайте да използвате този стил за всички променливи.

---

Това май са най-важните правила, които научих до този момент относно именуването... а сега отивам да бомбардирам всеки, който все още декларира променлива с име "br".

Няма коментари:

Публикуване на коментар