Форум: "Потрепаться";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Вниз
---|Ветка была без названия|--- Найти похожие ветки
← →
Anatoly Podgoretsky (2002-08-12 16:02) [40]Точка с запятой после каждой строчки не является обязательным правилом, в некоторых случаях можно опускать, а в некоторых случаях ее вообще нельзя использовать. Речь конечно не про его программу, до нее нет дела, речь не о стиле, хотя это часть концепции, речь о методике написания правильных программ, вот об этом и речь. И ни к чему сводить к личным мотивам, их просто нет.
← →
VEG (2002-08-12 16:08) [41]>DenKop
Согласен!
Спасибо за поддержку!
← →
DenKop (2002-08-12 16:45) [42]Anatoly Podgoretsky >>
Думаю не стоит придираться к мелочам (я про ;), я выразился утрированно. Но всё же хочется услышать, что нибудь интересного по теме представленного парадокса. Я не думаю, что ВСЕМИ УВАЖАЕМЫЙ Anatoly Podgoretsky, зная, что его массив не может содержать более 15 эл-тов будет объявлять его как [1..1000](ничего не конкретизирую, пример опять же абстрактный!), т.к. его можно обвинить в иррациональности кода.
Но если же вы попытаетесь описать его как [1..15], то появится вопрос такого содержания: "А если вопросов более 15, что тогда, Access voilation, или Index out of bounds, или может, что ещё?!!" Вот в этом то и заключается главный парадокс в изложенных вами(и не только вами) мессагах и я вовсе собирался сводить критику к личным мотивам.
> Речь конечно не про его программу, до нее нет дела, речь
> не о стиле, хотя это часть концепции, речь о методике написания
> правильных программ, вот об этом и речь.
Именно это я и имел ввиду, т.к. на теоритическое разъяснение ушло бы много времени, поэтому, чтобы далеко не ходить, я взял пример из текущей ветки.
Говорить о том, что код QA :array[1..15]of Integer; не рацоинальный не имеет смысла не видя остальной части кода, где используетсяэтот массив. Ведь, возможно, он используется примерно вот так:
......
QA[3]:=23;
......
ShowMessage(IntToStr(QA));
......
Если это действительно так, то эту ветку можно считать вообще бессмысленным флеймом. Ведь так? Или я может в чём то не прав?
← →
DenKop (2002-08-12 16:48) [43]Маленькая поправка
ShowMessage(IntToStr(QA[3]));
← →
Alx2 (2002-08-12 16:58) [44]>DenKop © (12.08.02 16:48)
Это вы зря QA[3] написали. А где проверка
if 3 in [1..15] // вдруг под символом "3" замаскировалось другое значение?
then QA[3] := Variant(23) // А вдруг кто-то тип QA поменяет?
8)
PS
Согласен, крайности могут быть еще вреднее беспечности, так как можно получить монстра, который кроме проверки корректности своих внутренних структур данных почти ничего не делает.
← →
Anatoly Podgoretsky (2002-08-12 17:01) [45]DenKop © (12.08.02 16:45)
Почему ветка весьма полезная.
Жалко что ее постоянно стараются отвести от темы в сторону личных программ и отношения.
← →
DenKop (2002-08-12 17:08) [46]To Alx2>>
> вдруг под символом "3" замаскировалось другое значение?
Это я слышу в первый раз, а что собственно может замаскироваться под целочисленной константой?
> А вдруг кто-то тип QA поменяет?
Не совсем понял, кто может поменять тип и на каком этапе (User, Developer)? "А вдруг кто-то с помощью IDA игру переделает в какую нибудь систему программирования, например в какую нибудь Bear Pro или Elefant Pro (аналогия с Fox Pro)."
← →
Юрий Зотов (2002-08-12 17:48) [47]Хотелось бы все же прекратить наши всегдашние разборки (странно, почему ну просто никогда без них не обходится?) и вернуться к теме. И не применительно к конкретному коду или программисту, а все же пошире.
Выше Torry высказал идею завести раздел, в котором можно было бы почитать о стиле программирования, приемах и принципах написания безопасного (профессионального, если угодно) кода, посмотреть и разобрать конкретные примеры, возможно, предложить на рецензию свой собственный код и получить конкретные замечания по нему - и т. д. (если, конечно, я правильно понял его мысль).
В связи с этим мне хотелось бы узнать мнение всех программистов по примерно таким вопросам.
1. Нужен ли подобный раздел лично Вам?
Если да, то:
2. Каким Вы себе его представляете?
3. Что хотелось бы в нем ней видеть (какие подразделы и пр.)
4. Организация диалога с его ведущими (или не нужно вообще никакого диалога - просто статьи и все).
5. И т.п. - любые мысли на эту тему.
← →
Игорь Шевченко (2002-08-12 17:58) [48]Юрий Зотов © (12.08.02 17:48)
У Тейксейры и Пачеко есть целая глава про стиль программирования, вроде, достаточно...
С уважением,
← →
RV (2002-08-12 18:01) [49]Мне нужен
тоже форум, но с предмодерацией как на Королевстве Дельфи
да главное начать - далее на усмотрение ведущего
← →
DenKop (2002-08-12 18:18) [50]
> Хотелось бы все же прекратить наши всегдашние разборки (странно,
> почему ну просто никогда без них не обходится?) и вернуться
> к теме.
Согласен, просто очень часто, наши многоуважаемые мастера пытаются показать свой проффесионализм (или же обратное). Берёт зло и обида, т.к. обращение нащих профи с посетителями оставляет желать лучшего (пример VEG и не только, на моей памяти уже было три ветки такого рода). Ну да ладно, не будем о плохом.
> 1. Нужен ли подобный раздел лично Вам?
Думаю мне было бы очень интересно почитать, что угодно по этой теме, т.к. ничего подобного в сети не встречал.
> 3. Что хотелось бы в нем ней видеть (какие подразделы и пр.)
Думаю разделять на большое колличество подразделов не стоит. Думаю этого достаточно:
1. Общие принципы.
2. Правила красивого кода на API.
3. Скелеты безопасных конструкций. (думаю пояснений не нужно)
> 4. Организация диалога с его ведущими (или не нужно вообще
> никакого диалога - просто статьи и все).
Лично для меня набора статей было бы вполне достаточно.
Есть другой вопрос, где взять столько инфы и кто этим будет заниматься?
← →
Romkin (2002-08-12 18:20) [51]2Юрий Зотов: Хотелось бы... А то после всех разговоров уже и думаю: вдруг неоптимально пишу?
2. Что-то вроде FAQ на этом сайте, возможно, как помесь со статьями (Новости раздела при входе)
3. Думаю, подразделы видны: Object Pascal, работа с WINAPI...
4. Не нужно диалога, форумы для этого есть. А вот форма для постинга своего кода на проверку должна быть. А после проверки ИМХО желательна возможность задать уточняющие вопросы проверившему (от автора постинга), и тд
5. И тп...
← →
FLIZ_ (2002-08-12 18:24) [52]мне нужен.
хочется :
1. увидеть образцы "эталлонного" безопасного кода по разной
тематике - работа с базами, с объектами, со стандартными
функциями ...
2. иметь возможность получить объяснения почему
он считается безопасным.
3. прислать свой код "на проверку", т.е. вынести его
прилюдно на обсуждение.
4. И ПЕРЕСТАТЬ в конце-концов РУГАТСЯ КАК ПОЛНЫЕ ...
давайте же черт возьми помнить зачем мы здесь, на форуме.
Лично я здесь УЧУСЬ!
← →
Malder (2002-08-12 18:46) [53]Еще примерчик, в Вашего разрешения.
Вариант 1:
if <условие1> and <условие2> then...
Вариант 2:
if <условие1> then
if <условие2> then...
Вроде бы, одно и то же? Ан, нет
Можно, пожалуйста, пример, когда эти два кода будут выполнять НЕОДИНАКОВЫЕ действия.
← →
Anatoly Podgoretsky (2002-08-12 19:21) [54]В настройках есть пункт Complete Boolean Eval и соответствующая директива ($BOOLEVAL), поведение первого кода будет зависить от их состояния, во втором случае нет, второе выражение будет выполняться только если выполнится первое, а для первого варианта всегда. Естественно результаты могут быть разные.
Такая подлая малозаметная ошибка.
← →
MrBeer (2002-08-12 19:23) [55]To Malder:
skazali eto zavisit ot kompilyatora/opcii, t.k. ne yasno kotoraya chastj iz "if <условие1> and <условие2> then..." budet proveryatsja pervoi условие2 ili условие1. A kogda naprimer variant iz serii if (Something<>nil) and (Something.Size<>0) then... mozhet vizivatj access violation
← →
vuk (2002-08-12 19:28) [56]to Malder:
>Можно, пожалуйста, пример, когда эти два кода будут выполнять
>НЕОДИНАКОВЫЕ действия.
Так там же все написано. Все зависит от того, какая схема вычисления булевых выражений используется.
Паример.
procedure SomeProc( DataSet : TDataSet );
begin
if (DataSet <> nil) and DataSet.Active then
begin
...
end;
end;
Предположим, что в эту процедуру передано значение nil.
1. Используется короткая схема вычисления. Производится вычисление первого условия. Оно не выполняется, поэтому можно заранее предсказать резкльтат всего логического выражения - это false. Поэтому второе условие не проверяется.
2. Используеется полное вычисление выражений. В этом случае выражения вычисляются полностью, поэтому, в отличие от первого случая, будет предпринята попытка получить значение свойства DataSet.Active. Но поскольку DataSet = nil, получим Access Violation.
Если же код переписать так
if (DataSet <> nil) then
if DataSet.Active then
...
То он будет работать правильно в любом случае.
Что же касается сложностей при групповой разработке и разных настроек компилятора на разных машинах, о которых упоминал Юрий Зотов, то это легко решается несколькими путями:
1. Административно. Нужно договориться об определенных настройках компилятора или утвердить их как внутренний стандарт.
2. Файл настроек параметров компилятора должен являться частью общего кода.
3. Настройки компилятора прописываются непосредственно в исходном коде. Как вариант - include. В этом случае всегда гарантируется правильная компиляция, т.к. опции, прописанные в исходниках имеют приоритет над установками компилятора в IDE.
← →
Anatoly Podgoretsky (2002-08-12 19:34) [57]К тому же как обратил внимание MrBeer последовательность проверки может быть разной, так как проверяться должны оба условия, то не обязательно в этой последовательности.
← →
Malder (2002-08-12 19:39) [58]Точно, точно. Торможу...
← →
vuk (2002-08-12 19:44) [59]Я привел простейший случай... Естественно, что в сложных выражениях все будет еще более запущено. :o) Еще хуже будет, если в выражении будут использоваться функции, которые делают что-то необратимое и результат работы которых зависит от результата предыдущих проверок.
← →
Anatoly Podgoretsky (2002-08-12 19:49) [60]Лучше использовать термин функционал - функция с побочными действиями, тут вообще только держись
← →
Юрий Зотов (2002-08-12 23:43) [61]Уважаемые доны (как говаривал небезызвестный дон Румата), извините за назойливость, но все же убедительно прошу высказаться по поводу моего последнего постинга (не считая этого) :о)
Особо прошу высказаться молодых программистов - в данном случае гораздо важнее именно Ваше мнение.
← →
Oleg_Gashev (2002-08-12 23:54) [62]> Юрий Зотов
Руками и ногами за. Давно пора.
← →
Torry (2002-08-13 00:08) [63]Я все подверждаю, и искренне извиняюсь перед Алексеем Вуколовым - также приглашаю принять участие...
← →
Anatoly Podgoretsky (2002-08-13 00:24) [64]Дело за организацией, за формой
← →
vuk (2002-08-13 01:36) [65]to Юрий Зотов:
По пунктам.
>1. Нужен ли подобный раздел лично Вам?
Видимо да. Учиться нужно всегда. А тут такая возможность поучиться на чужих ошибках, да еще (если вдруг) с разбором полетов. :o)
>2. Каким Вы себе его представляете?
С этим хуже. Это надо думать... Все, по большей части, зависит от того, кто будет этим заниматься.
>3. Что хотелось бы в нем ней видеть (какие подразделы и пр.)
Стандарты и стили оформления кода (об этом в этой ветке много говорили). Приемы безопасного/оптимального кодирования. Возможно методики локализации ошибок.
>4. Организация диалога с его ведущими (или не нужно вообще
>никакого диалога - просто статьи и все).
Зависит, опять же, от того, кто это будет организовывать и от его подхода к организации ресурса. Мне больше нравится подход, когда основой построения являются материалы и уже к ним привязаны обсуждения. Примерно так, как на Королевстве Delphi.
to Torry:
>и искренне извиняюсь перед Алексеем Вуколовым
Не стоит извинений.
← →
blackweber (2002-08-13 01:45) [66]было бы очень хорошо
← →
Виктор Щербаков (2002-08-13 10:33) [67]Юрий Зотов © (12.08.02 23:43)
1. Руками и ногами за. Такой раздел несомненно нужен.
2. Раздел должен дополнять форум, а не заменять его. В то же время он не должен быть статичным. Иначе станет нафиг никому не нужным. В связи с этим предлагаю следующие разделы:
3. а) статьи разных авторов.
б) регулярный разбор полетов (благо, материалов для этого в форуме предостаточно), которым бы занимались ведущие. Разделы по темам (Win API, OP, BD,...), ИМХО, не нужны.
в) как дополнение: борландовский стандарт кодирования на русском языке (то что у Тейксейры и Пачеко).
г) ...больше ничего в голову не приходит.
4. Насчет рецензирования своего кода, даже не знаю. Форум с этой задачей неплохо справляется. Стоит только обратиться с такой просьбой в соответствующий раздел форума. Другое дело, когда при обсуждении появляется кривой код, и он остается без внимания. Вот именно его и нужно разбирать в этом разделе (не весь конечно, только наиболее яркие образцы).
← →
Сатир (2002-08-15 14:44) [68]2Юрий Зотов © (12.08.02 17:48)
было бы очень не плохо, если бы реализовалась Ваша идея, поскольку именно комментарии, имхо, куда больше дают возможность понять сам компилятор и его возможности, чем простой пример кода на тривиальный вопрос.
К тому же, такой подход и более продуктивен, поскольку будет представлять потенциал получения инфы о тонкостях самого программирования, что в свою очередь позволит более точно решать поставленные задачи.
с уважением, начинающий программист
← →
kull (2002-08-15 18:29) [69]2 VEG
var
L:Integer;
S:String;
begin
L:=Length(S);
Inc(L,-3);
If L<0 then L:=0;
SetLength(S,L);
end;
Ненавижу if-ы.
То же самое в одной строкой и без условных операторов:
SetLength(S,Integer(Length(S)>2)*(Length(S)-3));
И не менее надежно...
(Помоему я уже писал про этот код тоже самое, но не помню где... )
← →
DiamondShark (2002-08-15 18:45) [70]
> kull © (15.08.02 18:29)
В отладчике на машкод посмотрите, и решите раз и навсегда: имеет ли смысл ломать мозги, а через два дня и глаза от такого кода.
Кстати, это же можно посоветовать и сторонникам "лаконичности" Ц++
← →
Юрий Зотов (2002-08-15 19:14) [71]> kull © (15.08.02 18:29)
> И не менее надежно...
Абсолютно ненадежно. Отличный пример грубого нарушения принципов безопасного программирования - привязка к внутренней реализации.
В существующей версии компилятора False=0, True=1 и Ваш код работает. Однако, согласно официальной документации False=0, а True<>0. Поэтому, стоит завтра Borland"у решить, что удобнее, например, True=-1 - и Ваш код тут же перестал работать. А Borland не будет виновата - она осталась строго в рамках своей документации.
← →
^Sanya (2002-08-15 19:50) [72]
> 1. Нужен ли подобный раздел лично Вам?
Да, нужен. Я давно ищу чего-то подобного. К сожалению главы из классики (Тейксейер&Пачеко), на мой взгляд, недостаточно.
> Если да, то:
>
> 2. Каким Вы себе его представляете?
Зависит от того, сколько свободного времени наёдут Юрий Зотов и другие уважаемые мастера: если много, то хотелось бы увидеть возможность выставления+обсуждения своего кода
> 3. Что хотелось бы в нем ней видеть (какие подразделы и
> пр.)
вначале один раздел (вроде "общих вопросов"), а затем, если потребуется, выделять подразделы, и.е. от Общего к Частному по мере надобности,...постепенно. Если, к примеру, вопросов по WinAPI ставовится много, то создаёте подраздел по WinAPI.
> 4. Организация диалога с его ведущими (или не нужно вообще
> никакого диалога - просто статьи и все).
Да, хотелось бы.
> 5. И т.п. - любые мысли на эту тему.
Если реально, показывать народу свою программу с последующим обсуждением.(что-то вроде "Полигона" в Королевстве)
← →
evgeg (2002-08-15 20:17) [73]В существующей версии компилятора False=0, True=1 и Ваш код работает. Однако, согласно официальной документации False=0, а True<>0.
The most common use of a Boolean expression is with relational operators and conditional statements. Since Boolean types are enumerated types, the following relationships apply:
False < True
Ord(False) = 0
Ord(True) = 1
Succ(False) = True
Pred(True) = False
Unlike Boolean variables, which can only assume the values 0 (False) or 1 (True) , ByteBool, WordBool, and LongBool can assume other ordinal values where 0 is False and any nonzero value is True.
Поставить Ord (..) вместо integer (..) -- и все будет абсолютно корректно. Хотя если судить по второму выделенному отрывку и integer (..) корректно.
← →
evgeg (2002-08-15 20:41) [74]В общем то, если в лог. выражении может использовать не Boolean булевский тип, то integer лучше не ставить. Ord будет работать корректно всегда.
← →
Anatoly Podgoretsky (2002-08-15 20:49) [75]Это типичный трюк
← →
Jeer (2002-08-15 21:16) [76]>kull © (15.08.02 18:29)
>Ненавижу if-ы.
>То же самое в одной строкой и без условных операторов:
>SetLength(S,Integer(Length(S)>2)*(Length(S)-3));
Это - что-то.
Пример, как не надо писать, по крайней мере на Паскале.
И чего бы не вспомнить незабвенные времена:
Как это:
char far *(far *getint)(int far *);
высказать ?
← →
Игорь Шевченко (2002-08-16 11:13) [77]Jeer © (15.08.02 21:16)
>char far *(far *getint)(int far *);
А что тот, собственно, непонятно ? И, главное, как это можно по-другому объявить ? :-)))
← →
Виктор Щербаков (2002-08-16 11:18) [78]
> char far *(far *getint)(int far *);
Когда я пытаюсь это сказать словами, получается с междометиями и без падежей :)))
← →
Игорь Шевченко (2002-08-16 11:28) [79]Виктор Щербаков © (16.08.02 11:18)
Указатель на функцию, возвращающую указатель на строку символов, и принимающую параметром указатель на целое число.
Я про паскаль тоже много всего интересного могу наговорить, только вот надо ли ?
← →
Jeer (2002-08-16 11:29) [80]Я и не сказал, что это плохая или неверная конструкция или есть короче запись или понятнее.
Ремарка была о том, что не надо вслепую переносить сишные приемы на паскаль.
Страницы: 1 2 3 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.63 MB
Время: 0.011 c