- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
case KEY_F9: {
if ( !strcmp( chlist->gettype(), "ethernet" ) ) {
/* Редактор канала Ethernet */
char buf[0x100];
chlist->gen_path_chan( CHANCONFDIR, "/m.cfg", buf );
//
tethcfgedit* edit = new tethcfgedit( getscr(), buf );
edit->layer = layer;
edit->Run();
delete edit;
} else if ( !strcmp( chlist->gettype(), "gprs" ) ) {
/* Редактор канала GPRS */
char buf[0x100];
chlist->gen_path_chan( CHANCONFDIR, "", buf );
//
tgprscfgedit* edit = new tgprscfgedit( getscr(), buf );
edit->layer = layer;
edit->Run();
delete edit;
} else if ( !strcmp( chlist->gettype(), "gsm" ) ) {
/* Редактор канала GSM */
char buf[0x100];
chlist->gen_path_chan( CHANCONFDIR, "", buf );
//
tgsmcfgedit* edit = new tgsmcfgedit( getscr(), buf );
edit->layer = layer;
edit->Run();
delete edit;
} else if ( !strcmp( chlist->gettype(), "gsppp" ) ) {
/* Редактор канала GS (пакетный) */
char buf[0x100];
chlist->gen_path_chan( CHANCONFDIR, "", buf );
//
tgspppcfgedit* edit = new tgspppcfgedit( getscr(), buf );
edit->layer = layer;
edit->Run();
delete edit;
} else if ( !strcmp( chlist->gettype(), "gs" ) ) {
/* Редактор канала GS (прямой) */
char buf[0x100];
chlist->gen_path_chan( CHANCONFDIR, "", buf );
//
tgscfgedit* edit = new tgscfgedit( getscr(), buf );
edit->layer = layer;
edit->Run();
delete edit;
} else if ( !strcmp( chlist->gettype(), "radio" ) ) {
/* Редактор канала радиомодема */
char buf[0x100];
chlist->gen_path_chan( CHANCONFDIR, "", buf );
//
tradiocfgedit* edit = new tradiocfgedit( getscr(), buf );
edit->layer = layer;
edit->Run();
delete edit;
} else if ( !strcmp( chlist->gettype(),"cbs" ) ) {
/* Редактор канала Ethernet */
char buf[0x100];
chlist->gen_path_chan( CHANCONFDIR,"",buf );
//
tcbscfgedit* edit=new tcbscfgedit( getscr(),buf );
edit->layer = layer;
edit->Run();
delete edit;
} else if ( !strcmp( chlist->gettype(), "ptsn" ) ) {
/* Редактор канала GSM */
char buf[0x100];
chlist->gen_path_chan( CHANCONFDIR, "", buf );
//
tptsncfgedit* edit = new tptsncfgedit( getscr(), buf );
edit->layer = layer;
edit->Run();
delete edit;
}
......
Кусок case'a, где запускается редактор настроек соотвествующего канала связи. Код из одной встроенной железки.
absolut 11.09.2010 12:34 # +1
nil 11.09.2010 19:23 # +4
Подозрительно...
absolut 12.09.2010 00:02 # +2
Govnoeb 11.09.2010 16:26 # +2
вдобавок какой суровый кодер решил тип канала связи хранить как строку?
vollmond 11.09.2010 17:07 # +1
Суровый сибирский
Fekalcoder 12.09.2010 17:21 # −3
Особенно, если учесть, что конфигурация хранится в текстовом файле.
Вообще - решения, вырванные из контекста задачи - сложно оценить чем они и как обоснованы.
TheCalligrapher 11.09.2010 23:36 # −7
absolut 12.09.2010 00:05 # +3
Между прочим это сравнение на равенство строк.
Ибо strcmp() возвращает 0, когда строки равны.
Так что индусокод - это для незнающих как минимум.
TheCalligrapher 12.09.2010 05:34 # −4
Функция `strcmp` - функция relational-сравнения, а не equality-сравнения. Не надо пытаться делать из нее функцию equality-сравнения такими говнотрюками. Приставке "не" нет места в стравнении на равенство и совать туда этот `!` не надо. Если вы не "кул хацкер", пишите как все нормальные люди `if (strcmp(..., ...) == 0)`. А за `if (!strcmp(..., ...))` - сразу в отпуск в Индию.
absolut 12.09.2010 10:10 # −2
И искать калОграфию там, где ее нет.
P.S. В Гоа я бы не отказался съездить :)
TheCalligrapher 12.09.2010 11:47 # +1
absolut 12.09.2010 13:48 # +3
В любой отрасли есть вещи очевидные для людей с опытом,
и совершенно не очевидные для новичков.
При этом эквивалентность strcmp() == 0 и !strcmp() относится как раз к такому случаю.
Не нравится такой подход, напиши strequal() - будет очевиднее.
Вот пример: while(*dest++ = *src++). Покажи его новичку: скажет "что за бред?".
А это всего лишь копирование строк.
TheCalligrapher 12.09.2010 19:37 # −2
Речь идет но об очевидности, а об индусокодовсти/говнокодовости. '!strcmp` - конструкция индусокодовая. "Для людей с опытом" :)
ch 12.09.2010 21:05 # +1
другая функция, которая equal, наверняка вызывает strcmp
Stalker 12.09.2010 22:12 # +1
Хорошая иллюстрация :)) Пытаетесь заразить неприязнью к отрицаниям?
TheCalligrapher 12.09.2010 19:58 # 0
1. Строгая: без явного сравнения допускаются только значения с выраженно булевской семантикой, как например
но ни в коем случае не
2. Нестрогая: без явного сравнения допускаются значения с выраженно булевской семантикой, а также значения, неявно конверитируемые в булевскую семантику с сохранением натуральных соотвествий типа "есть - 1, нет - 0", "равны - 1, не равны - 0", "успешно - 1, не успешно - 0" и т.п. В рамках этого подхода допускается код типа
и т.п.
Сравнения же типа `strcmp`, где равенство выражается через 0, при использовании в булевском контексте (где 0 имеет отрицательный смысл - "ложь") - это либо индусокод, либо яркий признак "кул хацкеров" только что "прочитавших учебник". "Натренироваться" (мягко выражаясь) читать такое, разумеется, можно, как можно "натренироваться" читать любой говнокод. Но смысл?
ch 12.09.2010 21:07 # −5
TheCalligrapher 12.09.2010 21:13 # 0
А то, что есть экземпляры, которые "не дочитали"... Конечно же есть! Откуда, вы думаете, говонокод берется? Вот именно от этих недочитывающих (извините за очевидность)!
ch 12.09.2010 21:50 # −5
у вас там два пункта и постскриптум из копипасты и пяти тыщ точек. от такого у нормальных людей только депрессия развивается
Stalker 12.09.2010 22:15 # 0
Stalker 12.09.2010 22:22 # +2
Функция возвращает разность двух строк. Может, всё дело в нелогичном названии? Думаю, strdiff (от difference) подошло бы больше.
С попыткой обосрать "Нестрогую" школу не согласен.
TheCalligrapher 12.09.2010 22:41 # 0
Stalker 12.09.2010 23:03 # +2
TheCalligrapher 12.09.2010 23:47 # −3
absolut 12.09.2010 23:59 # 0
Языки программирования - вообще сугубо искусственный продукт.
Допустим, 0 - приводился бы к true, а не 0 - к false.
strcmp() стал бы естественнее, по-вашему мнению?
TheCalligrapher 13.09.2010 00:04 # −1
absolut 13.09.2010 10:26 # +1
Если хочется большей "естественности" - std::string и operator== в помощь.
xXx_totalwar 13.09.2010 12:12 # 0
а вот ваш с++ божок Степанов прямо противоположного мнения =)
absolut 13.09.2010 12:33 # +1
Я атеист.
absolut 12.09.2010 23:13 # +1
Уж лучше было б про if (ptr != NULL ) упомянуть, если действительно хочется разные "школы" показать.
Я вот до сих пор не могу понять, зачем навязывать писать strcmp() == 0, вместо !strcmp() если это приводит к совершенно одинаковым результатам с точки зрения компилятора, но при этом второй вариант даже на пару символов короче записывается. Смиритесь с тем, что 0 неявно приводится к false, и многие этим пользуются. Особенно учитывая что в Си явного булевского типа не было. А городить вместо одной strcmp() три разных функции strless(), strgreater() и strequal(), возвращающие "истинные" логические результаты, глупо.
TheCalligrapher 12.09.2010 23:26 # 0
При чем здесь какие-то три дополнительные функции - мне не ясно. Об этом спрашивайте того, кто эти функции придумал.
Сссылка на "одинаковые результаты с точки зрения компилятора" мне не ясна тоже. Я вел речь о стилистических свойствах кода. Какая разница, что там имеет место с точки зрения компилятора? Говнокод - это более чем в половине случаев именно стилистически кривой код. Пример - перед вами. Код работает правильно? Да. Нарушает правила языка? Нет. Т.е. с точки зрения компилятора там все прекрасно. Будете по этой причине утверждать, что это не говнокод?
absolut 13.09.2010 00:08 # +2
Стилистические свойства кода в любом случае будут опираться на семантические.
А они в данном случае четко прописаны в стандартной, между прочим, библиотеке.
Где четко сказано: strcmp() возвращает 0 для равных строк.
И хоть ты тресни, иначе уже не будет.
guest6 01.10.2021 18:12 # 0
а isbukva?
nil 12.09.2010 14:22 # +3
Что до if(!strcmp) — думаю, нормальная конструкция. При небольшом опыте читается на раз, хотя есть у меня знакомые — молодые — которые задефайнили Ok в 0 и пишут strcmp == Ok. Или, соответственно, наоборот. Но это все-таки не индусятина, а стилистика.
Stalker 12.09.2010 16:07 # +2
Stalker 12.09.2010 15:59 # +2
bugmenot 12.09.2010 17:12 # −1
Prabhakar_Srivastar 01.10.2021 18:10 # 0
TheCalligrapher 12.09.2010 19:39 # +1
Stalker 12.09.2010 22:24 # −1
TheCalligrapher 12.09.2010 22:44 # 0
Stalker 12.09.2010 23:09 # −1
Fekalcoder 12.09.2010 17:22 # −2
TheCalligrapher 12.09.2010 20:18 # 0
Но оценить этот момент невозможно, ибо из приведенного кода не ясно, существовал ли такой полиморфный тип.
Я бы предположил, что существовал, т.к. "аффар" занимается динамическим созданием/удалением объектов-редакторов через `new/delete` (вместо использования локального объекта). По-видимому, автор просто скопировал способ создания/удаления объекта из чужого кода, не понимая, что динамическое создание/удаление было применено там именно по причине полиморфности класса.
Altravert 13.09.2010 05:40 # 0
Govnoeb 13.09.2010 12:26 # +1
у меня к Гуру есть вопрос:
имеет положительную или отрицательную семантику?
vollmond 13.09.2010 12:31 # 0
absolut 13.09.2010 12:36 # 0
Тогда зачем используется chlist->gettype() ?
Сделали бы виртуальные функции.
UPD: немного не туда посмотрел :) Но всё же
vollmond 13.09.2010 12:44 # 0
Govnoeb 13.09.2010 14:50 # 0
более изящное решение - сделать Run() виртуальной функ. и заюзать std::map. и пусть общий предок будет <generic_edit> и set() тоже виртуальна.
Govnoeb 13.09.2010 14:22 # 0
в приведенном коде статистический и динамический типы у *edit всегда совпадают
TheCalligrapher 13.09.2010 17:09 # 0
TheCalligrapher 13.09.2010 17:07 # +1
Если в иерархии полиморфизма нет, то тогда делать тут `new/delete` вообще не надо было. Надо было объявлять обычные локальные объекты и не лезть в динамическую память вообще.