Skip to content

Latest commit

 

History

History
109 lines (93 loc) · 6.13 KB

File metadata and controls

109 lines (93 loc) · 6.13 KB

Чист код

“Когато искам да прочета нещо хубаво, сядам и си го написвам” - Марк Твен

image

Защо е важно да пишем чист код?

За да не се налага в бъдеще, когато гледате кода си, да възникват въпроси, като:

  • Какви са тези глупости, които съм писал/а?
  • Какво значат нещата, които очите ми гледат в момента?

Нека погледнем няколко основни принципа на чистия код

Кръщавайте си добре променливите

Не толкова добро име По-добро име Защо?
c count Целта на променливата (за какво се ползва тя) трябва да се знае още при първо прочитане
prime, check, flag, proverka isPrime, is_prime Булевите променливи е добре да започват с глагол is/has/contains и т.н.
broiQbulki, qbulki applesCount, apples_count Лоша практика е да си кръщавате променливи на родния език. Имената на променливите трябва да се разбират от всички. Представете си, че работите в екип с грузинци и видите променлива "vashlis_raodenoba". Вероятно няма да знаете какво ѝ е предназначението, освен ако не знаете грузински (вероятността, за което, е доста ниска)

Конвенциите за имена се променят.
welsh

Кръщавайте си добре константите

Практика е константите да се изписват само с главни букви и SNAKE_CASE.

Не толкова добро име По-добро име Защо?
maxGrades MAX_GRADES Първият вариант ни навява на мисълта, че maxGrades е променлива, въпреки че тя не е

Същото важи и за функциите...

Не толкова добро име По-добро име Защо?
print() printArray(), print_array() Името на функцията е добре да бъде възможно най-конкретно, за да се знае целта ѝ
prime() isPrime(), is_prime() Подобно на булевите променливите, булевите функции е добре да започват с глагол is/has/contains и т.н.
f(), gosho() - Тук се надявам, че е излишно да изказваме причините защо това е лошо

Не ползайте magic numbers!

// Пример за 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

Single Responsibility Principle (SRP)

Всяка функция трябва да отговаря за точно 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