Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Религиозные войны > Цифры в конце названия переменных


Автор: mimik 20.3.2011, 13:07
ИМХО это зло, потому что если в конце названия переменных есть цифры, то это повод сделать массив из эти переменных.

Автор: mes 20.3.2011, 13:11
Цитата

иногда можно, напишу когда

например :
Код

template<typename Arg>
void func (Arg a1, Arg a2, Arg a3) 
{}



Автор: mimik 20.3.2011, 13:16
Цитата(mes @  20.3.2011,  13:11 Найти цитируемый пост)
Код

void func (Arg a1, Arg a2, Arg a3)
 

а почему не
Код

void func (Arg a[3])
{}

?

Автор: alexvs11 20.3.2011, 13:23
mimik, наверно будет разница как вызывать ее 
Код

func( 1,2,3 ) 

или
Код

Arg args[] = {1,2,3};
func( args );

Автор: mimik 20.3.2011, 13:33
Цитата(alexvs11 @  20.3.2011,  13:23 Найти цитируемый пост)
наверно будет разница как вызывать ее 

обычно если
Код

void func (Arg a1, Arg a2, Arg a3)

то и вызов этой функции будет примерно таким
Код

a1 = 1;
a2 = 10;
a3 = 2;
...
func(a1, a2, a3);

тогда не проще ли так
Код

a = {1, 10, 3};
func(a);

?

т.е. эти имена очень связаны,
а когда они не связаны то названиям переменным надо давать осмысленные имена

Автор: mes 20.3.2011, 13:47
Цитата(mimik @  20.3.2011,  12:33 Найти цитируемый пост)
тогда не проще ли так
a = {1, 10, 3};
func(a);

проще так :
Код

func(1, 10, 3);



Цитата(mimik @  20.3.2011,  12:16 Найти цитируемый пост)
а почему не
void func (Arg a[3]) 

потому что это другое...

Цитата(mimik @  20.3.2011,  12:33 Найти цитируемый пост)
а когда они не связаны то названиям переменным надо давать осмысленные имена 

это и есть осмысленные имена..

еще пример это плейсхолдеры : _1, _2...
http://liveworkspace.org/code/cafb802b20631d340e13a631e435079d

Автор: mimik 20.3.2011, 14:23
Цитата(mes @  20.3.2011,  13:47 Найти цитируемый пост)
проще так :

понятно что это проще, имелось в виду что a[0], a[1], a[2] ещё где-то используются
Цитата(mes @  20.3.2011,  13:47 Найти цитируемый пост)
потому что это другое...

да это другое, но чем оно хуже?
Цитата(mes @  20.3.2011,  13:47 Найти цитируемый пост)
это и есть осмысленные имена..

a1, a2, a3 это осмысленные имена?  smile 
Цитата(mes @  20.3.2011,  13:47 Найти цитируемый пост)
еще пример это плейсхолдеры : _1, _2...

я с C++ не так хорошо знаком
_1 это имя?
или это параметр по умолчанию?

Автор: mes 20.3.2011, 14:48
Цитата(mimik @  20.3.2011,  13:23 Найти цитируемый пост)
a1, a2, a3 это осмысленные имена?  

 smile , также как и first,second, third
это особенность обобщенного программирования, когда неизвестно что именно скрывается за параметрами и известен лишь алгоритм обработки.. 

например 
Код

template<typename A1,  typename A2>
struct pair
{
     A1 first;
     A2 second;
};
template <typename A>
pair<A1, A2> make_pair (A1 a1, A2 a2)
{
    return pair<A1,A2>(a1,a2);
}

как видно для make_pair абсолютно не важно чем являются A1, и А2.. главное что надо из них сделать структуру.. 

Цитата(mimik @  20.3.2011,  13:23 Найти цитируемый пост)
_1 это имя? или это параметр по умолчанию? 

 smile, имя..

Цитата(mimik @  20.3.2011,  13:23 Найти цитируемый пост)
да это другое, но чем оно хуже?

может и не хуже, но не подходит для той задачи
smile

Автор: alexvs11 20.3.2011, 14:48
Цитата(mimik @  20.3.2011,  14:23 Найти цитируемый пост)
я с C++ не так хорошо знаком


Цитата(mimik @  20.3.2011,  13:33 Найти цитируемый пост)
a = {1, 10, 3};func(a);

оно и видно, в с++ запрещена инициализация подобным образом

Цитата(mimik @  20.3.2011,  14:23 Найти цитируемый пост)
a1, a2, a3 это осмысленные имена?

a[0], a[1], a[2] осмысленней?

Автор: mes 20.3.2011, 14:56
Цитата(alexvs11 @  20.3.2011,  13:48 Найти цитируемый пост)
оно и видно, в с++ запрещена инициализация подобным образом

там опечатка, не забывайте что мы ж не в разделе c++ и что собеседники могут быть знакомы с ним лишь поверхностно smile
главное что смысл передан..

Добавлено через 1 минуту и 28 секунд
Цитата(alexvs11 @  20.3.2011,  13:48 Найти цитируемый пост)
a[0], a[1], a[2] осмысленней? 

полагается что с массивом осуществляется работа в цикле.. а следовательно "ручного" 
a[0], a[1], a[2] в таком случае не будет.. 

Автор: Фантом 20.3.2011, 14:59
Можно - в тех случаях, когда цифры представляют собой часть осмысленного имени и не являются в том или ином смысле номерами.

Автор: mes 20.3.2011, 15:02
или вот простой пример - функция swap, по обмену содержимого двух переменных .. 
как называть ее аргументы ?

Автор: миг 20.3.2011, 15:06
 
Цитата(mimik @  20.3.2011,  13:33 Найти цитируемый пост)
то и вызов этой функции будет примерно таким

Код

a1 = 1;
a2 = 10;
a3 = 2;
...
func(a1, a2, a3);

тогда не проще ли так
Код


a = {1, 10, 3};
func(a);


?

т.е. эти имена очень связаны,
а когда они не связаны то названиям переменным надо давать осмысленные имена 

это смотря, что твориться внутри функции.
Разница в том, что в результате вычислений внутри функции void fun( int a[]) могут измениться данные  в массиве a..
в отличии от вызова функции void fun(int A[0],int A[1],int A[2] )

Автор: mes 20.3.2011, 15:16
вот для наглядности, сами посмотрите что читабельней :
Код

   std::bind (func, _1, _2, _3);   
   std::bind (func, first, second, third);


http://liveworkspace.org/code/2910ce13cff023632db0e784392b9f87

Автор: mimik 20.3.2011, 15:17
Цитата(mes @  20.3.2011,  14:48 Найти цитируемый пост)
также как и first,second, third

1. тут сложней сделать ошибку
2. если эти переменные связаны, то да, это тоже плохие именна, но здесь мы никак не сможет оградить программиста

Цитата(alexvs11 @  20.3.2011,  14:48 Найти цитируемый пост)
a[0], a[1], a[2] осмысленней?

имхо, да
Код

points = [new Point(1,1), new Point(2,2)]
или
points = ["left-top":new Point(1,1), "right-bottom":new Point(2,2)]

гораздо лучше чем
Код

poinе1 = new Point(1,1)
poinе2 = new Point(2,2)
point3 = new Point(3,3)


Цитата(Фантом @  20.3.2011,  14:59 Найти цитируемый пост)
Можно - в тех случаях, когда цифры представляют собой часть осмысленного имени и не являются в том или ином смысле номерами.

можно пример?

Цитата(mes @  20.3.2011,  15:02 Найти цитируемый пост)
или вот простой пример - функция swap, по обмену содержимого двух переменных .. как называть ее аргументы ?

Код

function swap(left, right)
{}


Добавлено через 2 минуты и 3 секунды
Цитата(миг @  20.3.2011,  15:06 Найти цитируемый пост)
Разница в том, что в результате вычислений внутри функции void fun( int a[]) могут измениться данные  в массиве a..

ну можно поставить const, или как там

Автор: mes 20.3.2011, 15:21
Цитата(mimik @  20.3.2011,  14:17 Найти цитируемый пост)
left, right

(left, right),  (lhs, rhs) , (a1,a2), (first,second), (_1, _2) 
являются в данном случае абсолютно равно осмысленными и зависят от вкуса разботчика.
но при количестве аргументов три и более, цифры вытесняют своих конкурентов..

Цитата(mimik @  20.3.2011,  14:17 Найти цитируемый пост)
ну можно поставить const, или как там 

1. массив, переданный как константное имя,  не равнозначен, переданному по значению.. 
2. чтоб передать массив его надо "собрать", а это уже лишние строчки..
3. не всегда переменные с одним именем, являются одного и того же типа..

Цитата(mes @  20.3.2011,  14:21 Найти цитируемый пост)
 с одним именем

имеется ввиду корень слова без цифрового/буквенного аффикса..

Цитата(mimik @  20.3.2011,  14:17 Найти цитируемый пост)
1. тут сложней сделать ошибку

зачастую, наоборот, легче.. ибо отнимает силы программиста на длинное чтение и  восстановление ассоциации.. 
цифры как ассоциативный ряд намного более наглядны.. 

Автор: LSD 22.3.2011, 15:35
Цитата(mimik @  20.3.2011,  15:17 Найти цитируемый пост)
function swap(left, right)

А почему левый-правый, а не верхний-нижний?

Автор: mimik 23.3.2011, 12:54
Цитата(mes @  20.3.2011,  15:21 Найти цитируемый пост)
(left, right),  (lhs, rhs) , (a1,a2), (first,second), (_1, _2) являются в данном случае абсолютно равно осмысленными и зависят от вкуса разботчика.

имхо, не совсем
Цитата(LSD @  22.3.2011,  15:35 Найти цитируемый пост)
А почему левый-правый, а не верхний-нижний?

ну, левый операнд и правый операнд
в некоторых ЯП можно так
Код

a, b = b, a

Цитата(mes @  20.3.2011,  15:21 Найти цитируемый пост)
чтоб передать массив его надо "собрать", а это уже лишние строчки..

это в c++ так, в некоторых ЯП можно так
Код

func([1, 2, 3])

Цитата(mes @  20.3.2011,  15:21 Найти цитируемый пост)
зачастую, наоборот, легче.. ибо отнимает силы программиста на длинное чтение и  восстановление ассоциации.. 

вот мне недавно надо было добавить новый функционал в чужой код, так так вместо массива используется ассоциативный ряд, код на 2000 строк и с фнукциями с 40 параметрами,
мне сказали что вначале были 3 переменные, потом добавили ещё 2, а потом ещё 35  smile , код надо было написать быстро  и некогда было вникать в функионал, поэтому они просто копипастили,
сейчас, с массивом, этот код занимает где-то 200 строк

Автор: LSD 23.3.2011, 13:13
Цитата(mimik @  23.3.2011,  12:54 Найти цитируемый пост)
ну, левый операнд и правый операнд

Ну первый операнд, второй операнд smile , 
Так отчего бы их и не пронумеровать?

Автор: mimik 23.3.2011, 13:23
Цитата(LSD @  23.3.2011,  13:13 Найти цитируемый пост)
Так отчего бы их и не пронумеровать?

если есть такая функция
Код

function swap(left, right)
{}

и надо будет добавить параметр, то тут код заставляет подумать о рефакторинге

а если
Код

function swap(param1, param2)
{}

то можно добавить новый парметр, а потом ещё, и ещё
потому что такой код изначально не требует напрягаться для написания

Автор: LSD 23.3.2011, 15:56
swap() с тремя параметрами? smile  smile 

Автор: mes 23.3.2011, 15:59
Цитата(mimik @  23.3.2011,  11:54 Найти цитируемый пост)
вот мне недавно надо было добавить новый функционал в чужой код, так так вместо массива используется ассоциативный ряд, код на 2000 строк и с фнукциями с 40 параметрами,
мне сказали что вначале были 3 переменные, потом добавили ещё 2, а потом ещё 35   , код надо было написать быстро  и некогда было вникать в функионал, поэтому они просто копипастили,
сейчас, с массивом, этот код занимает где-то 200 строк

 smile к чему сказано то это ?!
имелось ввиду, что для человека легче для восприятия :
Код

bind(f,  _7, _6, _5, _4, _2, _3, _1 )

чем
Код

bind(f, седьмой, шестой, пятый, четвертый, второй, третий, первый);

где вперед заметили и легче выявили не стыковку ?

Цитата(mimik @  23.3.2011,  11:54 Найти цитируемый пост)
это в c++ так, в некоторых ЯП можно так
Код

func([1, 2, 3])

"собрать" это не "создать массив"
прежде всего массив создан из будет копий, а это не всегда  является желаемым поведением.. 
одного этого достаточно, чтоб не вспоминать остальные нюансы...

Цитата(mimik @  23.3.2011,  12:23 Найти цитируемый пост)
тут код заставляет подумать о рефакторинге

ну заставляет.. поняли что все таки нужно 4ре одинаковых параметра.. как их теперь называть ?

Добавлено @ 16:00
Цитата(LSD @  23.3.2011,  14:56 Найти цитируемый пост)
swap() с тремя параметрами?

ну так речь же не о самом swape...

Добавлено @ 16:03
П.С. то что названия нужно изначально стараться подбирать наиболее эффективные и удобные, я не спорю..
я лишь говорю, что ситуации, когда именно цифровые аффиксы являются наиболее подходящими, не редки.. и не вижу ни одного повода не использовать их в таких случаях..

Добавлено через 11 минут и 31 секунду
кстати если бы я писал swap то с большой вероятностью назвал бы аргументы не (left, right),(lhs,rhs) - которые больше подходит для операторов, а (a,b) потому что на мой взгляд наиболее точно передают семантику и не добавляют лишнего мусора..
но a,b является по сути ничем не отличается от _1 _2.. последние бы не использовал (касается только (c++)), из за их "зарезервированного" смысла, как плейсхолдеры..





Автор: mimik 23.3.2011, 16:11
Цитата(LSD @  23.3.2011,  15:56 Найти цитируемый пост)
swap() с тремя параметрами?

ну да
Код

temp = a;
a = b;
b = c;
c = temp;

Цитата(mes @  23.3.2011,  15:59 Найти цитируемый пост)
где вперед заметили и легче выявили не стыковку ?

да, это тоже не айс, но я и не предлагаю такой вариант, возможно там логичней будет массив или структура

Цитата(mes @  23.3.2011,  15:59 Найти цитируемый пост)
прежде всего массив создан из будет копий

массив/структура будет занимать примерно столько же памяти сколько и параметры функции, не?

Цитата(mes @  23.3.2011,  15:59 Найти цитируемый пост)
ну заставляет.. поняли что все таки нужно 4ре одинаковых параметра.. как их теперь называть ?

зависит, моно массивом, можно хэшмэп, можно классом

Автор: mes 23.3.2011, 16:12
Цитата(mimik @  23.3.2011,  15:11 Найти цитируемый пост)
массив/структура будет занимать примерно столько же памяти сколько и параметры функции, не?

дело не в памяти, а в смысле, который вкладывается в решение.. 

Автор: mimik 23.3.2011, 16:33
Цитата(mes @  23.3.2011,  16:12 Найти цитируемый пост)
дело не в памяти, а в смысле, который вкладывается в решение.. 

Цитата(mes @  20.3.2011,  15:21 Найти цитируемый пост)
цифры как ассоциативный ряд намного более наглядны

имхо, если в коде используется ассоциативный ряд, это один из поводов для того отрефакторить код, заменить ряд на массив/хэш/структуру/класс

имхо, если в каком-то ЯП не принято/оптимально/возможно использовать какой-то подход, это не означает что подход плохой,
в Lisp например, всё есть список smile
а в Java насколько я помню, функцию swap вообще написать не возможно, т.к. нельзя передать параметр по ссылке

Автор: LSD 23.3.2011, 16:49
Цитата(mimik @  23.3.2011,  16:11 Найти цитируемый пост)
ну да

Это уже простите не swap() а shift() smile 

А вообще мысль состоит в том, что иногда (не часто) функция принимает фиксированное количество параметров (потому неудобны массивы) которые семантически различаются только порядком в котором они переданы в функцию. Например sum(a1, a2), нет никакой разницы между первым и вторым аргументом. Потому я не вижу принципиальной разницы между: left/right, first/second, a1/a2.

Автор: k0rvin 23.3.2011, 18:34
Цитата(mimik @ 23.3.2011,  16:33)
в Lisp например, всё есть список smile

нет

Автор: mimik 23.3.2011, 20:50
Цитата(k0rvin @  23.3.2011,  18:34 Найти цитируемый пост)
нет

http://ru.wikipedia.org/wiki/Lisp
Цитата

Все выражения записываются в виде списков — одной из основных структур Лиспа

я это хотел сказать


Автор: k0rvin 23.3.2011, 21:21
Цитата(mimik @ 23.3.2011,  20:50)
Цитата(k0rvin @  23.3.2011,  18:34 Найти цитируемый пост)
нет

http://ru.wikipedia.org/wiki/Lisp
Цитата

Все выражения записываются в виде списков — одной из основных структур Лиспа

я это хотел сказать

тогда почему не сказал?

и таки не все.

123
123.4
123.4+5i
#\a
"abc"
x
|xyz|

и др.

Автор: mimik 23.3.2011, 21:50
Цитата(k0rvin @  23.3.2011,  21:21 Найти цитируемый пост)
123

это литерал  smile 
Цитата(k0rvin @  23.3.2011,  21:21 Найти цитируемый пост)
и др.

скобки, запятая, плюс это всё выражения, ага, щас


Автор: _Y_ 23.3.2011, 23:50
Цитата(mimik @ 20.3.2011,  13:07)
если в конце названия переменных есть цифры, то это повод сделать массив из эти переменных.

Отнюдь. Все зависит от языка. Возьмем тот же пример с передачей данных формальным параметрам функции (подпрограммы, метода, и т.п.).
  • В ряде языков массив это объект и передается по ссылке, а переменные передаются по значению. Совсем разные вещи, не так ли?
  • В ряде языков массив в формальных параметрах функции не может иметь заданного размера. Поэтому такой массив снижает императивность кода.
  • Отведение памяти под массив обычно требует больше времени, чем под независимые переменные. Да и доступ к элементам массива обычно медленнее. Если имеются серьезные требования к быстродействию - массивы не лучшее решение.

Можно и дальше продолжать. ИМХО если цифры читабельности кода не снижают, недостатком они не являются. Впрочем, сам их использую очень редко.


Автор: k0rvin 24.3.2011, 07:10
Цитата(mimik @ 23.3.2011,  21:50)
скобки, запятая, плюс это всё выражения, ага, щас

конечно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)