Форум программистов, компьютерный форум, киберфорум
Наши страницы
Тамика
Войти
Регистрация
Восстановить пароль
Рейтинг: 4.00. Голосов: 1.

Учимся именовать переменные.:)

Запись от Тамика размещена 26.06.2014 в 13:49
Обновил(-а) Тамика 01.07.2014 в 10:42

И снова доброе утро, дорогие форумачне!

И снова я хочу выплеснуть накопившиеся мысли. Опять же - статья для начинающих программистов. Поговорим сегодня о немаловажной вещи - именование переменных, функций, классов.
Многие начинающие программисты упускают этот момент ввиду малой сложности программы, в которой и так сложно потеряться. Однако, стоит им написать программу покрупнее - сразу путанина. Любая ошибка приводит в многочасовому исследованию собственного кода. А ведь выгоднее было бы его потратить на что-то более полезное.
Потому, дабы избежать таких ситуаций, я и решила рассказать о важности корректного именования переменных.
Я написала "корректного", а не правильного, потому как не существует такого понятия как "правильное именование переменных". Каждый программист, каждый проект имеет свой стиль. Тут уж дело вкуса. Однако, если уж вы выбрали определенный стиль, то следует придерживаться его на протяжении всей разработки кода/программы/проекта.

Приступим к первому совету.
Называйте функцию/переменную/структуру/класс так, чтобы было понятно что он/она выполняет, какую роль играет и за что отвечает. Не называйте функцию вычисления суммы -vuchislsum()или podchetsum(). Как минимум, в С/С++ мы программируем используя латинские символы, потому называть объекты русскими словами, используя латинницу, крайне некомфортно для глаза. Знание английского - неотъемлемая часть требований к программисту. Потому не должно составлять труда назвать объект англоязычными словами. Например, то же вычисление суммы - calculate_sum() или calculateSum().
Вот представьте, что Ваш друг попросил помочь с кодом и скнинули ЭТО... В нём есть функция - preobraz(). Вы, человек, абсолютно не знающий, что эта программа должна делать, какие тут функции, какая логика работы. Вы поймёте, что делает эта функция? Что-то преобразовует... Что? Куда? И как?.. А не проще ли понять такую функцию:
C++
1
decimal_to_hex()
Несложно догадаться, что эта функция преобразовует число из десятичной системы в шестнадцатиричную. Можно совсем поизваращться, конечно, и указать в имени функции выходной параметр или входной. Например:
C++
1
int_decimal_to_hex()
или
C++
1
float_decimal_to_hex()
.
Потому еще раз подчеркиваю - называйте функцию так, чтобы любому человеку было понятно, что она делает, зачем и почему. Упростите жизнь и себе, и другим.

Теперь, что касается переменных, аргументов, параметров.(сразу подмечу - это всё ИМХО)
Переменная - это область памяти, которая хранит определённые данные, которой вы даёте имя. Зачем? Для того, чтбы не обращаться к ячейкам непосредственно по ее адресу. Не совсем удобно писать:
0x5678f54.
Проще написать - input_data.
И понятнее, и работать легче.
Однако, начинающие программисты порой так называют переменные, что проще к ним обращаться по адресу. Опять же - называйте ее соответственно с целью её применения.
Например, есть у нас такая программка, где даны время и скорость. Нужно вычислить расстояние. И попробуем назвать переменные:
C++
1
2
float a = 10.0;
float b = 45.5;
Сразу все догадались где тут скорость, а где время? Или усугубим:
C++
1
float c = a*b;
Все догадались, что речь идёт о расстоянии?..
А если так:
C++
1
2
3
float time_s = 10.0;
float velocity = 45.5;
float distance = time_s*velocity;
Да уж Тесла с вами, сократим имена переменных до максимума! Получим:
C++
1
2
3
float t = 10.0;
float v = 45.4;
float s = t*v;
И то понятнее о чём речь идёт!

Это не намного медленнее, чем называть их a и b. Но! Когда возникнет какая-то ошибка, проще будет понять, что это за переменные! К тому же, во многих современных средах разработки уже давно реализована автоподстановка имени. Стоит вам ввести пару первых символов имени, как вам будет предложены имена с соответствующим началом. Подчеркну - речь идёт о больших программах. Если у вас программа, где нужно просуммировать только два числа и всё, то проблема с путаницей вряд ли возникнет.
(НО описанное выше не применяется к переменным-счётчикам.)
Константные переменные чаще пишут прописным буквами.
Например:
C++
1
const float PI = 3.14;
Если вы передаете переменную в функцию, что делать в таком случае?
Опять же ИМХО.
Рассмотрим класс, например, которому передаем два интовых значения. Он их хранит и может показывать нам, так же мы можем сами изменять их значения.
Рассмотрим начало.
C++
1
2
3
4
5
6
class PairNumbers
{
private:
    int mFirstNumber;
    int mSecondNumber; 
};
Далеко не отходя, пару слов об именовании членов класса. Мое предложение таково - префикс m, что означает - member, то есть - член класса. Чтобы в любой функции вы увидели переменную и сразу поняли - это не просто переменная, это же член класса!
mFirstNumber -> member of class - FirstNumber.
Далее, напишем еще сеттеры и геттеры, с помощью которых мы сможем получать или изменять данные, не выводя сами переменные из сумрака области приватности. А так же констурктор, который принимает два числа и запоминает их.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class PairNumbers
{
private:
    int mFirstNumber;
    int mSecondNumber;
public:
    PairNumbers(int aFirstNumber, int aSecondNumber)
    {
        mFirstNumber = aFirstNumber;
        mSecondNumber = aSecondNumber;
    }
    void setFirstNumber(int aFirstNumber)
    {
        mFirstNumber = aFirstNumber;
    }
    void setSecondNumber(int aSecondNumber)
    {
        mSecondNumber = aSecondNumber;
    }    
};
Что мы видим? Функция принимает параметр - число. aFirstNumber в данном случае зовётся аргументом функции. Потому я добавляю префикс a, что значит - argument.
И теперь, смотря на тело функции, легко понять, что тут происходит. Мы члену класса(mFirstNumber) присваиваем значение аргумента(aFirstNumber).
Так же вы с лёгкостью поймете, что происходит в теле следующей функции:
C++
1
2
3
4
int getFirstNumber()
{
    return mFirstNumber;
}
Также напишем ещё одну функцию. И думаю по одному названию станет понятно, что она делает.
C++
1
2
3
4
void showNumbers()
{
    std::cout << "First number is " << mFirstNumber << ". Second number is " << mSecondNumber << "."; 
}
Теперь немного о самих стилях. На ваш вкус есть "три" договорённых стиля:
1) Си-стиль или C++STL/Boost.
Слова отделяются друг от друга нижним подчеркиванием.
В таком случае наш класс имел бы другие немного имена:
C++
1
2
3
4
5
6
class pair_numbers
{
    int first_number_;
    int second_number_;
    // ... 
}
Но в данном стиле префиксы уже не используются. А переменные-члены обозначаются в конце еще одним нижним подчеркиванием.
2) camelCase.
Первое слово начинается со строчной буквы, затем каждая первая буква последующих слов прописная. Чаще всего используется для имен структур и классов.
3) Очень схожий со стилем 2) - CamelCase. Все так же, как и предыдущем стиле, с той лишь разницей, что первая буква не строчная, а прописная. Чаще используется для имен функций и переменных.

Как вы заметили, я чаще всего использовала стиль camelCase.
Моё ИМХО таково, что CamelCase - удобен для имён классов. camelCase - для имён методов и членов класса, переменных. А вот Си-стиль - для "бесхозных" функций.
То бишь. На выходе получаем следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
 
class PairNumbers
{
private:
    int mFirstNumber;
    int mSecondNumber;
 
public:
    PairNumbers(int aFirstNumber, int aSecondNumber)
    {
        mFirstNumber = aFirstNumber;
        mSecondNumber = aSecondNumber;
    }
    void setFirstNumber(int aFirstNumber)
    {
        mFirstNumber = aFirstNumber;
    }
    void setSecondNumber(int aSecondNumber)
    {
        mSecondNumber = aSecondNumber;
    }
    int getFirstNumber()
    {
        return mFirstNumber;
    }
    int getSecondNumber()
    {
        return mSecondNumber;
    }
    void showNumbers()
    {
        std::cout << "First number is " << mFirstNumber << ". Second number is " << mSecondNumber << ".";
    }
 
};
 
int calculate_sum(PairNumbers *pair)
{
    return pair->getFirstNumber() + pair->getSecondNumber();
}
 
void show_result_of_sum(int sum)
{
    std::cout << "\nResult of sum is " << sum << ".";
}
 
int main()
{   
    PairNumbers *pair = new PairNumbers(10, 10);
    pair->showNumbers();
    show_result_of_sum(calculate_sum(pair));
    system("pause>>null");
    return 0;
}
Повторюсь. Данная статья - реккомендации к именованию переменных. НЕ указания.

Благодарность за идею - господин Хедин.
Размещено в Без категории
Просмотров 1718 Комментарии 25
Всего комментариев 25
Комментарии
  1. Старый комментарий
    Аватар для SatanaXIII

    Не по теме:

    Цитата:
    Да уж Тесла с вами
    Новый бог, простите?



    Цитата:
    Константные переменные чаще пишут прописным буквами
    Например:
    Код C++
    1
    
    const float PI = 3.14;
    Прописные это по моему которые от руки пишут. Заглавные имелось в виду?
    Опять же это дань макросам: когда-то, чтобы не путать имя переменой с константой (собственно с макросом. Не было еще модификатора const) ввели негласное правило писать их имена большими буквами.

    Цитата:
    Так же вы с лёгкостью поймете, что происходит в теле следующей функции:
    Код C++
    1
    
    int getFirstNumber() const
    К разговору про константы.

    Цитата:
    Потому я добавляю префикс a
    Цитата:
    CamelCase
    И ни слова про паскалевское наследие.


    P.S. Про стили как-то совсем поверхностно. Вообще чтобы осветить энто дело нужно отводить пятитомник о шестиста страниц каждый.
    К примеру, не освещены любимый стиль святого Джона Кармака:
    Код C++
    1
    
    typedef int fileHandle_t;
    венгерская нотация:
    Код C++
    1
    
    bool bFlag;
    позабытое всеми соглашение 8.3...
    Запись от SatanaXIII размещена 26.06.2014 в 14:36 SatanaXIII вне форума
  2. Старый комментарий
    Это ведь статья не о стилях именования. В кратце привела парочку из них. Да и давненько не видела нигде использование Венгерской нотации в плюсах.
    Соглашение 8.3 - это не там, случайно, где все заглавные и нижнее подчёркивание?..
    Цитата:
    Новый бог, простите?
    У меня он таков.

    Цитата:
    Прописные это по моему которые от руки пишут. Заглавные имелось в виду?
    Да, очепяталась. Спасибо.
    Запись от Тамика размещена 26.06.2014 в 14:47 Тамика вне форума
  3. Старый комментарий
    Цитата:
    позабытое всеми соглашение 8.3...
    А, всё. Прочитала.
    Запись от Тамика размещена 26.06.2014 в 14:51 Тамика вне форума
  4. Старый комментарий
    Аватар для SatanaXIII
    del
    Запись от SatanaXIII размещена 26.06.2014 в 14:52 SatanaXIII вне форума
  5. Старый комментарий
    Аватар для tezaurismosis
    Спасибо за статью, буду показывать её нерадивым studentam_dlay_obucheniya
    Именование переменных транслитом - это величайшее зло, которое развивается отвратительным учебником Павловской.
    Ещё одно зло - это переменные в один-два символа, такое я очень часто вижу в программах на студенческих языках - Pascal и Basic. И в них и в других языках эта практика должна быть истреблена.
    По этим пунктам с вами полностью согласен.

    Цитата:
    любимый стиль святого Джона Кармака
    Это давать простым именам типов по 20 разных сложных названий (это не сарказм, просто впервые слышу про это).
    Если так, то этот стиль превратил заголовки для компилятора от Microsoft в непролазные дебри.
    Хотя... Всё хорошо в меру.

    И моё мнение о префиксах - в эпоху IDE они почти бесполезны, подсказку о расположении/типе может дать среда.
    Запись от tezaurismosis размещена 26.06.2014 в 15:59 tezaurismosis вне форума
  6. Старый комментарий
    Цитата:
    Спасибо за статью, буду показывать её нерадивым studentam_dlay_obucheniya

    Цитата:
    Именование переменных транслитом - это величайшее зло, которое развивается отвратительным учебником Павловской.
    Категорически согласна... Нужно бороться со злом! *воинсвтенно поднимает меч*
    Запись от Тамика размещена 26.06.2014 в 16:02 Тамика вне форума
  7. Старый комментарий
    Аватар для Gelo123321
    Отличная статья! Посоветую ее прочитать моему одногруппнику, который постоянно пишет имена функций на транслите -_-

    Нашел опечаку: Моё ИМХО таково, что CamelCase - для удобен для имён классов.
    Запись от Gelo123321 размещена 27.06.2014 в 01:27 Gelo123321 вне форума
  8. Старый комментарий
    Цитата:
    Нашел опечаку: Моё ИМХО таково, что CamelCase - для удобен для имён классов.
    Огромное спасибо!

    Цитата:
    Отличная статья! Посоветую ее прочитать моему одногруппнику, который постоянно пишет имена функций на транслите -_-
    Надеюсь, что статья его излечит.
    Запись от Тамика размещена 27.06.2014 в 09:23 Тамика вне форума
  9. Старый комментарий
    Аватар для Хедин
    Ай да Таня почитал, очень очень понравилось
    Запись от Хедин размещена 28.06.2014 в 11:37 Хедин вне форума
  10. Старый комментарий
    Аватар для ranebull
    Нашел опечатку.
    Далеко не отходя, пару слов об именовании членов класса. Мое предложение таково - префикс m, что означает - member, то есть - член класса. Чтобы в любой функции вы увидели переменну и сразу поняли - это не просто переменна, это же член класса!
    mFirstNumber -> memeber of class - FirstNumber.
    Спасибо за статью.
    Запись от ranebull размещена 29.06.2014 в 09:25 ranebull вне форума
  11. Старый комментарий
    Аватар для HighPredator
    Безусловно идея написать подобное замечательна и достойна похвал. Скажите, насколько вам интересны дополнения/критика к сему?
    Запись от HighPredator размещена 01.07.2014 в 10:38 HighPredator вне форума
  12. Старый комментарий
    Цитата:
    Сообщение от HighPredator Просмотреть комментарий
    Безусловно идея написать подобное замечательна и достойна похвал. Скажите, насколько вам интересны дополнения/критика к сему?
    Весьма интересно. Слушаю.
    Запись от Тамика размещена 01.07.2014 в 10:41 Тамика вне форума
  13. Старый комментарий
    Цитата:
    Сообщение от ranebull Просмотреть комментарий
    Нашел опечатку.
    Далеко не отходя, пару слов об именовании членов класса. Мое предложение таково - префикс m, что означает - member, то есть - член класса. Чтобы в любой функции вы увидели переменну и сразу поняли - это не просто переменна, это же член класса!
    mFirstNumber -> memeber of class - FirstNumber.
    Спасибо за статью.
    Благодарю за поправку.
    Запись от Тамика размещена 01.07.2014 в 10:42 Тамика вне форума
  14. Старый комментарий
    Аватар для HighPredator
    Цитата:
    Весьма интересно. Слушаю.
    Ок. Как будет время - напишу.
    Запись от HighPredator размещена 01.07.2014 в 10:50 HighPredator вне форума
  15. Старый комментарий
    Аватар для Vourhey
    Цитата:
    Сообщение от ranebull Просмотреть комментарий
    Нашел опечатку.
    Далеко не отходя, пару слов об именовании членов класса. Мое предложение таково - префикс m, что означает - member, то есть - член класса. Чтобы в любой функции вы увидели переменну и сразу поняли - это не просто переменна, это же член класса!
    mFirstNumber -> memeber of class - FirstNumber.
    Спасибо за статью.
    В любой функции я сразу увижу член класса, потому что обращение к нему будет через . или ->. Если идет обращение без них, то мы находимся в реализации функции-члена класса, что видно по класс::имя.
    То есть, ты только что написал сам:
    mFirstNumber -> memeber of class
    По -> только не знакомому с с++ не понятно, где член класса.
    Имхо, любые префиксы в именах уже давно пора отбрасывать.
    Запись от Vourhey размещена 01.07.2014 в 10:52 Vourhey вне форума
    Обновил(-а) Vourhey 01.07.2014 в 10:54
  16. Старый комментарий
    Цитата:
    Сообщение от HighPredator Просмотреть комментарий
    Ок. Как будет время - напишу.
    Благодарю.
    Запись от Тамика размещена 01.07.2014 в 10:57 Тамика вне форума
  17. Старый комментарий
    Аватар для Vourhey

    Не по теме:

    Ой, я все перепутал, это ж была цитата из блога...

    Запись от Vourhey размещена 01.07.2014 в 10:58 Vourhey вне форума
  18. Старый комментарий
    Цитата:
    Сообщение от Vourhey Просмотреть комментарий
    То есть, ты только что написал сам:
    Написала сама.*
    Цитата:
    По -> только не знакомому с с++ не понятно, где член класса.
    Возможно.
    Но я работаю с проектом, в котором не всегда легко видно, что есть член класса, а что "пришедшее" значение. Я имею в виду моменты, когда один класс занимает около тысячи строк.
    Но, благодарю за комментарий.
    Запись от Тамика размещена 01.07.2014 в 11:00 Тамика вне форума
  19. Старый комментарий
    Аватар для Vourhey
    Цитата:
    Сообщение от Тамика Просмотреть комментарий
    Написала сама.*

    Возможно.
    Но я работаю с проектом, в котором не всегда легко видно, что есть член класса, а что "пришедшее" значение. Я имею в виду моменты, когда один класс занимает около тысячи строк.
    А пришедшее откуда? Обращение к членам класса без . или без -> возможно только внутри функций-членов. Тогда у нас есть несколько вариантов:
    - это локальные переменные. Они видны внутри функции, так как находятся там же, рядышком.
    - это глобальные переменные. Тут неправильная архитектура, их не должно быть, редкий случай.
    - переменные пришли при передаче пераметров - видны в определении функции.
    Там, где хочется обратить внимание на то, что где-то именно мембер, то можно использовать this->.
    Конечно, каждый делает, как привык
    Запись от Vourhey размещена 01.07.2014 в 11:09 Vourhey вне форума
  20. Старый комментарий
    Аватар для HighPredator
    Для начинающих программистов должен главенстовать принцип "береги честь смолоду"
    или, проще говоря: "вырабатывай правильный coding-style смолоду". Почему? Потому
    что стили имеют в большинстве своем лишь незначительные различия в разных
    проектах/организациях. Все они вырабатывались годами практики и сопряженных с
    проблем. Все. Теперь по делу.
    Во всем надо исходить из логики работы программиста. Что самое главное при
    работе с любым исходником? Не угадали. Отладка. Отладка и еще раз отладка. А уже
    из этого возникает принцип удобства чтения исходника. Думаете откуда появилось
    правило "не более 80 символов в строке"? Да, редакторы и мониторы позволяют
    хоть тысячу символов, но отлаживать это счастье удобно? А теперь представте себе
    на секунду совершенно рабочую ситуацию: отладку в консольном dbx под UNIX. Ну не
    может он выдать больше 80 на сколько-то, как бы я putty не растягивал. И как
    следствие форматирование убито. Это я к тому, что не надо разделять слова в
    именах переменных подчеркиваниями. Разделить можно заглавными буквами.
    С этой точки зрения предпочтительней конечно то, что вы обозначили как
    camelCase. А вот то, что вы назвали в статье "Си-стиль или C++STL/Boost" в
    реальности не удобно ни разу. И признаться в полевых условиях мне такое не
    встречалось никогда. Разумеется сам boost и т.п. не в счет.
    Константы. Лучше их объявлять сходным с переменными образом, а не все в верхнем
    регистре. Так проще отличить их от макросов.
    ООП. Тут мы уже в степи собственно С++ и тут уж как и везде в плюсах: кто на что
    горазд. Наиболее удобная на мой взгляд позиция коллег из idSoftware касательно
    методов классов. Сеттеры/геттеры с маленькой буквы, остальные, как и
    подпрограммы вообще, с заглавной.
    Код C++
    1
    2
    
    int attr = someRandomClass.getSomeIntAttr();
    int calculatedValue = someRandomClass.CalculateSomeIntValue();
    Теперь еще немного о реальности. Конечно рекомендации и тру-стили это здорово до
    тех пор пока вас не посадили за реальный проект. Тут уж хочешь-нехочешь придется
    придерживаться общего стиля в проекте. Будь то венгерская нотация или что-либо
    из разряда killyourself. Но к высокому все равно надо стремиться. Так вот
    вкратце.
    Отдельное вам спасибо за освещение такого вопроса.
    Запись от HighPredator размещена 01.07.2014 в 12:19 HighPredator вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru