Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1092076541
Piter
2004-08-09 22:35
2004.08.29
Помогите с выбором насчет компьютера


14-1092133062
Kerk
2004-08-10 14:17
2004.08.29
В Финляндии не берут в армию из Интернета


14-1092009303
Sergey Kaminski
2004-08-09 03:55
2004.08.29
Никаких домаших животных


3-1091441457
som
2004-08-02 14:10
2004.08.29
Фильтрация в DBGridEh


9-1084394491
IRIGM
2004-05-13 00:41
2004.08.29
Векторы камеры OpenGL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский