Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.032 c
14-1093149042
ААМ
2004-08-22 08:30
2004.09.12
А ?


14-1093108613
able
2004-08-21 21:16
2004.09.12
PHP. Проверка валидности e-mail a


1-1093807149
mefisto
2004-08-29 23:19
2004.09.12
КОРОЧЕ РЕБЯТА я тот автор вопроса про кнопку ПУСК :)


14-1092990043
guest_Dmitry
2004-08-20 12:20
2004.09.12
Как зарегистрировать класс ActiveX?


3-1092680067
_Dragon
2004-08-16 22:14
2004.09.12
Обновление записей