За да не се налага в бъдеще, когато гледате кода си, да възникват въпроси, като:
- Какви са тези глупости, които съм писал/а?
- Какво значат нещата, които очите ми гледат в момента?
| Не толкова добро име | По-добро име | Защо? |
|---|---|---|
c |
count |
Целта на променливата (за какво се ползва тя) трябва да се знае още при първо прочитане |
prime, check, flag, proverka |
isPrime, is_prime |
Булевите променливи е добре да започват с глагол is/has/contains и т.н. |
broiQbulki, qbulki |
applesCount, apples_count |
Лоша практика е да си кръщавате променливи на родния език. Имената на променливите трябва да се разбират от всички. Представете си, че работите в екип с грузинци и видите променлива "vashlis_raodenoba". Вероятно няма да знаете какво ѝ е предназначението, освен ако не знаете грузински (вероятността, за което, е доста ниска) |
Конвенциите за имена се променят.
Практика е константите да се изписват само с главни букви и SNAKE_CASE.
| Не толкова добро име | По-добро име | Защо? |
|---|---|---|
maxGrades |
MAX_GRADES |
Първият вариант ни навява на мисълта, че maxGrades е променлива, въпреки че тя не е |
| Не толкова добро име | По-добро име | Защо? |
|---|---|---|
print() |
printArray(), print_array() |
Името на функцията е добре да бъде възможно най-конкретно, за да се знае целта ѝ |
prime() |
isPrime(), is_prime() |
Подобно на булевите променливите, булевите функции е добре да започват с глагол is/has/contains и т.н. |
f(), gosho() |
- | Тук се надявам, че е излишно да изказваме причините защо това е лошо |
// Пример за magic numbers
int grades[300];
double averageGrade = calculateAverageGrade(grades, 300);
for (int i = 0; i < 300; i++)
{
std::cout << grades[i] << " ";
}// Пример за избягване на magic numbers
constexpr size_t MAX_GRADES = 300;
int grades[MAX_GRADES];
double averageGrade = calculateAverageGrade(grades, MAX_GRADES);
for (int i = 0; i < MAX_GRADES; i++)
{
std::cout << grades[i] << " ";
}
// Така, ако решим да променим стойността на MAX_GRADES, ще трябва да я променим само на 1 място, а не на 3Всяка функция трябва да отговаря за точно 1 нещо.
// Пример за нарушение на SRP
void getAverage()
{
int number1;
int number2;
std::cin >> number1 >> number2;
double result = (number1 + number2) / 2.0;
std::cout << result << std::endl;
}Тази функция нарушава SRP, защото в нея четем от стандартния вход, смятаме някакъв резултат и принтираме на конзолата, въпреки че идеята на функцията е САМО и ЕДИНСТВЕНО да сметне средната стойност на 2 числа
// Добър пример
int readNumber()
{
int userInput;
std::cout << "Please enter a number > ";
std::cin >> userInput;
return userInput;
}
double getAverage(int x, int y)
{
return (x + y) / 2.0;
}
void printResult(double result)
{
std::cout << "The average is " << result;
}
int main()
{
int number1 = readNumber();
int number2 = readNumber();
int result = getAverage(number1, number2);
printResult(result); // Принтирането може да се направи и в main()
}Във Visual Studio комбинацията е :
Ctrl+K Ctrl+D

