- 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, где запускается редактор настроек соотвествующего канала связи. Код из одной встроенной железки.
Подозрительно...
вдобавок какой суровый кодер решил тип канала связи хранить как строку?
Суровый сибирский
Особенно, если учесть, что конфигурация хранится в текстовом файле.
Вообще - решения, вырванные из контекста задачи - сложно оценить чем они и как обоснованы.
Между прочим это сравнение на равенство строк.
Ибо strcmp() возвращает 0, когда строки равны.
Так что индусокод - это для незнающих как минимум.
Функция `strcmp` - функция relational-сравнения, а не equality-сравнения. Не надо пытаться делать из нее функцию equality-сравнения такими говнотрюками. Приставке "не" нет места в стравнении на равенство и совать туда этот `!` не надо. Если вы не "кул хацкер", пишите как все нормальные люди `if (strcmp(..., ...) == 0)`. А за `if (!strcmp(..., ...))` - сразу в отпуск в Индию.
И искать калОграфию там, где ее нет.
P.S. В Гоа я бы не отказался съездить :)
В любой отрасли есть вещи очевидные для людей с опытом,
и совершенно не очевидные для новичков.
При этом эквивалентность strcmp() == 0 и !strcmp() относится как раз к такому случаю.
Не нравится такой подход, напиши strequal() - будет очевиднее.
Вот пример: while(*dest++ = *src++). Покажи его новичку: скажет "что за бред?".
А это всего лишь копирование строк.
Речь идет но об очевидности, а об индусокодовсти/говнокодовости. '!strcmp` - конструкция индусокодовая. "Для людей с опытом" :)
другая функция, которая equal, наверняка вызывает strcmp
Хорошая иллюстрация :)) Пытаетесь заразить неприязнью к отрицаниям?
1. Строгая: без явного сравнения допускаются только значения с выраженно булевской семантикой, как например
но ни в коем случае не
2. Нестрогая: без явного сравнения допускаются значения с выраженно булевской семантикой, а также значения, неявно конверитируемые в булевскую семантику с сохранением натуральных соотвествий типа "есть - 1, нет - 0", "равны - 1, не равны - 0", "успешно - 1, не успешно - 0" и т.п. В рамках этого подхода допускается код типа
и т.п.
Сравнения же типа `strcmp`, где равенство выражается через 0, при использовании в булевском контексте (где 0 имеет отрицательный смысл - "ложь") - это либо индусокод, либо яркий признак "кул хацкеров" только что "прочитавших учебник". "Натренироваться" (мягко выражаясь) читать такое, разумеется, можно, как можно "натренироваться" читать любой говнокод. Но смысл?
А то, что есть экземпляры, которые "не дочитали"... Конечно же есть! Откуда, вы думаете, говонокод берется? Вот именно от этих недочитывающих (извините за очевидность)!
у вас там два пункта и постскриптум из копипасты и пяти тыщ точек. от такого у нормальных людей только депрессия развивается
Функция возвращает разность двух строк. Может, всё дело в нелогичном названии? Думаю, strdiff (от difference) подошло бы больше.
С попыткой обосрать "Нестрогую" школу не согласен.
Языки программирования - вообще сугубо искусственный продукт.
Допустим, 0 - приводился бы к true, а не 0 - к false.
strcmp() стал бы естественнее, по-вашему мнению?
Если хочется большей "естественности" - std::string и operator== в помощь.
а вот ваш с++ божок Степанов прямо противоположного мнения =)
Я атеист.
Уж лучше было б про if (ptr != NULL ) упомянуть, если действительно хочется разные "школы" показать.
Я вот до сих пор не могу понять, зачем навязывать писать strcmp() == 0, вместо !strcmp() если это приводит к совершенно одинаковым результатам с точки зрения компилятора, но при этом второй вариант даже на пару символов короче записывается. Смиритесь с тем, что 0 неявно приводится к false, и многие этим пользуются. Особенно учитывая что в Си явного булевского типа не было. А городить вместо одной strcmp() три разных функции strless(), strgreater() и strequal(), возвращающие "истинные" логические результаты, глупо.
При чем здесь какие-то три дополнительные функции - мне не ясно. Об этом спрашивайте того, кто эти функции придумал.
Сссылка на "одинаковые результаты с точки зрения компилятора" мне не ясна тоже. Я вел речь о стилистических свойствах кода. Какая разница, что там имеет место с точки зрения компилятора? Говнокод - это более чем в половине случаев именно стилистически кривой код. Пример - перед вами. Код работает правильно? Да. Нарушает правила языка? Нет. Т.е. с точки зрения компилятора там все прекрасно. Будете по этой причине утверждать, что это не говнокод?
Стилистические свойства кода в любом случае будут опираться на семантические.
А они в данном случае четко прописаны в стандартной, между прочим, библиотеке.
Где четко сказано: strcmp() возвращает 0 для равных строк.
И хоть ты тресни, иначе уже не будет.
а isbukva?
Что до if(!strcmp) — думаю, нормальная конструкция. При небольшом опыте читается на раз, хотя есть у меня знакомые — молодые — которые задефайнили Ok в 0 и пишут strcmp == Ok. Или, соответственно, наоборот. Но это все-таки не индусятина, а стилистика.
Но оценить этот момент невозможно, ибо из приведенного кода не ясно, существовал ли такой полиморфный тип.
Я бы предположил, что существовал, т.к. "аффар" занимается динамическим созданием/удалением объектов-редакторов через `new/delete` (вместо использования локального объекта). По-видимому, автор просто скопировал способ создания/удаления объекта из чужого кода, не понимая, что динамическое создание/удаление было применено там именно по причине полиморфности класса.
у меня к Гуру есть вопрос:
имеет положительную или отрицательную семантику?
Тогда зачем используется chlist->gettype() ?
Сделали бы виртуальные функции.
UPD: немного не туда посмотрел :) Но всё же
более изящное решение - сделать Run() виртуальной функ. и заюзать std::map. и пусть общий предок будет <generic_edit> и set() тоже виртуальна.
в приведенном коде статистический и динамический типы у *edit всегда совпадают
Если в иерархии полиморфизма нет, то тогда делать тут `new/delete` вообще не надо было. Надо было объявлять обычные локальные объекты и не лезть в динамическую память вообще.