Главная страница
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.65 MB
Время: 0.036 c
8-1086347255
олег
2004-06-04 15:07
2004.08.29
Полупрозрачность


1-1092401649
Nata
2004-08-13 16:54
2004.08.29
Файлы


9-1083908937
wolf3d
2004-05-07 09:48
2004.08.29
Помогите с написанием интересной игры ???


9-1083875300
Mihey
2004-05-07 00:28
2004.08.29
Вывод графики - всё, что можно


14-1092228490
European
2004-08-11 16:48
2004.08.29
Почему переменная цикла почти всегда i?