Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-35853
TCrash
2002-08-16 13:41
2002.09.12
Почему большой ехе


1-35807
demisen
2002-08-30 11:32
2002.09.12
Main Form


1-35753
Mr. Faga
2002-08-30 16:53
2002.09.12
Delphi 7


3-35593
Pavel_S
2002-08-20 13:46
2002.09.12
Interbase


3-35534
Link
2002-08-23 11:37
2002.09.12
Как сделать попроще?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский