Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

begin...end [D6]


Страницы:   1 2

Игорь1 ©   (2004-08-15 12:10:00) 

Подскажите, пожалуйста, имеет ли смысл писать 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;


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

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

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


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

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

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


DiamondShark   (2004-08-27 13:07:00) [2]


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

По звёздам.


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

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


GuAV   (2004-08-27 01:12:00) [4]


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

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


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

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

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

писать

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

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


Anatoly Podgoretsky   (2004-08-16 09:55:00) [6]

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


panov   (2004-08-16 09:52:00) [7]

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


Anatoly Podgoretsky   (2004-08-16 07:34:00) [8]

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


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

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

Игорь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.

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


GuAV   (2004-08-15 21:25:00) [10]


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

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


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

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


Anatoly Podgoretsky   (2004-08-15 20:51:00) [12]

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


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

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

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


Anatoly Podgoretsky   (2004-08-15 20:29:00) [14]

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


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

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


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

Добавление.

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

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


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

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

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


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

Никогда не пишу:
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 ...


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

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


YurikGL   (2004-08-15 17:52:00) [20]

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 ...


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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо