Текущий архив: 2004.08.29;
Скачать: CL | DM;
Вниз
Нужно ли бороться с хинтами и ворнингами? Найти похожие ветки
← →
имя (2004-08-08 16:27) [40]Удалено модератором
← →
имя (2004-08-08 16:27) [41]Удалено модератором
← →
имя (2004-08-08 16:27) [42]Удалено модератором
← →
имя (2004-08-08 16:27) [43]Удалено модератором
← →
имя (2004-08-08 16:27) [44]Удалено модератором
← →
имя (2004-08-08 16:27) [45]Удалено модератором
← →
имя (2004-08-08 16:27) [46]Удалено модератором
← →
имя (2004-08-08 16:27) [47]Удалено модератором
← →
имя (2004-08-08 16:27) [48]Удалено модератором
← →
имя (2004-08-08 16:27) [49]Удалено модератором
← →
Бином Ньютоныч (2004-08-08 16:47) [50]>[25] - [49]
"Он по-своему несчастный был - дурак!"
(c)В.Высоцкий
← →
VMcL © (2004-08-08 17:06) [51]>>Бином Ньютоныч (08.08.04 16:47) [50]
Не обращай внимания. Похоже, опять атака на форум...
← →
Юрий Зотов © (2004-08-08 18:52) [52]Мое IMHO.
Как я отношусь к хинтам и варнингам? Очень просто - их не должно быть. Ни единого.
И - хотите верьте, хотите нет - но у меня их и правда нет ни единого. За все время программирования - а это уже несколько десятков лет.
Как я этого добиваюсь? Очень просто.
1. Любой хинт или варнинг подвергается разбору. В 99% случаев видим, что компилятор совершенно прав, а не просто так дурку валяет. Соответственно, код видоизменяется так, чтобы сообщение компилятора исчезло, но никаких лишних операций в программе не появилось.
2. Если это не получается и для того, чтобы сообщение исчезло, нужны какие-то ненужные действия (что бывает в 0.1% случаев), то производим более тщательный анализ кода. Если есть абсолютная уверенность, что он действительно на 100% безопасен - отключаем сообщение директивами компилятора, но только ЭТО сообщение и только на ЭТОТ кусок кода ($WARN xxx OFF
и далее$WARN xxx ON
). Если же такой уверенности нет, значит эти действия вовсе не лишние и ДОЛЖНЫ быть выполнены.
Вот и все. При некотором навыке кодинга все это практически не отнимает времени, а программа становится чище и надежнее. И ни один новый хинт/варнинг теперь уже не будет проворонен.
← →
Григорьев Антон © (2004-08-08 18:53) [53]
> Ihor Osov"yak © (08.08.04 16:18) [23]
> В случае испосльзования специализированной процедуры и комментировать
> особо ничего не нужно..
Ну, это кому как :))
Увидев в коде Val, человек может нажать F1 и прочитать, что это за процедура. А вот ValExt в справке не описан, а по исходникам лазить умеют далеко не все (а у тех, кто работает на честно купленной Delphi, исходников может не быть просто из экономии - без них Delphi дешевле). Да и с совместимостью в следующих версиях Delphi могут быть проблемы. Одним словом, вернулись к тому, о чём я говорил: понятность кода - вещь субъективная.
А вообще, если не стремиться получить столь же эффективный код, вопрос "а как ещё можно сделать" мне не очень интересен - я сам могу предложить несколько вариантов. Меня интересует другое: зачем нужно изменять мой код. Только для того, чтобы избавиться от хинта? Не впечетляет меня такая цель. А ничего конкретного против пока не было сказано, только общие рассуждения на тему чистого и грязного кода. Действительно ли полное отсутствие хинтов - абсолютная ценность, цель, которой во что бы то ни стало надо достичь? Я пока не вижу серьёзных аргументов за такой подход.
← →
Юрий Зотов © (2004-08-08 19:07) [54]> Григорьев Антон © (08.08.04 18:53) [53]
> Действительно ли полное отсутствие хинтов - абсолютная ценность, цель, которой во что бы то ни стало надо достичь?
Нет, конечно. Цель другая - не прозевать новые хинты/варнинги, которые уже могут быть действительно опасны.
> Я пока не вижу серьёзных аргументов за такой подход.
Вот один из таких аргументов - время, потраченное на избавление от хинтов/варнингов СРАЗУ же при написании кода пренебрежимо мало по сравнению с временем вылавливания непонятно откуда вдруг взявшегося ПЛАВАЮЩЕГО бага, который ЗАПРОСТО может появиться, если мы прозевали новый хинт/варнинг. То есть, время мы на самом деле ЭКОНОМИМ, а не теряем - плюс повышается надежность программы.
← →
Гаврила © (2004-08-08 20:08) [55]Конечно их не должно быть !
Это даже не обсуждаемо.
Так как, если программист допускает "опечатку" в коде, компилятор в ряде случаев может его поправить хинтом или варнингом. Если их уже 150, программист просто его не заметит.
Если явный случай бестолковости компилятора (такое, увы, бывает), то {$Warinigs OFF}...$Warinigs ON}
сорри, если повторил чью-то мысль
Прав Юра Зотов
Штрафы надо вводить = за хинт 5 уе, за варнинг - 10
← →
Piter © (2004-08-08 21:38) [56]я не понимаю о чем спор? Может кто объяснит?
Все говорят одно и тоже... вы просто решили укрепиться в своей вере? :)
← →
Ihor Osov'yak © (2004-08-09 00:52) [57]2 [56] Piter © (08.08.04 21:38)
> я не понимаю о чем спор? Может кто объяснит?
флейма ради, флейма :-)
2 [53] Григорьев Антон © (08.08.04 18:53)
> А вот ValExt в справке не описан ...
ну я ж говорил, что в случае наличия времени и ...
Реально, конечно, был бы написан вариант 1.
> а у тех, кто работает на честно купленной Delphi, исходников может не быть просто из экономии
Кстати, минимальный вариант делфи, на котором можна писать софт с бизнес-целью - professional. А он уже идет с исходниками. в тч. system.pas.
а остальное уже передо мною сказали.
← →
Григорьев Антон © (2004-08-09 07:56) [58]
> Юрий Зотов © (08.08.04 18:52) [52]
> 2. Если это не получается и для того, чтобы сообщение исчезло,
> нужны какие-то ненужные действия (что бывает в 0.1% случаев),
> то производим более тщательный анализ кода. Если есть абсолютная
> уверенность, что он действительно на 100% безопасен - отключаем
> сообщение директивами компилятора, но только ЭТО сообщение
> и только на ЭТОТ кусок кода ($WARN xxx OFF и далее $WARN
> xxx ON). Если же такой уверенности нет, значит эти действия
> вовсе не лишние и ДОЛЖНЫ быть выполнены.
А как бы ты поступил в случае с двумя if"ами и промежуточным безусловным кодом? Если тупо отключить предупреждение на весь второй if, то можно не получить сообщение о том, что не инициализирована какая-то другая переменная, а это уже будет плохо.
> Piter © (08.08.04 21:38) [56]
> я не понимаю о чем спор? Может кто объяснит?
Лично я ни с кем не спорю. Просто я понял, что на эту проблему существует точка зрения, отличная от моей. И теперь я хочу до конца понять чужую точку зрения, чтобы сделать для себя выводы.
← →
Думкин © (2004-08-09 08:03) [59]
if a then b;
c;
if a then d;
if a then begin
b;
c;
d
end
else c;
То есть второе не устраивает? Об этом?
← →
Григорьев Антон © (2004-08-09 08:24) [60]
> Думкин © (09.08.04 08:03) [59]
> То есть второе не устраивает? Об этом?
Да, не устраивает. По двум причинам.
1. "с" может быть достаточно большим, и его дублирование приведёт к неоправданному разбуханию кода. Уж лучше тогда добавить перед if"ами инициализацию проблемной переменной фиктивным значением.
2. Если придётся переделывать "с", то надо будет вносить изменения в два куска кода и строго следить за их идентичностью.
Если вынести "с" в отдельную процедуру, то вторая проблема снимается, а первая становится намного менее острой. Но тогда можно получить другую проблему: в этой процедуре окажутся объединены вырванные из контекста разнородные действия, и ясность кода от этого уменьшится.
← →
Sha © (2004-08-09 09:52) [61]> Вот два примера, которые мне уже глаза намозолили...
Одного этого достаточно, чтобы поставить пару лишних операторов.
На анализ того, откуда эти варнинги возникли, к чему могут привести и т.п. ты в сумме потратишь больше времени, чем будет сэкономлено твоей программой за все время ее жизни у всех пользователей. По-моему, твое время для тебя должно быть дороже.
← →
Гаврила © (2004-08-09 10:03) [62]
> "с" может быть достаточно большим, и его дублирование приведёт
> к неоправданному разбуханию кода
Каки проблемы ? Вынести в приватный метод, или во внутреннюю процедуру(что лучше)
← →
Sandman25 © (2004-08-09 10:17) [63]var
s: string;
i: integer;
c: integer;
begin
s := edit1.text;
Val(s, i, c);
if c = 0 then
caption := s;
end;
Выдается
Value assigned to "i" never used
Ну и как это исправлять? Писать Caption := IntToStr(i)?
← →
Думкин © (2004-08-09 10:22) [64]
> [63] Sandman25 © (09.08.04 10:17)
Видимо, это связано с тем, что Val предназначена для:
Converts a string to a numeric representation.
А не для проверки. Или как?
← →
Danilka © (2004-08-09 10:23) [65][63] Sandman25 © (09.08.04 10:17)
Какая версия дельфи?
В 7 (а может и 6) есть ф-я, которая проверяет число/не число.
К сожалению, нет сейчас под рукой, немогу сказать точно какая, по-моему в StrUtils лежит.
А так, в общий для всех модулей модуль выкладывал самописную такую ф-ю, которая проверяла, в данном случае был-бы просто ее вызов. :))
← →
Sandman25 © (2004-08-09 10:28) [66][64] Думкин © (09.08.04 10:22)
Ну и как проверять? Через StrToIntDef или TryStrToInt? И зачем замедлять?
[65] Danilka © (09.08.04 10:23)
3, 4 и 6 :)
← →
Mystic © (2004-08-09 11:08) [67]У меня условный рефлекс --- как только в программе появляется подсказки или предупреждения --- компиляция прекращается. Да, иногда предупреждения бывают лишними (часто в алгоритмических задачах). В этом случае я либо добавляю строку в коментарием Kill warning
const
NEVER_USED_VALUE = $FFFFFFFF;
begin
A := NEVER_USED_VALUE; // Kill warning
if Condition then
A := Random(5);
DoSomething;
if Condition then
begin
Assert(A <> NEVER_USED_VALUE);
ShowMessage(IntToStr(A));
end;
Падение производительности из-за лишнего присваивания меня абсолютно не беспокоит. А когда беспокоит --- просто перепишу фрагмент на ассемблере --- и производительность, и отсуствие предупреждений :)
Кстати, код
Val(Copy(S,P,255),R,D);
J:=D;
Val(Copy(S,P,J-1),R,D);
тоже не является самым оптимальным решением, но вполне рабочим. А если переписать его как:function MyVal(S: string; P: Integer): Extended;
var
ErrSymbol: Integer;
begin
Val(Copy(S,P,Length(S)), Result, ErrSymbol);
if ErrSymbol <> 0 then
Val(Copy(S, P, ErrSymbol-1), Result, Errsymbol);
end;
то и от предупреждения избавляемся, и от повторного разбора в случае, если строка заканчивается числом :) Ну а если есть время, то можно и конечный автомат написать, а еще лучше прикрутить LEX и избавится от проблем ручного лексического анализа.
Кстати, сколько раз исходники от Borland не компилировал, предупреждений и подсказок не наблюдалось :)
← →
Думкин © (2004-08-09 11:23) [68]> [66] Sandman25 © (09.08.04 10:28)
> [64] Думкин © (09.08.04 10:22)
> Ну и как проверять? Через StrToIntDef или TryStrToInt? И
> зачем замедлять?
Мне кажется, что в данном случае проблема не компилятора, а библиотеки.
Потму что функция предназначена для того чтобы конвертировать, а не проверять. А то что ее используют не по назаначению - компилятор ни при чем.
А как проверять? Ну видимо как и писалось - вставить локальные выключения варнингов или написать свое.
← →
Prohodil Mimo © (2004-08-09 11:36) [69]Выставляете игнор варнинга на определённые строки и называете это "ни одного варнинга". Если варнинг в игноре - это не значит, что его нет.
Меня тоже добивает один варнинг:
у меня есть глобальная переменная "счётчик", которую использую в разных процедурах, и Дельфя мне постоянно кричит, что переменная должна быть локальной. Я понимаю, что могу в одном цыкле вызвать другую процедуру в которой цыкл с той же переменной, но у меня такого нет. Компилятор мог бы проверять на подобные ситуации и не паниковать каждый раз.
← →
Anatoly Podgoretsky © (2004-08-09 11:38) [70]Prohodil Mimo © (09.08.04 11:36) [69]
А зачем тебе глобальная переменная цикла?
← →
VMcL © (2004-08-09 11:41) [71]>>Prohodil Mimo © (09.08.04 11:36) [69]
Себе же делаешь хуже (точнее своей программе). При включенной оптимизации, если переменная, локальная, под неё память может вообще не выделяться - она будет в регистре. А если глобальная, то память компилятору придется выделить.
← →
Sandman25 © (2004-08-09 11:43) [72][71] VMcL © (09.08.04 11:41)
+ размер экзешника увеличивается
← →
Prohodil Mimo © (2004-08-09 11:43) [73][70] Anatoly Podgoretsky, а чтобы не создавалась каждый раз при запуске процедур и функций.
Переменные используемые в более 50% процедур обычно выношу в глобальные. А зачем их каждый раз создавать\уничтожать, если всё равно понадобится?
← →
Думкин © (2004-08-09 11:44) [74]> [69] Prohodil Mimo © (09.08.04 11:36)
> Выставляете игнор варнинга на определённые строки и называете это "ни одного варнинга". Если варнинг в игноре - это не значит, что его нет.
Кто выставляет и говорит?
← →
Sandman25 © (2004-08-09 11:44) [75][73] Prohodil Mimo © (09.08.04 11:43)
Скачайте эксперт Castalia, он позволяет объявлять переменные прямо в том месте, где они используются.
← →
Думкин © (2004-08-09 11:45) [76]> [73] Prohodil Mimo © (09.08.04 11:43)
Ну если я буду присутствовать при собеседовании - тебе работа не светит.
← →
Anatoly Podgoretsky © (2004-08-09 11:47) [77]Prohodil Mimo © (09.08.04 11:43) [73]
А ее создавать не надо, она создается на этапе компиляции и автоматически размещается на стеке.
← →
Anatoly Podgoretsky © (2004-08-09 11:47) [78]Это очень серезное предпреждение!
← →
Sandman25 © (2004-08-09 11:47) [79][76] Думкин © (09.08.04 11:45)
Самое интересное, что он может оказаться прав. Например, в том случае, если речь идет об объектах с большим временем создания/инициализации. В данном конкретном случае со счетчиками я с тобой согласен, конечно.
← →
Prohodil Mimo © (2004-08-09 12:04) [80][74] Думкин, ну хотя бы [52] 2.
[76], глобальных переменных не должно быть?
А если 10 процедур по обработке таблицы, к примеру обработка СтрингГрида, перемещение по строкам, колонкам. В каждой процедуре держать эти переменные?
Каждая процедура может вызывать функции, которые используют текущие состояния этих переменных. зачем в них передавать значения, если можно объявить их глобально? Чем это плохо? не тратится время проца. К тому же в книгах по написанию игр для быстроты работы как раз и рекомендуют применять данный способ.
Восможно я излагаю мысли не совсем понятно... но извиняйте... какой есть.
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2004.08.29;
Скачать: CL | DM;
Память: 0.63 MB
Время: 0.032 c