Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

begin...end   Найти похожие ветки 

 
Игорь1   (2004-08-15 12:10) [0]

Подскажите, пожалуйста, имеет ли смысл писать begin вот в таких ситуациях и если да, то почему.
спасибо.

if x <> 0 then
begin // ?
for i := 0 to 10 do
begin
...
...
end;
end;

или

if x <> 0 then
begin // ?
case x of
1:
...
2:
...
end;
end;

или можно проще:

if x <> 0 then
for i := 1 to 10 do
begin
...
...
end;


 
YurikGL ©   (2004-08-15 12:12) [1]


> или можно проще:
>
> if x <> 0 then
> for i := 1 to 10 do
> begin
> ...
> ...
> end;

Вполне рабочий вариант
Правда try+except не мешало бы


 
jack128 ©   (2004-08-15 12:13) [2]

Я дополнительньх end"ов не пишу. Но отступы делаются в обязательном порядке!!!


 
Anatoly Podgoretsky ©   (2004-08-15 12:14) [3]

Дело вкуса.


 
TeNY ©   (2004-08-15 12:20) [4]

я всегда ставлю потому что иногда в таких ситуациях происходит ошибочный переход
неправильно:
if a>z then
if a=b then...;
else ...

правильно:
if a>z then
begin
if a=b then...;
end
else ...


 
YurikGL ©   (2004-08-15 12:25) [5]


> TeNY ©   (15.08.04 12:20) [4]

Правильно
if a>z and a=b then


 
YurikGL ©   (2004-08-15 12:30) [6]

косякс...

if (a>z) and (a=b) then begin
.....                   end
                  else begin
                       end;


 
YurikGL ©   (2004-08-15 12:32) [7]

Хотя все зависит от того, к какому if-у должно семантически относится else


 
TUser ©   (2004-08-15 13:59) [8]

Я пишу begin ... end, если там несколько операторов или есть вложенный if с else"ом, а у данного if тоже есть esle. Т.е. собственно тогда, когда это действительно необходимо. Хотя, если бы мне платили за строчку кода, то всегда бы писАл :)


 
Anatoly Podgoretsky ©   (2004-08-15 14:06) [9]

Если бы платили за строчки, то писал бы так

if
 условие
then
begin
...
end;


 
TeNY ©   (2004-08-15 16:57) [10]


> YurikGL ©   (15.08.04 12:25) [5]
>
> > TeNY ©   (15.08.04 12:20) [4]
>
> Правильно
> if a>z and a=b then

Ты не учи меня как циклы правильно писать я ведь не определённый цикл показывал  а суть то есть сам принцип а вся эта фигня со скобками дело мутное и трудно отлаживаемое


 
YurikGL ©   (2004-08-15 17:34) [11]


> иногда в таких ситуациях происходит ошибочный переход

Это простите как? То есть иногда делфи правильно переход делает, иногда ошибочно?
Может для большей читабельности кода используешь begin..end? В это поверю. А в то, что делфи неправильно переходит....

> Ты не учи меня как циклы правильно писать

И где здесь циклы?


 
Anatoly Podgoretsky ©   (2004-08-15 17:44) [12]

YurikGL ©   (15.08.04 17:34) [11]
Это перефразированя фраза - не учите меня жить


 
YurikGL ©   (2004-08-15 17:52) [13]

Anatoly Podgoretsky ©   (15.08.04 17:44) [12]


> неправильно:
> if a>z then
> if a=b then...;
> else ...
>
> правильно:
> if a>z then
> begin
> if a=b then...;
> end
> else ...


Оба варианта правильны в зависимости от того, какая логика выполнения требуется от программы. Единственное, что не правильно в первом варианте это - ; но компилятор просто ругнется на это.


 
Михаил Макушев   (2004-08-15 18:03) [14]

>Правильно
>if a>z and a=b then
Такая ситуация не пойдет если в проверке условий используются скажем критичные на разрушение программы функции (проверка созданий объектов и пр.) тогда только такой вариант c двойным IF


 
Юрий Зотов ©   (2004-08-15 18:44) [15]

Никогда не пишу:
1. Лишние begin-end.
2. Лишние скобки.
3. Лишние точки с запятой.
4. И вообще ничего лишнего.

Можно сказать, что все это - дело вкуса. Но правило "в программе не должно быть ничего лишнего" заставляет постоянно думать - то есть, дисциплинирует и приучает к аккуратности при кодировании. В итоге снижается количество ошибок - вот зачем это нужно.

В частности, приведенный выше пример

if a > z then
begin
 if a = b then...;
end
else ...

я бы написал так:

if a <= z then
  ...
else
 if a = b then ...


 
GuAV ©   (2004-08-15 20:16) [16]

А в таких случаях пишут:
         if Condition1 then
           if Condition2 then
             Statement1
           else
         else Satement2;

или
         if Condition1 then
         begin
           if Condition2 then
             Statement1;
         end
         else Satement2;


 
Юрий Зотов ©   (2004-08-15 20:18) [17]

Добавление.

Этот пример я бы написал так в том случае, если скорость исполнения данного уска некритична, или если мне заранее ничего не известно о возможных значениях A, B и Z.

В противном же случае есть правило - писать цепочку проверок так, чтобы результат был получен как можно быстрее. И когда скорость критична, то она важнее, чем лишние begin-end.


 
GuAV ©   (2004-08-15 20:25) [18]

GuAV ©   (15.08.04 20:16) [16]
Знак вопрса пропустил...


 
Anatoly Podgoretsky ©   (2004-08-15 20:29) [19]

Когда скорость важна, то требуется просмотреть код условных операторов в окне CPU, что бы выполнялось наиболее вероятное и часто условие, иначе будет пенальти по тактам. Если видно, что переход неверный, то сменить условие на инверсное.


 
GuAV ©   (2004-08-15 20:39) [20]

Anatoly Podgoretsky ©   (15.08.04 20:29) [19]

И зачем Вы тогда пишете
> begin...end
, писали бы asm...end ;-)


 
Anatoly Podgoretsky ©   (2004-08-15 20:51) [21]

Затем, что ассемблер надо использовать только в исключительных случаях, когда на паскеле не получается (работа с флагами) или когда выходит действительно серьезное повышение производительности. Код на ассемблере будет не транспортабельный в .net
Поэтому я использую асм код в очень редких случаях. Оптимизатор у Дельфи достойного уровня.


 
Vetek_2   (2004-08-15 21:01) [22]

у меня раз были крупные  проблемы с тем, к какому IF"у относится else ....
(прога жутко глючила, не сразу догадался где ошибка была..)
- в итоге я сейчас пишу в таких случаях обязательно begin end :))
- имхо очень повышает понятность логики работы :)))


 
GuAV ©   (2004-08-15 21:25) [23]


> Оптимизатор у Дельфи достойного уровня.

Мда. Разработчики средства разработки оптимизируют компилятор под приложения, чтобы генерировать инструкции хорошо в любой ситуации.
Разработчики приложения оптимизируют код приложения под компилятор, чтобы генерировать инструкции хорошо в конкретной ситуации. Сами явно задать инструкции не могут.
Причём производительность оценивают через Debug Windows->CPU. То что вроде как бы для отладки, а не для оптимизации.
И всё ради транспортабельности в нет. А ведь такая отимизация может быть не портируема даже от компилера к компилеру. Например в Дельфи лучше не использовать переменную цикла повторно, чтобы он мог её в "регистры запузырить". В каком то паскале все переменные в стеке, т.е. лучше использовать повторно. При этом хотим портировать "в другой мир". Клоунада...


 
Германн ©   (2004-08-16 03:21) [24]

И все таки возвращаясь к сабжу:

Игорь1   (15.08.04 12:10)  
Подскажите, пожалуйста, имеет ли смысл писать begin вот в таких ситуациях и если да, то почему.
спасибо.

if x <> 0 then
begin // ?
for i := 0 to 10 do
begin


В таких случаях я почти всегда пишу и begin и end.
Дело в том, что и then и do, в общем случае предполагают наличие за ними некоего "тела", т.е. набора строк исходного текста, которые все либо должны быть выполнены, либо не выполнены, либо выполнены частично.
Поэтому и тело then и тело for богут быть весьма длинными, или не быть таковыми. А для удобочитаемости я всегда (иногда по необходимости, а иногда для удобства) использую begin и end.

А компиллятор и оптимизатор Дельфи, при этом, не создают мне лишних проблем.


 
Anatoly Podgoretsky ©   (2004-08-16 07:34) [25]

GuAV ©   (15.08.04 21:25) [23]
Ты представляешь как работает предсказание в Пентиумах?


 
panov ©   (2004-08-16 09:52) [26]

В 99% случаях пишу begin..end, так как для меня важна читабельность кода, а не количество символов в исходном коде.


 
Anatoly Podgoretsky ©   (2004-08-16 09:55) [27]

Тоже почти всегда, а если есть else то всегда


 
Григорьев Антон ©   (2004-08-16 10:24) [28]

Я предпочитаю делать так: вместо

if ... then
begin
 ...
 ...
 ...
end
else
X:=0;

писать

if ... then
begin
 ...
 ...
 ...
end
else
begin
 X:=0
end;

Чтобы у двух веток if было единообразие. В остальных случаях лишних begin/end не ставлю.


 
GuAV ©   (2004-08-27 01:12) [29]


> Ты представляешь как работает предсказание в Пентиумах?

Что за Предсказание?


 
ASoft   (2004-08-27 07:44) [30]

Если в теле процедуры много "If" и "Else", то лучше использовать, по возможности, "Case".
Но, порой, трудно отследить всё от begin...If...Else...до последнего end, то лишними begin..end не будут. А будет на подобие упорядочивания. Так думаю.


 
DiamondShark ©   (2004-08-27 13:07) [31]


> Ты представляешь как работает предсказание в Пентиумах?

По звёздам.


 
JohnnyJ   (2004-08-27 13:23) [32]

Я пишу всегда так:

 if (condition) then
 begin
   <одна и более строка кода>
 end
 else
 begin
   <одна и более строка кода>
 end;


Просто наблюдал долгую и кровопролитную битву человека с приложением, когда в ветке else был один оператор, он добавил еще один, а про begin..end забыл. Все компилится, а работает неправильно :)

Отлаживаться он толком не научился, сколько его паяльником и кипятильником не били. Прошел бы в отладке - заметил бы сразу. А так он пнул - данные кривые, полез что-нибудь подровнял в проге, снова пнул.

После этого случая взял себе за правило оформлять код именно так. Т. е. если требуется в конструкции оператор, то я ставлю составной оператор.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.035 c
14-1092838656
Яшка
2004-08-18 18:17
2004.09.12
Мнение, как движущая сила дискуссий.


3-1092898569
jappak
2004-08-19 10:56
2004.09.12
Как игнорировать помечанные записи.


6-1089292828
Flash
2004-07-08 17:20
2004.09.12
Генерация e-mail. Help!


4-1090747632
race1
2004-07-25 13:27
2004.09.12
keys


1-1093340465
oleg_SYS
2004-08-24 13:41
2004.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский