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

Вниз

Люди, которые пишут begin..end вокруг одного оператора   Найти похожие ветки 

 
Игорь Шевченко ©   (2012-12-12 22:37) [0]

Являются тормозом прогресса и врагами нации :)


 
брат Птибурдукова   (2012-12-12 22:39) [1]

Решил во всём походить на Великого Кормчего, душитель свобод? %-)


 
antonn ©   (2012-12-12 22:40) [2]

всегда пишу полностью begin..end и { .. }


 
Dimka Maslov ©   (2012-12-12 22:41) [3]

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


 
Rouse_ ©   (2012-12-12 22:47) [4]


> Игорь Шевченко ©   (12.12.12 22:37) 
> Являются тормозом прогресса и врагами нации :)

Та не, просто не следуют стандартам написания кода, в которых кстати рассмотрен данный случай.


 
Игорь Шевченко ©   (2012-12-12 22:52) [5]

Dimka Maslov ©   (12.12.12 22:41) [3]

И как всякие рудименты должны отмирать. В коде процесс эволюции обычно менее затратен и более быстр, чем в природе.


 
alexdn ©   (2012-12-12 22:55) [6]

> Игорь Шевченко ©   (12.12.12 22:52) [5]
> В коде процесс эволюции
> обычно менее затратен и более быстр, чем в природе.
begin end -> {}?


 
TUser ©   (2012-12-12 22:55) [7]

Полагаю, большинство программистов зачеркнули бы слова "вокруг одного оператора" ))


 
DVM ©   (2012-12-12 22:57) [8]

Иногда, просто begin..end сначала окружают 2 оператора, потом один удаляют по каким либо причинам, удалять begin..end либо лень, либо есть вероятность, что туда потом еще потребуется дописать что-либо. Так оно и остается.
Тоже мне проблема, если это единственная проблема в оформлении кода.

Что же меня лично ну просто бесит, когда в коде программы на Delphi начинают массово использовать вот такие названия _my_super_puper_var и код изобилует такими названиями, все названия переменных функций такие, все выглядит как пропущенное через обфускатор. Речь именно о паскале.

вот например:
http://www.felix-colibri.com/papers/web/tcp_ip_sniffer/tcp_ip_sniffer.html
даже не сразу понятно, что этот код - это паскаль.


 
Inovet ©   (2012-12-12 22:59) [9]

Лучше стразу поставить операторные скобки для одного оператора, чем потом добавить второй и забыть их поставить.
Если без скобок, то писать так:

if(выражение) оператор1;

а не так

if(выражение)
 оператор1;


 
Inovet ©   (2012-12-12 23:02) [10]

> [8] DVM ©   (12.12.12 22:57)
> вот например:
> http://www.felix-colibri.com/papers/web/tcp_ip_sniffer/tcp_ip_sniffer.htm l
> даже не сразу понятно, что этот код - это паскаль.

Он явно на VS C++ раньше писал.


 
Игорь Шевченко ©   (2012-12-12 23:03) [11]

DVM ©   (12.12.12 22:57) [8]


> есть вероятность, что туда потом еще потребуется дописать
> что-либо.


Тогда и надо дописать begin и end, не так ли ? 8 символов написать не так уж и трудно :)


> вот например:
> http://www.felix-colibri.com/papers/web/tcp_ip_sniffer/tcp_ip_sniffer.
> html


Так это прямая переделка с С, возможно, даже автоматическая


 
Игорь Шевченко ©   (2012-12-12 23:05) [12]

Inovet ©   (12.12.12 22:59) [9]


> Лучше стразу поставить операторные скобки для одного оператора


Люди, которые пишут код не думая, не читая и не тестируя, являются дважды тормозом прогресса и врагами нации.


 
Inovet ©   (2012-12-12 23:07) [13]

> [12] Игорь Шевченко ©   (12.12.12 23:05)

У всех свои тараканы.


 
alexdn ©   (2012-12-12 23:07) [14]

Вот потому я и завидую сишникам и пхп шникам, бахнул {} и готово..)


 
antonn ©   (2012-12-12 23:10) [15]


> Тогда и надо дописать begin и end, не так ли ? 8 символов
> написать не так уж и трудно :)

не знаю кто как, а я и begin/end, и любые скобки сразу набираю вместе, потом делаю шаг назад и вбиваю то, что будет у них внутри. Получается быстро, а если учесть, что при необходимости потом придется их писать уже целясь в текст...

к тому же лично мне проще воспринимать такое:
if(visible) then begin
   halt;
end;

if(vasia){
   MessageBox.Show("1");
}


чем такое
if(vasia)
   MessageBox.Show("1");


PS часто пишу в одну строку на дельфи "if(visible) then halt;" когда не надо переносить и оно никогда не будет переноситься или обрастать кодом вокруг :)


 
Rouse_ ©   (2012-12-12 23:10) [16]


> Люди, которые пишут код не думая, не читая и не тестируя,
>  являются дважды тормозом прогресса и врагами нации.

Золотые слова, а мне за это умудрились двойку по статье влупить, мол оскорбил чувства чьи-то :)
http://alexander-bagel.blogspot.ru/2012/12/api.html


 
Inovet ©   (2012-12-12 23:12) [17]

> [15] antonn ©   (12.12.12 23:10)
> к тому же лично мне проще воспринимать такое:

Аналогично.


 
TSas   (2012-12-12 23:14) [18]

Я пишу иногда во вложенных ифах, чтобы написать "//-Да." А в самом низу написать "//если не... "


 
Rouse_ ©   (2012-12-12 23:16) [19]


> к тому же лично мне проще воспринимать такое:
> if(visible) then begin
>    halt;
> end;

Хм, имхо за такое - казнить, мало того что бессмысленно, так еще и не по стандарту оформлено.

А вот второе:
if(vasia){
  MessageBox.Show("1");
}

Это читабельно и по стандарту, в отличие от третьего примера...


 
DVM ©   (2012-12-12 23:17) [20]


> Игорь Шевченко ©   (12.12.12 23:03) [11]

> <

I>
> Так это прямая переделка с С, возможно, даже автоматическая

Не, это автор кода видно фанат такого стиля, там даже элементы интерфейса так названы. Это и для Си жесть какая то.


 
antonn ©   (2012-12-12 23:19) [21]

а третий пример я часто вижу и в мсдн, кстати


 
Rouse_ ©   (2012-12-12 23:22) [22]


> antonn ©   (12.12.12 23:19) [21]
> а третий пример я часто вижу и в мсдн, кстати

пруфлинк


 
RWolf ©   (2012-12-12 23:33) [23]


>  [14]

кто-то пишет begin/end побуквенно?


 
antonn ©   (2012-12-12 23:42) [24]


> Rouse_ ©   (12.12.12 23:22) [22]

сейчас не найду, но если увижу - скину :)


 
Inovet ©   (2012-12-12 23:44) [25]

Из исходника Builder dstring.cpp

if (src)
{
 while (*src++)
   ++len;
}

...

if (idx < 1 || idx > Length())    // NOTE: AnsiString is 1-based !!
 throw Sysutils::ERangeError(System_Sysconst_SRangeError);


 
Inovet ©   (2012-12-12 23:46) [26]

> [25] Inovet ©   (12.12.12 23:44)

Бардак-с?


 
Игорь Шевченко ©   (2012-12-12 23:55) [27]

Inovet ©   (12.12.12 23:07) [13]

Это не тараканы, это горький опыт :)


 
Аббат Пиккола   (2012-12-13 00:01) [28]

Да, и еще враги те, кто избыточные точки с запятой после end ставят. :)


 
Игорь Шевченко ©   (2012-12-13 00:07) [29]

Rouse_ ©   (12.12.12 23:10) [16]


> мне за это умудрились двойку по статье влупить


Статью прочитал, двойку не увидел, недокументированные API стоит использовать в очень редких и особых случаях, не забывая, что завтра они могут стать другими, удалиться или перестать соответствовать той цели, ради которой использовались.

Как пример изменений могу привести функции работы с CSRSS в NTDLL - их сигнатура изменилась при переходе от Windows 2000 к XP


 
имя   (2012-12-13 00:12) [30]

Удалено модератором


 
Inovet ©   (2012-12-13 00:15) [31]

Удалено модератором


 
имя   (2012-12-13 00:18) [32]

Удалено модератором


 
Ega23 ©   (2012-12-13 00:36) [33]


> кто-то пишет begin/end побуквенно?

Плюс мильён. Среда сама подставляет, как минимум end; :)


 
Empleado ©   (2012-12-13 00:43) [34]


> Являются тормозом прогресса и врагами нации

+1 !!!!!

а еще те, кто ";" перед end ставят; :)))
а еще те, кто begin .. end ставят сразу между repeat .. until


 
TSas   (2012-12-13 00:53) [35]

>а еще те, кто ";" перед end ставят; :))) Я всегда ставлю. Оператор должен, ИМХО, быть завершённым, а вдруг потом ещё один надо вставить?


 
TStas   (2012-12-13 00:54) [36]

Ой, я в нике буковку пропустил. :(


 
Pavia ©   (2012-12-13 01:02) [37]

Очень часто

if () then
Oper1;


Просто бывает что оптимизатор выкидывает строку  Oper1 и на неё невозможно брейкпоинт поставить.
А если сделать так

if () then
Begin
Oper1;
end;

То брейкпоинт ставиться.


 
Германн ©   (2012-12-13 01:49) [38]


> Pavia ©   (13.12.12 01:02) [37]
>
> Очень часто
> 1
> 2
>  
> if () then
>  Oper1;
>
>
> Просто бывает что оптимизатор выкидывает строку  Oper1 и
> на неё невозможно брейкпоинт поставить.
> А если сделать так
> 1
> 2
> 3
> 4
>  
> if () then
>  Begin
>  Oper1;
>  end;
>
> То брейкпоинт ставиться.

А отключить оптимизатор что не позволяет?


 
Германн ©   (2012-12-13 01:58) [39]


> Да, и еще враги те, кто избыточные точки с запятой после
> end ставят. :)

А вот это я расцениваю либо как неудачную шутку разработчиков паскаля, либо как удачную шутку вышеуказанных. :)


 
Дмитрий С ©   (2012-12-13 04:26) [40]


> Плюс мильён. Среда сама подставляет, как минимум end; :)

Среда, стерва такая, перестает дописывать их, если есть вложенная процедура или замыкание :(

По теме. Осознанно пишу begin end для одного оператора в условиях с многооператорным ELSE-ом, например:
if conditional then
begin
 operator1
end
else
begin
 operator2;
 operator3;
end;


ЗЫ. Посмотреть бы на повседневный код автора:)


 
Anatoly Podgoretsky ©   (2012-12-13 07:48) [41]

> Игорь Шевченко  (12.12.2012 22:37:00)  [0]

И увеличивабт энтропию вселенной


 
Eraser ©   (2012-12-13 07:58) [42]


> antonn ©   (12.12.12 23:10) [15]


> if(visible) then begin
>    halt;
> end;

вот это куда большее зло, чем сабж )


 
Студент   (2012-12-13 08:28) [43]

function ZLO(a,b,c,d:integer):integer;
begin
  return ifthen(a<b, b+c, c+d);
end;


 
Игорь Шевченко ©   (2012-12-13 09:49) [44]

Anatoly Podgoretsky ©   (13.12.12 07:48) [41]

Не то слово. Тепловая смерть не за горами.

Дмитрий С ©   (13.12.12 04:26) [40]


> ЗЫ. Посмотреть бы на повседневный код автора:)


Открой исходники VCL - мой код по стилю примерно такой же.


 
RWolf ©   (2012-12-13 09:52) [45]


> Германн ©   (13.12.12 01:58) [39]
> > Да, и еще враги те, кто избыточные точки с запятой после
> > end ставят. :)А вот это я расцениваю либо как неудачную
> шутку разработчиков паскаля, либо как удачную шутку вышеуказанных.
>  :)

всё логично же: точка с запятой — разделитель операторов, begin/end — составной оператор.


 
Андреевич   (2012-12-13 10:26) [46]


> Eraser ©   (13.12.12 07:58) [42]
>
> > antonn ©   (12.12.12 23:10) [15]
>
>
> > if(visible) then begin
> >    halt;
> > end;
>
> вот это куда большее зло, чем сабж )

так сабж же об этом


 
O'ShinW ©   (2012-12-13 11:03) [47]

кстати,
вот еще круче :)
...
begin
end;
..

http://delphimaster.net/view/2-1353997983/


 
Студент   (2012-12-13 11:17) [48]

TZlo=class
  protected:
      procedure PowZlo; virtual;
end;

implementation

procedure TZlo.PowZlo;
begin
end;


 
Inovet ©   (2012-12-13 11:28) [49]

> [47] O"ShinW ©   (13.12.12 11:03)
> вот еще круче :)

Автор не виноват. Это такое дали скопипастить.


 
Правнук Винни-пуха   (2012-12-13 11:36) [50]

Когда начинал работать на Pascal, все устраивало.  А после Си-подобного синтаксиса как только не располагал begin/end, везде кажутся громоздкими и нечитаемыми:

if () then
begin
...
end
else
begin
...
end;


if ()
then
begin
...
end
else
begin
...
end;


Ну и последние 2 примера: то, что в C++ хорошо, в Object Pacal смерть :)

if () then begin
...
end
else begin
...
end;


if () then begin
... end
else begin
... end;


 
Владислав ©   (2012-12-13 11:39) [51]


> Игорь Шевченко ©   (12.12.12 22:37)  
> Являются тормозом прогресса и врагами нации :)


Я не спорю с begin...end. C "врагами нации" тоже все ясно. :)
Но почему "тормоз прогресса"? :) Можно подробнее?


> Дмитрий С ©   (13.12.12 04:26) [40]
>  ...
> ЗЫ. Посмотреть бы на повседневный код автора:)


Довелось видеть. Аж противно, что придраться не к чему. :о)


 
Юрий Зотов ©   (2012-12-13 11:50) [52]

А если вот так:

if a > b then
begin
 a := b;
 b := 0
end
else
 begin
   b := a;
   a := 0
 end;


 
Polevi ©   (2012-12-13 12:25) [53]

В самом распространенном ЯП России по другому вообще никак

Если Истина Тогда
 Сообщить("Истина");
КонецЕсли;


 
icWasya ©   (2012-12-13 12:29) [54]

>а есть ещё те, кто ";" перед end ставят; :)))
Вот чего в паскале точно нельзя, так это ставить ";" перед else :(((


 
O'ShinW ©   (2012-12-13 12:31) [55]

так:

if a > b then
begin
a := b;
b := 0
end else
begin
 b := a;
 a := 0
end;


 
Дмитрий С ©   (2012-12-13 12:31) [56]


> Довелось видеть. Аж противно, что придраться не к чему.
> :о)

Придраться не к чему? Так не бывает :)


 
Пит   (2012-12-13 12:34) [57]

по сабжу - не согласен. То есть, можно конечно и не ставить, но ничего плохого в коде:

if () then
begin
  opaGangamStyle;
end;


не вижу. Потому что код в редакторе мог писаться в такой последовательности:

if () then
begin_ //  <--  курсор здесь


далее жмем enter и современная среда или эксперт вставляет автоматом end;

Только потом идет осознание, что блок состоит всего из одного оператора и зачем париться и удалять begin..end? К тому же не так уж маловероятно, что код будет дополнен.

Плюс это позволяет избежать забавных ошибок, трудно воспринимаемых, особенно при правильном форматировании (как раз недавно нашел такую в чужом коде):

if (Condition) then
  Obj := GetMyObj;
  SetContext(Obj);
  WriteLog(Obj.Id);
...


И ты знаешь, что Condition ТОЧНО ВЫПОЛНЯЕТСЯ, а вот в логах ничего не видишь. Долго думаешь - почему так?

Особенно, что некоторые любят писать:

if (Condition) then begin
  Obj := GetMyObj;
  SetContext(Obj);
  WriteLog(Obj.Id);
...


и в VCL это также встречается.

Есть посложнее варианты, типа такого:

if (Condition1) then
  Obj := GetMyObj;
  if (Condition2) then
     SetContext(Obj);
...


по запарке начинающий программист может просто с ума сойти на отладке. Он вроде точно видит, что Condition2 верное условие, но исполнение даже при трассировке после второй строчке уходит из программы.

Так что на мой взгляд привычка всегда ставить begin..end не такая уж и плохая. Не призываю всех так делать, но и ругать тут не за что.


 
Пит   (2012-12-13 12:43) [58]


> В самом распространенном ЯП России по другому вообще никак
>
> Если Истина Тогда
>  Сообщить("Истина");
> КонецЕсли;


в PL/SQL тоже.


 
Пит   (2012-12-13 12:46) [59]


> И ты знаешь, что Condition ТОЧНО ВЫПОЛНЯЕТСЯ, а вот в логах
> ничего не видишь

Надо читать так:

И ты знаешь, что Condition ТОЧНО НЕ ВЫПОЛНЯЕТСЯ, а вот в логах все равно видишь запись )


 
Игорь Шевченко ©   (2012-12-13 12:59) [60]

Владислав ©   (13.12.12 11:39) [51]


> Но почему "тормоз прогресса"? :) Можно подробнее?


Потому что тормозят прогресс, что тут неясного ?


> ЗЫ. Посмотреть бы на повседневный код автора:)


unit  main; interface  procedure Test;  implementation uses  SysUtils,  Contnrs,
Classes,  Mail2000; type  EMail2000GatewayError=  class(Exception  )end;   const
MAIL_BULKSUFFIX="/BULK"; MAIL_BODYFILENAME="letter.body"; type EMailGatewayError
=class(Exception);TEmailAttachment=class private FFileName:string;FSize:Integer;
FData: Pointer; public destructor Destroy;
override;property Data:Pointer read FData write FData;property FileName:  string
read FFileName write FFileName;property Size:Integer read FSize write FSize;end;
TEmailAttachments=class(TObjectList   )private   function GetItems(I:  Integer):
TEmailAttachment   ; public  property Items[I  :Integer]  :TEmailAttachment read
GetItems;   default;end;  TLetterState=(  lsReceived,   lsProcessed,lsVerifying,
lsVerified,    lsErrorVerify,  lsQueuingTask,  lsNotQueuedTask,   lsQueuedTask);
TEmailLetter   =class private FFromAddress:string  ;FBulkMode :Boolean;FSubject:
string  ;FBody :string  ;FAttachments  :TEmailAttachments   ;FTaskCode  :string;
FState:TLetterState;FUIDL:string;function GetNamebyUIDL:string;public constructor
Create;destructor Destroy;override;property FromAddress:string read FFromAddress
write FFromAddress;property Subject:string read FSubject write FSubject;property BulkMode: Boolean read FBulkMode
write FBulkMode; property Body: string read FBody write FBody; property
Attachments: TEmailAttachments read FAttachments; property TaskCode: string read
FTaskCode write FTaskCode; property State: TLetterState read FState write
FState; property UIDL: string read FUIDL write FUIDL; property NameByUIDL:
string read GetNamebyUIDL; end; procedure Test; const MailHost: string =
"mail.foo.bar"; MailBox: string = "foo"; MailBoxPassword: string = "foobar";
MailPort: Integer = 110; var FPOP: TPOP2000; FMM: TMailMessage2000;
procedure RetrieveMessage(N:Integer)  ;var Letter:TEmailLetter;I,AttachCount,Sz:
Integer;Attachment :TEmailAttachment;FAttach  :TMailPart;Buffer:Pointer;begin if
not FPOP.RetrieveMessage(N)then begin writeln(Format("Can""t retrieve message %d"
,[N]));Exit;end;writeln(Format("Received message from "%s" with subject "%s"",
[FMM.FromAddress, FMM   .Subject]))   ;Letter:=nil  ;try FMM .FindParts;Letter:=
TEmailLetter.Create;Letter  .FromAddress:=string(FMM.FromAddress);Letter.Subject
:=string(FMM.Subject);Letter.Body:=FMM.TextPlain.Text;Letter.UIDL:=FPOP.GetUIDL(
N) ;writeln(Format("Message from "%s" with subject "%s" has UIDL "%s"", [Letter.
FromAddress, Letter.Subject, Letter.UIDL]))  ;AttachCount:=FMM.AttachList.Count;
writeln(Format("Message from %s has %d attachments",[FMM.FromAddress,AttachCount]));
for I:=0 to AttachCount-1 do begin FAttach:=FMM.AttachList[I];try FAttach.Decode;
Sz:=FAttach.Decoded.Size;Attachment:=TEmailAttachment.Create;Attachment.FileName
:=string(FAttach.FileName)  ;writeln(Format("attachment %d has file name "%s"",[
Succ(I),Attachment.FileName])) ;Attachment.Size := Sz;if Sz>0 then begin GetMem(
Buffer,Sz);FAttach.Decoded.Seek(0,soFromBeginning);FAttach.Decoded.Read(Buffer^,
Sz);Attachment.Data:=Buffer;end;Letter.Attachments.Add(Attachment);except on E :
Exception do writeln(Format("Failed to decode attachment %d (%s)",[I,E.Message]));
end;     end;    except on E       :Exception do begin     writeln    (Format  (
"Failed to retrieve message %d (%s)", [N, E.Message]));FreeAndNil(Letter ); end;
end;end;


Где-то так


 
xayam ©   (2012-12-13 13:02) [61]


> что тут неясного ?

не ясно, куда движется прогресс?


 
DVM ©   (2012-12-13 13:04) [62]


> Игорь Шевченко ©   (13.12.12 12:59) [60]

Декодирую :)


procedure Test;

implementation

uses SysUtils, Contnrs,
 Classes, Mail2000;

type
 EMail2000GatewayError = class(Exception)
 end;

const
 MAIL_BULKSUFFIX = "/BULK";
 MAIL_BODYFILENAME = "letter.body";

type
 EMailGatewayError = class(Exception);

 TEmailAttachment = class
 private
   FFileName: string;
   FSize: Integer;
   FData: Pointer;
 public
   destructor Destroy; override;
   property Data: Pointer read FData write FData;
   property FileName: string read FFileName write FFileName;
   property Size: Integer read FSize write FSize;
 end;

 TEmailAttachments = class(TObjectList)
 private
   function GetItems(I: Integer): TEmailAttachment;
 public
   property Items[I: Integer]: TEmailAttachment read GetItems; default;
 end;

 TLetterState = (lsReceived, lsProcessed, lsVerifying, lsVerified,
   lsErrorVerify, lsQueuingTask, lsNotQueuedTask, lsQueuedTask);

 TEmailLetter = class
 private
   FFromAddress: string;
   FBulkMode: Boolean;
   FSubject: string;
   FBody: string;
   FAttachments: TEmailAttachments;
   FTaskCode: string;
   FState: TLetterState;
   FUIDL: string;
   function GetNamebyUIDL: string;
 public
   constructor Create;
   destructor Destroy; override;
   property FromAddress: string read FFromAddress write FFromAddress;
   property Subject: string read FSubject write FSubject;
   property BulkMode: Boolean read FBulkMode write FBulkMode;
   property Body: string read FBody write FBody;
   property Attachments: TEmailAttachments read FAttachments;
   property TaskCode: string read FTaskCode write FTaskCode;
   property State: TLetterState read FState write FState;
   property UIDL: string read FUIDL write FUIDL;
   property NameByUIDL: string read GetNamebyUIDL;
 end;

procedure Test;
const
 MailHost: string = "mail.foo.bar";
 MailBox: string = "foo";
 MailBoxPassword: string = "foobar";
 MailPort: Integer = 110;
var
 FPOP: TPOP2000;
 FMM: TMailMessage2000;
 procedure RetrieveMessage(N: Integer);
 var
   Letter: TEmailLetter;
   I, AttachCount, Sz: Integer;
   Attachment: TEmailAttachment;
   FAttach: TMailPart;
   Buffer: Pointer;
 begin
   if not FPOP.RetrieveMessage(N) then
   begin
     writeln(Format("Can""t retrieve message %d", [N]));
     Exit;
   end;
   writeln(Format("Received message from "%s" with subject "%s"",
     [FMM.FromAddress, FMM.Subject]));
   Letter := nil;
   try
     FMM.FindParts;
     Letter := TEmailLetter.Create;
     Letter.FromAddress := string(FMM.FromAddress);
     Letter.Subject := string(FMM.Subject);
     Letter.Body := FMM.TextPlain.Text;
     Letter.UIDL := FPOP.GetUIDL(N);
     writeln(Format("Message from "%s" with subject "%s" has UIDL "%s"",
       [Letter.FromAddress, Letter.Subject, Letter.UIDL]));
     AttachCount := FMM.AttachList.Count;
     writeln(Format("Message from %s has %d attachments",
       [FMM.FromAddress, AttachCount]));
     for I := 0 to AttachCount - 1 do
     begin
       FAttach := FMM.AttachList[I];
       try
         FAttach.Decode;
         Sz := FAttach.Decoded.Size;
         Attachment := TEmailAttachment.Create;
         Attachment.FileName := string(FAttach.FileName);
         writeln(Format("attachment %d has file name "%s"",
           [Succ(I), Attachment.FileName]));
         Attachment.Size := Sz;
         if Sz > 0 then
         begin
           GetMem(Buffer, Sz);
           FAttach.Decoded.Seek(0, soFromBeginning);
           FAttach.Decoded.Read(Buffer^, Sz);
           Attachment.Data := Buffer;
         end;
         Letter.Attachments.Add(Attachment);
       except
         on E: Exception do
           writeln(Format("Failed to decode attachment %d (%s)",
             [I, E.Message]));
       end;
     end;
   except
     on E: Exception do
     begin
       writeln(Format("Failed to retrieve message %d (%s)", [N, E.Message]));
       FreeAndNil(Letter);
     end;
   end;
 end;


 
O'ShinW ©   (2012-12-13 13:08) [63]

if cond1 then
if cond2 then
  Do1 else
  if cond3  then
    Do2 else
    Do3;
в таком коде, 100% наставлю бегин-эндов (и, возможно, инвертирую условия)

if cond1 then
begin
if not(cond2) then
begin
  if cond3  then
    Do2 else
    Do3;    
end else
  Do1;
end;
кому как, а мне - понятнее..

Все-все, уже иду-иду :)


 
брат Птибурдукова   (2012-12-13 13:19) [64]


> Игорь Шевченко ©   (13.12.12 12:59) [60]
Чё так много пробелов? Нужно рационально расходовать место на жёстком диске.


 
Игорь Шевченко ©   (2012-12-13 13:27) [65]

DVM ©   (13.12.12 13:04) [62]

Много времени заняло ? :) DelForExp несколько не так декодировал


 
Дмитрий С ©   (2012-12-13 13:31) [66]

Ctrl+D, Delphi XE:

unit main;

interface

procedure Test;

implementation

uses SysUtils, Contnrs,
 Classes, Mail2000;

type
 EMail2000GatewayError = class(Exception)
 end;

const
 MAIL_BULKSUFFIX = "/BULK";
 MAIL_BODYFILENAME = "letter.body";

type
 EMailGatewayError = class(Exception);

 TEmailAttachment = class
 private
   FFileName: string;
   FSize: Integer;
   FData: Pointer;
 public
   destructor Destroy; override;
   property Data: Pointer read FData write FData;
   property FileName: string read FFileName write FFileName;
   property Size: Integer read FSize write FSize;
 end;

 TEmailAttachments = class(TObjectList)
 private
   function GetItems(I: Integer): TEmailAttachment;
 public
   property Items[I: Integer]: TEmailAttachment read GetItems; default;
 end;

 TLetterState = (lsReceived, lsProcessed, lsVerifying, lsVerified,
   lsErrorVerify, lsQueuingTask, lsNotQueuedTask, lsQueuedTask);

 TEmailLetter = class
 private
   FFromAddress: string;
   FBulkMode: Boolean;
   FSubject: string;
   FBody: string;
   FAttachments: TEmailAttachments;
   FTaskCode: string;
   FState: TLetterState;
   FUIDL: string;
   function GetNamebyUIDL: string;
 public
   constructor Create;
   destructor Destroy; override;
   property FromAddress: string read FFromAddress write FFromAddress;
   property Subject: string read FSubject write FSubject;
   property BulkMode: Boolean read FBulkMode write FBulkMode;
   property Body: string read FBody write FBody;
   property Attachments: TEmailAttachments read FAttachments;
   property TaskCode: string read FTaskCode write FTaskCode;
   property State: TLetterState read FState write FState;
   property UIDL: string read FUIDL write FUIDL;
   property NameByUIDL: string read GetNamebyUIDL;
 end;

procedure Test;
const
 MailHost: string = "mail.foo.bar";
 MailBox: string = "foo";
 MailBoxPassword: string = "foobar";
 MailPort: Integer = 110;
var
 FPOP: TPOP2000;
 FMM: TMailMessage2000;
 procedure RetrieveMessage(N: Integer);
 var
   Letter: TEmailLetter;
   I, AttachCount, Sz: Integer;
   Attachment: TEmailAttachment;
   FAttach: TMailPart;
   Buffer: Pointer;
 begin
   if not FPOP.RetrieveMessage(N) then
   begin
     writeln(Format("Can""t retrieve message %d", [N]));
     Exit;
   end;
   writeln(Format("Received message from "%s" with subject "%s"",
     [FMM.FromAddress, FMM.Subject]));
   Letter := nil;
   try
     FMM.FindParts;
     Letter := TEmailLetter.Create;
     Letter.FromAddress := string(FMM.FromAddress);
     Letter.Subject := string(FMM.Subject);
     Letter.Body := FMM.TextPlain.Text;
     Letter.UIDL := FPOP.GetUIDL(N);
     writeln(Format("Message from "%s" with subject "%s" has UIDL "%s"",
       [Letter.FromAddress, Letter.Subject, Letter.UIDL]));
     AttachCount := FMM.AttachList.Count;
     writeln(Format("Message from %s has %d attachments",
       [FMM.FromAddress, AttachCount]));
     for I := 0 to AttachCount - 1 do
     begin
       FAttach := FMM.AttachList[I];
       try
         FAttach.Decode;
         Sz := FAttach.Decoded.Size;
         Attachment := TEmailAttachment.Create;
         Attachment.FileName := string(FAttach.FileName);
         writeln(Format("attachment %d has file name "%s"",
           [Succ(I), Attachment.FileName]));
         Attachment.Size := Sz;
         if Sz > 0 then
         begin
           GetMem(Buffer, Sz);
           FAttach.Decoded.Seek(0, soFromBeginning);
           FAttach.Decoded.Read(Buffer^, Sz);
           Attachment.Data := Buffer;
         end;
         Letter.Attachments.Add(Attachment);
       except
         on E: Exception do
           writeln(Format("Failed to decode attachment %d (%s)",
             [I, E.Message]));
       end;
     end;
   except
     on E: Exception do
     begin
       writeln(Format("Failed to retrieve message %d (%s)", [N, E.Message]));
       FreeAndNil(Letter);
     end;
   end;
 end;


 
DVM ©   (2012-12-13 15:45) [67]


> Игорь Шевченко ©   (13.12.12 13:27) [65]
> DVM ©   (13.12.12 13:04) [62]
>
> Много времени заняло ? :)

это делфи сама


 
Jeer ©   (2012-12-13 16:31) [68]

А мне продолжает нравиться ABC-Pascal :)

***
type
 Person = class
 private
   class arr: array of Person; // Классовое поле. Связано не с переменной класса, а с классом.
   name: string;
   age: integer;
 public
   class constructor; // Конструктор класса. Вызывается до создания первого объекта класса и до вызова любого классового метода
   begin
     writeln("  Вызван классовый конструктор");
     SetLength(arr,3);
     arr[0] := new Person("Иванов",20);
     arr[1] := new Person("Петрова",19);
     arr[2] := new Person("Попов",35);
   end;
   constructor (n: string; a: integer);
   begin
     name := n;
     age := a;
   end;
   function ToString: string; override;
   begin
     Result := Format("Имя: {0}   Возраст: {1}",name,age);      
   end;
   class function RandomPerson: Person; // Классовый метод. Может обращаться только к классовым полям
   begin
     Result := arr[Random(3)];
   end;
 end;
 
begin
 writeln("Случайные персоны");
 for var i:=1 to 5 do
   writeln(Person.RandomPerson); // Вызов классового метода
end.


 
Дмитрий С ©   (2012-12-13 16:32) [69]

Тем что код в интерфейсе пишется?


 
Jeer ©   (2012-12-13 16:36) [70]

Это фишка :)
В т.ч., но не только.
Весьма толково "сделан" микс из очевидно востребованных возможностей.
***
uses System.Collections.Generic;

var
 a: array [1..5] of integer := (1,3,5,7,9);
 s: set of integer;
 l: List<integer>;

begin
 write("foreach по обычному массиву: ":35);
 foreach x: integer in a do
   write(x," ");
 writeln;  
 
 s := [2..5,10..14];
 write("foreach по множеству: ":35);
 foreach x: integer in s do
   write(x," ");
 writeln;  
 
 l := new List<integer>;
 l.Add(7); l.Add(2); l.Add(5);
 write("foreach по динамическому массиву: ":35);
 foreach x: integer in l do
   write(x," ");
end.


 
Jeer ©   (2012-12-13 16:39) [71]

// Внутриблочные описания переменных
 var s: real := 1.0;

 // Описание переменной в заголовке цикла (время жизни переменной - до конца тела цикла)
 for j: integer := 1 to 10 do
   s += j; // Операция += для чисел


 
vuk ©   (2012-12-13 17:34) [72]


> Jeer ©   (13.12.12 16:31) [68]
> А мне продолжает нравиться ABC-Pascal :)

А мне продолжает хотецца паубивать всех изобретателей языков с таким описанием классов. :)


 
O'ShinW ©   (2012-12-13 17:43) [73]


>  s += j

застрелится, блин. Они уже и в паскале..


 
O'ShinW ©   (2012-12-13 17:49) [74]

ь :)

чем это s += j лучше, чем  s = s + j - непонятно. Вообще. И никогда не будет, хоть убейте.


 
Игорь Шевченко ©   (2012-12-13 17:52) [75]

O"ShinW ©   (13.12.12 17:49) [74]


> И никогда не будет, хоть убейте.


Можно начинать ?


 
Пользователь Интернета   (2012-12-13 17:57) [76]

Люди, которые пишут цифры ручкой на купюрах, еще большие враги народа и вредители!


 
KilkennyCat ©   (2012-12-13 18:29) [77]


> Пользователь Интернета   (13.12.12 17:57) [76]

а буквы и знаки препинания?


 
Дмитрий С ©   (2012-12-13 18:35) [78]


> Jeer ©

Прикольненько:)

Циклы без описания переменных где-то там, да еще и по массивам (и спискам наверное тоже), круто:)


 
O'ShinW ©   (2012-12-13 19:32) [79]


> Можно начинать ?

Что-то у меня такое подозрение, что Вы упорно хотите заняться со мной ненавистью :)


 
Котик Б   (2012-12-13 20:31) [80]

А мне вообще ни
begin ... end
ни
{ ... }
не нравятся.

Повбьівав бьі...

Каждьій фрагмент кода должен иметь явное начало и явное окончание:
IF ... ENDIF
DO ... ENDDO
LOOP ... ENDLOOP
SELECT ... ENDSELECT


 
Игорь Шевченко ©   (2012-12-13 20:47) [81]

O"ShinW ©   (13.12.12 19:32) [79]

Ты сам предложил убить тебя, потому что тебе непонятна конструкция +=

Тебя никто не принуждал :)


 
Rouse_ ©   (2012-12-13 21:02) [82]


> O"ShinW ©   (13.12.12 17:49) [74]
> ь :)
>
> чем это s += j лучше, чем  s = s + j - непонятно

Ну например тем, что можно написать вот так i += ++i+i++; и оно даже скомпилится :)


 
Игорь Шевченко ©   (2012-12-13 21:46) [83]

Rouse_ ©   (13.12.12 21:02) [82]

Я начинаю всерьез думать о создании движения за лишение гражданских свобод программистов, пишущих подобный код :)


 
Rouse_ ©   (2012-12-13 21:52) [84]


> Игорь Шевченко ©   (13.12.12 21:46) [83]

- Ведьму сжечь!
- Но она же такая красивая...
- Ну хорошо, но потом - сжечь!!!

В принципе это еще не так страшно (хоть и будет давать различный результат в зависимости от компилера) но вот что делать с индусским и китайским кодом? :))


 
TUser ©   (2012-12-13 22:08) [85]

Надо эту ветку в СК отнести, на предмет проверки по 282 статье.

Действия, направленные на возбуждение ненависти либо вражды, ... по признакам ... принадлежности к какой-либо социальной группе, совершенные публично или с использованием средств массовой информации, наказываются так-то и так-то.

%)


 
Inovet ©   (2012-12-13 22:09) [86]

> [74] O"ShinW ©   (13.12.12 17:49)
> непонятно. Вообще. И никогда не будет, хоть убейте.

Тем, что понятнее.


 
O'ShinW ©   (2012-12-13 22:24) [87]


>  i += ++i+i++

ёёё..

> Игорь Шевченко
вот теперь - пора :)


 
TUser ©   (2012-12-13 22:35) [88]


>  i += ++i+i++

Если не ошибаюсь, в брейнфаке символа i нет.


 
Inovet ©   (2012-12-13 23:04) [89]

> [82] Rouse_ ©   (13.12.12 21:02)
> i += ++i+i++;

Во-первых пробелы лишние, так читабелнее

i+=++i+i++;

Во-вторых мало действий - некомпактно, читай [0]. Надо как можно больше в один оператор вкладывать.

*i+++=--*i+++*i--+*--i-*i++;


 
Inovet ©   (2012-12-13 23:15) [90]

> [89] Inovet ©   (13.12.12 23:04)
> *i+++=--*i+++*i--+*--i-*i++;

Ну и, чтобы огород не городит из скобок и строк литшних, ещё вот так

*i---=*i---=*i+++=*i+++=--*i+++*i--+*--i-*i++;


 
Дмитрий С ©   (2012-12-13 23:46) [91]

\
> ++i+i++

Это все равно что в скриптовых языках:
if ( !condition1 && condition2)


 
Inovet ©   (2012-12-13 23:56) [92]

> [91] Дмитрий С ©   (13.12.12 23:46)
> if ( !condition1 && condition2)

А что не так с этим выражением? Последовательность вычисления неопределена?


 
KilkennyCat ©   (2012-12-14 00:18) [93]

скоро будут спецпсихиатры. для программистов ;)


 
Дмитрий С ©   (2012-12-14 03:56) [94]


> А что не так с этим выражением? Последовательность вычисления
> неопределена?

Однозначно нельзя сказать к чему ! относится.


 
Inovet ©   (2012-12-14 04:21) [95]

> [94] Дмитрий С ©   (14.12.12 03:56)
> Однозначно нельзя сказать к чему ! относится.

А как же приоритеты операций?


 
RWolf ©   (2012-12-14 09:29) [96]


> [94]

если кодер вдумывается в приоритеты, значит, он не знает языка.
приведённая конструкция прозрачна.


 
Игорь Шевченко ©   (2012-12-14 10:33) [97]

RWolf ©   (14.12.12 09:29) [96]


> если кодер вдумывается в приоритеты, значит, он не знает
> языка.


Если бы ты работал у меня, был бы хороший повод для увольнения.


 
Компромисс1   (2012-12-14 11:49) [98]

For example :

if a = 7 then do
  Inc(b, a);

Is better written :

if a = 7 then do
begin
  Inc(b, a);
end;

for maintenance purposes.


http://www.delphibasics.co.uk/RTL.asp?Name=Begin


 
Компромисс1   (2012-12-14 11:53) [99]

> чем это s += j лучше, чем  s = s + j - непонятно

А так?

myReallyLongArray[calculateArrayIndex(i,j,k)] += getTargetIndex(user) - getFirstIndex(page);


 
RWolf ©   (2012-12-14 13:25) [100]


> [97]

ну, то есть, выкидывать операторные скобки — это нормально, а бесполезные скобки из выражений — это ни-ни.
непоследовательно как-то.
и да, такая кадровая политика есть положительный отбор троечников.


 
Игорь Шевченко ©   (2012-12-14 13:44) [101]

RWolf ©   (14.12.12 13:25) [100]

Ясность лучше мастерства.

"Поскольку обслуживание является важным и дорогостоящим, следует писать такие программы, как если бы обмен наиболее важной информацией, осуществляемый программой, был связан не с компьютером, выполняющим данную программу, а с людьми, которые будут читать и поддерживать исходный код в будущем"

Эрик Реймонд, "Искусство программирования для UNIX"


 
Игорь Шевченко ©   (2012-12-14 13:45) [102]


> и да, такая кадровая политика есть положительный отбор троечников.


Месье эксперт в кадровой политике ? Могу взять online-уроки ?


 
RWolf ©   (2012-12-14 14:01) [103]


> [101]

ни в коей мере не навязывая своё мнение относительно кадровой политики, настаиваю, тем не менее, что выражение !a && b читается лучше, чем (!a) && b.
если у гипотетического кодера, поддерживающего некий код, возникают затруднения при чтении таких выражений, значит, он прогуливал арифметику и булеву алгебру, вот и всё.


 
TUser ©   (2012-12-14 14:06) [104]


> если у гипотетического кодера, поддерживающего некий код,
>  возникают затруднения при чтении таких выражений, значит,
>  он прогуливал арифметику и булеву алгебру, вот и всё.

угу, а если он не понимает, почему дельфя ругается на
a = b and c = d
значит паскаль прогуливал, и вообще, кодер должен помнить приоритет операций во всех языках на свете, а то кому-то скобки поставить лень


 
RWolf ©   (2012-12-14 14:13) [105]


> [104]
> угу, а если он не понимает, почему дельфя ругается на a = b and c = d
> значит паскаль прогуливал,

это очевидно.


> и вообще, кодер должен помнить приоритет операций во всех языках на свете,

не всех, а тех, на которых пишет.
и не помнить, а знать — это в подсознании должно сидеть.
чтобы даже мыслей вроде «а какая операция в 2+2*2 выполнится раньше» не возникало.


>  а то кому-то скобки поставить лень

часто это просто загромождает код и ничего не даёт в плане лёгкости чтения.
там, где код без скобок плохо читается, нужно ставить, разумеется.


 
Игорь Шевченко ©   (2012-12-14 14:33) [106]

RWolf ©   (14.12.12 14:13) [105]


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


так в том и вопрос, как отличить одно от другого :)

вот пример (PL/SQL)

     
      If vRow.BARFOO_NR <> 0 and
        vRow.S_A_NR <> (v_A_NR+vt_A_NR) Or
        vRow.S_B_NR <> (v_B_NR+vt_B_NR) Or
        vRow.S_C_NR <> (v_C_NR+vt_C_NR) Or
        vRow.S_Foo      <> (v_Foo     + vt_FOO     ) Or
        vRow.S_BAR  <> (v_BAR + vt_BAR ) Or
        vRow.S_FOOBAR     <> (v_FOOBAR    + vt_FOOBAR   ) Or
        vRow.S_BARFOO <> (v_BARFOO+ vt_BARFOO)

     then


Я без скобок при первом прочтении не могу понять смысл (не приоритет, а смысл) условного оператора, несмотря на то, что с PL/SQL общаюсь больше 20 лет.


 
Аббат Пиккола   (2012-12-14 14:59) [107]

2 Игорь Шевченко ©   (14.12.12 14:33) [106]

У меня возникла гипотеза.
Почему мнения у разных людей расходятся, о том, что читабельно, а что нет.

Может быть все дело в том,  человеку не так легко переключаться с одного языка программирования на другой?
И для экономии собственных усилий он оформляет код так, чтобы тот просто  был максимально инвариантен по отношению к используемому языку.

Те, кто использует множество языков, предпочитает, к примеру, сразу заключать логическое выражения после if целком в скобки:  

if () then.

А тот, кто использует в основном один язык постоянно, к примеру, Pascal, не видит никакого смысла  в этом.

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


 
RWolf ©   (2012-12-14 15:07) [108]


> [106]

нагромождение пробелов в случайных местах и их отсутствие в нужных, нет выравнивания по вертикали, бессмысленные названия идентификаторов, подчёркивания в именах тоже добавляют шума — неудивительно, что читается не с первого раза.
и вообще, похоже, что слишком много разнородных условий собрано вместе, их бы сгруппировать и разбить на пару-тройку операторов — и читаемость бы повысилась, и править логику было бы проще.


 
Аббат Пиккола   (2012-12-14 15:23) [109]

Операторы and, or, not в паскале позволяют работать как с логическими выражениями так и с множествами. В языках, не имеющих типа "множество" этого применения для логических операторов не предусмотрено. Еще в паскале можно использовать эти операторы для побитовых операций над целыми байтами и  словами. Это может вызвать затруднения при зрительной интерпретации выражений, в которых мы еще не знаем типов переменных, но которые уже попались нам на глаза.

Что же касается лишних begin end...

В некоторых языках оператор if просто требует операторных скобок. И если человек много программирует на таких языках, то когда ему нужно написать программу на паскале, он продолжает ставить операторные скобки после if, даже если там всего одна команда предполагается.

Знаю по себе.

Если я долго пишу на паскале, я начинаю begin end опускать, если речь идет именно об if-е и после него предполагается всего одна команда. В паскале так намного читабельнее. Но если я после этого перехожу на язык, требующий после if операторных скобок, то я начинаю их массово пропускать, пока "не переучусь обратно". После чего если я опять вернусь к паскалю, я начинаю их опять ставить по инерции.

Я весь код пишу руками, не люблю, когда за меня что-то вставлятся в текст. Возможно даже, что вся эта автоматика и создается для того чтобы облегчить подобные ситуации, но я этим всем мало пользуюсь, если знаю, где отключить эту хрень. Если не знаю - пользуюсь. Если не знаю, как включить, и не интересуюсь. Но это мое личное консервативное свойство. С прогрессом я не дружу, это правда.


 
Аббат Пиккола   (2012-12-14 15:25) [110]

2 RWolf ©   (14.12.12 15:07) [108]

Я уверен, что выравнивание сбилось при переносе сюда.


 
Игорь Шевченко ©   (2012-12-14 15:36) [111]

RWolf ©   (14.12.12 15:07) [108]


> бессмысленные названия идентификаторов, подчёркивания в
> именах тоже добавляют шума


Идентификаторы осмысленные, имена намерено искажены
Подчеркивание - это культура PL/SQL
Скажу сразу, что со скобками мне было бы проще понять.

Аббат Пиккола   (14.12.12 14:59) [107]

Мне трудно сказать о трудностях переключения, я легко переключаюсь с C на Pascal на C# на PL/SQL

Что касается инвариантов по отношению к языку - у каждого языка есть культура стиля, и я предпочитаю писать именно в культуре конкретного языка. Этот опыт основан на том, что читать мой (не мой) код будут люди, которые привыкли к культуре того языка, на котором я пишу. И если синтаксис Pascal допускает конструкцию function_without_parameters();, то я все равно не буду писать пустые (), потому что в культуре сложилось (негласное) правило, что писать надо function_without_parameters;


 
Аббат Пиккола   (2012-12-14 15:43) [112]

2 Игорь Шевченко ©   (14.12.12 15:36) [111]

Не очень понял, о чем речь про пустые ().

Вот это код чем-то некультурный?

function TCustomForm.HandleCreateException: Boolean;
begin
 Application.HandleException(Self);
 Result := True;
end;

Или Вы о чем-то ином?


 
Аббат Пиккола   (2012-12-14 15:44) [113]

Пардон, наоборот понял


 
Аббат Пиккола   (2012-12-14 15:47) [114]

Ну тогда дело не в прогрессе, а в культуре языка.

Если в Паскале сложилась традиция не использовать лишние begin..end, их не следует использовать, кроме как в исключительных случаях - например, для придания особой выразительности.
Наподобие того, как использование матерных выражений без серьезного повода свидетельствовоало бы о низкой культуре речи.


 
O'ShinW ©   (2012-12-14 15:51) [115]

возможно, это
>       If vRow.BARFOO_NR <> 0 and
>         vRow.S_A_NR <> (v_A_NR+vt_A_NR) Or
>         vRow.S_B_NR <> (v_B_NR+vt_B_NR) Or
>         vRow.S_C_NR <> (v_C_NR+vt_C_NR) Or
>         vRow.S_Foo      <> (v_Foo     + vt_FOO     ) Or
>         vRow.S_BAR  <> (v_BAR + vt_BAR ) Or
>         vRow.S_FOOBAR     <> (v_FOOBAR    + vt_FOOBAR  
> ) Or
>         vRow.S_BARFOO <> (v_BARFOO+ vt_BARFOO)
>
>      then

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

 If 1=0
    or vRow.BARFOO_NR <> 0  and  vRow.S_A_NR <> (v_A_NR+vt_A_NR)
    or  vRow.S_B_NR <> (v_B_NR+vt_B_NR)
    or vRow.S_C_NR <> (v_C_NR+vt_C_NR)
    or vRow.S_Foo   <> (v_Foo + vt_FOO )
    or ...
   then


мне кажется, так понятнее:
или это и это
или это
или это
или это

ну и "1=0"  - что бы было единообразно.
и как писал как-то, любую строчку комментируем при отладке
и все продолжает работать. Без дополнительных телодвижений


 
Аббат Пиккола   (2012-12-14 15:55) [116]

2 O"ShinW ©   (14.12.12 15:51) [115]

Я так и пишу, только если мне нужна именно возможность закомментировать любую строчку.
Если такая возможность не нужна, пишу оператор  в конце строки и никаких 1=0.


 
O'ShinW ©   (2012-12-14 16:04) [117]


> Аббат Пиккола   (14.12.12 15:55) [116]

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


 
TUser ©   (2012-12-14 16:36) [118]

Вот прямо только что нашел у себя

   case EdgeType of
     etIncluded:
      begin end;
     etContacted:
      begin
        if Contact is TSheetSheetContact then
        with TSheetSheetContact (Contact) do
          result := result + GetSideDescript (Sides[i], FirstIndexInContact <> i) +
                             GetSideDescript (Sides[1-i], FirstIndexInContact = i)
          else
//       if Contact is TSheetSheetContact then
        with TSheetHelixesContact (Contact) do
          result := result + GetSideDescript (Side, FirstIndexInContact <> i) +
                             GetSideDescript (sideUnknown, FirstIndexInContact = i);
     
        if Contact.WeakOrStrong then
          result := result + " style = dashed ";
      end;
     else
      result := result + GetSideDescript (sideUnknown, true);
     end;


 
Игорь Шевченко ©   (2012-12-14 17:57) [119]


> я бы так написал
>
>  If 1=0


Не позорься


 
Владислав ©   (2012-12-14 23:42) [120]

Rouse_ ©   (13.12.12 21:02) [82]

> O"ShinW ©   (13.12.12 17:49) [74]
> ь :)
>
> чем это s += j лучше, чем  s = s + j - непонятно

Ну например тем, что можно написать вот так i += ++i+i++; и оно даже скомпилится :)


Жуть какая! Это не Вам, а тем, кто так пишет.

Игорь Шевченко ©   (13.12.12 21:46) [83]

Я начинаю всерьез думать о создании движения за лишение гражданских свобод программистов, пишущих подобный код :)


Игорь, ты стал очень категоричным в своих утверждениях. :) А как же "овощь..."?

RWolf ©   (14.12.12 09:29) [96]

> [94]

если кодер вдумывается в приоритеты, значит, он не знает языка.
приведённая конструкция прозрачна.


Дело не в том, сколько кодер тратит времени на чтение конструкции. Дело в том, что эту конструкцию за время жизни кода прочитает еще "мульюн" кодеров. Конструкция должна читаться, а не пониматься.

Игорь Шевченко ©   (14.12.12 15:36) [111]

Что касается инвариантов по отношению к языку - у каждого языка есть культура стиля, и я предпочитаю писать именно в культуре конкретного языка. Этот опыт основан на том, что читать мой (не мой) код будут люди, которые привыкли к культуре того языка, на котором я пишу.


Хорошо и понятно сказано. Аналогия - общение с неносителем языка.


 
знайка   (2012-12-14 23:54) [121]


> Конструкция должна читаться, а не пониматься.
Это не художественная литература, чего ее мульену читать?


 
Kerk ©   (2012-12-15 00:01) [122]

знайка   (14.12.12 23:54) [121]

> > Конструкция должна читаться, а не пониматься.
> Это не художественная литература, чего ее мульену читать?

Это в общем-то очевидная вещь, что код читается в разы чаще, чем пишется. Не?


 
Игорь Шевченко ©   (2012-12-15 00:03) [123]

знайка   (14.12.12 23:54) [121]


> Это не художественная литература, чего ее мульену читать?


За чтение художественной литературы деньги программистам не платят. За чтение кода - платят. Разница налицо.

Владислав ©   (14.12.12 23:42) [120]


> Игорь, ты стал очень категоричным в своих утверждениях.
> :)


Надо сеять разумное доброе и вечное. А неразумное злое и временное - выпалывать! :)


 
Rouse_ ©   (2012-12-15 00:13) [124]

Чтоб мудро жизнь прожить, знать надобно немало.
Два важных правила запомни для начала:
Ты лучше голодай, чем что попало есть,
И лучше будь один, чем вместе с кем попало.
Омар Хайям (1978г)


 
Rouse_ ©   (2012-12-15 00:14) [125]

ЗЫ: ну год есесно перевода :))


 
знайка   (2012-12-15 00:38) [126]


> Это в общем-то очевидная вещь, что код читается в разы чаще,
>  чем пишется. Не?
За всех не знаю, а у нас нет. Да и зачем его постоянно перечитывать ? наизусть запомнить?

> За чтение художественной литературы деньги программистам
> не платят. За чтение кода - платят. Разница налицо.
Во-во, а как известно, кто платит тот и танцует, какой стиль принят, и более менее придется его придерживаться.
Как то у Paladdin (если правильно помню) параметры начинались с литеры "р", вот и объясните им, что это не по феншую.
Да и в той-же vcl, можно найти, наверное, все что угодно.


 
знайка   (2012-12-15 00:41) [127]

Ой сори конечно Palladin.


 
Владислав ©   (2012-12-15 00:48) [128]


> Игорь Шевченко ©   (15.12.12 00:03) [123]
> знайка   (14.12.12 23:54) [121]
>
> Надо сеять разумное доброе и вечное. А неразумное злое и
> временное - выпалывать! :)

По сути ты прав. Я даже поддерживаю. Но как поколение воспитывать? "Казнить" нас неразумных? Это жестко!

Да и вот посмотри, что Александр (если не ошибаюсь. Я про Rouse_) пишет/цитирует в: "Rouse_ ©   (15.12.12 00:13) [124] "

С кем быть попало, если не с вами?..

Разумное на то и "разумное", что его разумно нужно сеять. "Угу", или не "угу"? :)


 
Владислав ©   (2012-12-15 00:58) [129]


> знайка   (15.12.12 00:38) [126]

Вы затронули тему корпоративных стандартов. С ними не нужно спорить, их нужно принять.


 
Германн ©   (2012-12-15 01:37) [130]

Удалено модератором


 
Германн ©   (2012-12-15 01:50) [131]

Я лично не совсем понимаю почему борьба за разумное, доброе, вечное начинается с "лишних" begin..end?
Тут бы ещё как бы не обидеть уважаемого мастера :)
А вот наличие "ненужных" скобок в сравнительно длинном арифметическом и особенно логическом выражении считаю более важным предметом для обсуждения.


 
Аббат Пиккола   (2012-12-15 02:59) [132]

Внесу немного своей лепты в святую борьбу за вечное.
:)

Как лучше назвать объекты метаданных в базах данных?

По-английски, по-русски транслитом на латиницу, по-русски русскими буквами, вообще суррогатно  (как в 1С, например: SC110, SC111...).

Я лично предпочитаю называть по-английски.
Понятно, что если есть стандарт в совместной работе, его приходится придерживаться volens nolens...
Ну а если это все же выбор стиля за разработчиком?


 
картман ©   (2012-12-15 03:18) [133]


> По-английски, по-русски транслитом на латиницу, по-русски
> русскими буквами

коль уж зашла речь: т_вэри_импотэнт_дэйта


 
Inovet ©   (2012-12-15 04:17) [134]

> [116] Аббат Пиккола   (14.12.12 15:55)
> закомментировать любую строчку.

Так-с, продолжим писать читабельный код с комментариями
*i---=*i---=*/*-+-*/i+++=*i+++=--*i+++/***/*i--+*--i-*i++;


 
Игорь Шевченко ©   (2012-12-15 11:07) [135]

знайка   (15.12.12 00:38) [126]


> как известно, кто платит тот и танцует, какой стиль принят,
>  и более менее придется его придерживаться.
> Как то у Paladdin (если правильно помню) параметры начинались
> с литеры "р", вот и объясните им, что это не по феншую.


Общий феншуй описан подробно и с картинками:
http://citforum.ru/programming/delphi/style_delphi/

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


> Да и в той-же vcl, можно найти, наверное, все что угодно.


vcl написан в едином стиле, поверь. По меньшей мере базовая часть.


 
Игорь Шевченко ©   (2012-12-15 11:10) [136]

Аббат Пиккола   (15.12.12 02:59) [132]


> Как лучше назвать объекты метаданных в базах данных?
>
> По-английски, по-русски транслитом на латиницу, по-русски
> русскими буквами, вообще суррогатно  (как в 1С, например:
>  SC110, SC111...).
>
> Я лично предпочитаю называть по-английски.


Я лично тоже предпочитаю использовать английские названия, потому что ключевые слова вокруг этих имен, как ни крути, английские.

SELECT там всякий...


 
Фокс Йожин   (2012-12-15 11:47) [137]

Оптимизируем код

> Люди, которые пишут begin..end


> Являются тормозом прогресса и врагами нации :)

:-D


 
Пит   (2012-12-15 17:18) [138]

ну вот тот же стандарт http://citforum.ru/programming/delphi/style_delphi/

я не понимаю почему бы иногда if"у не располагаться на одной строчке.

if (a=b) then exit;

что в этом коде нечитабельно и чем он принципиально хуже:

if (a=b) then
 exit;


?


 
Пит   (2012-12-15 17:21) [139]

нет, я знаю одну штуку насчет однострочного if"а - при пошаговой отладке непонятно - сработало условие или нет. Но при варианте с exit - даже это не аргумент.

Насчет отладки - гораздо круче несоответствие pas файла и dcu. Вот там бывает шикарно :-)


 
asail ©   (2012-12-15 21:47) [140]


> Пит   (15.12.12 17:18) [138]

> if (a=b) then exit;

А такой код в VCL встречается очень часто, насколько помню...


 
TUser ©   (2012-12-15 22:34) [141]


> Ega23 ©   (13.12.12 00:36) [33]
>
> > кто-то пишет begin/end побуквенно?
>
> Плюс мильён. Среда сама подставляет, как минимум end; :)

Ну я пишу, держите меня семеро. Обычно в FARе. Автозаполнение кода в IDE просто раздражает - специально отключаю. Вообще, набивание кода - это от силы 1% времени, остальное - его обдумывание. Так что большой разницы между {, begin и start_of_code_block не вижу.


 
Аббат Пиккола   (2012-12-16 00:50) [142]

Я тоже набиваю весь код руками. Зрение слабое. А руки сильные. :)


 
Германн ©   (2012-12-16 03:07) [143]


> TUser ©   (15.12.12 22:34) [141]
>
> Ну я пишу, держите меня семеро. Обычно в FARе. Автозаполнение
> кода в IDE просто раздражает - специально отключаю.

Вот почему я этому не удивлён?
:)


 
TUser ©   (2012-12-16 07:55) [144]

Вот, допустим, есть код

for ... do
 aaa

а мне надо его дополнить до

for ... do
begin
 bbb
 aaa
end

Допустим, я ввел begin. IDE (Turbo Delphi) после Enter сразу сделает мне
for ... do
begin
 // тут курсор
end;
 aaa

то есть просто введет в код ошибку, которую надо быстро-быстро исправлять. Это для удобства разработчика сделано, да? Нафиг.


 
Игорь Шевченко ©   (2012-12-16 12:49) [145]

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


 
QAZ9   (2012-12-16 20:47) [146]

я бы так называл людей которые одну строчку кода обертывают в функцию


 
Rouse_ ©   (2012-12-16 21:01) [147]


> QAZ9   (16.12.12 20:47) [146]
> я бы так называл людей которые одну строчку кода обертывают
> в функцию

Кошмар, люди реализовавшие Inc/Dec/Max/Min уже прямо сейчас должны покаяться? :)


 
Игорь Шевченко ©   (2012-12-16 21:06) [148]

Rouse_ ©   (16.12.12 21:01) [147]

в Max и Min больше одной строки, а люди, реализовавшие Inc и Dec в виде функций, и, более того, использующие их, заслуживают живительной эвтаназии чуть более, чем полностью.


 
Kerk ©   (2012-12-16 21:25) [149]


> QAZ9   (16.12.12 20:47) [146]
>
> я бы так называл людей которые одну строчку кода обертывают
> в функцию

Ну ты слишком обобщаешь. Легко могу придумать примеры, когда это оправдано. Различные get-еры сразу на ум приходят.


 
QAZ9   (2012-12-16 21:26) [150]


> Rouse_ ©   (16.12.12 21:01) [147]

а как же быстродействие о котором ты так печешся рассказывая про выдергивание вложенных "недокументированных" функции из "обычных" в своем бложике?


 
Rouse_ ©   (2012-12-16 21:33) [151]


> Игорь Шевченко ©   (16.12.12 21:06) [148]
> Rouse_ ©   (16.12.12 21:01) [147]
>
> в Max и Min больше одной строки, а люди, реализовавшие Inc
> и Dec в виде функций, и, более того, использующие их, заслуживают
> живительной эвтаназии чуть более, чем полностью.

Да, с Max и Min перепутал, у меня собственная интерпретация в одну строчку.
А вот по поводу второго утверждения не понял? Опять предлагаешь лоботомировать всю эмбаркадеру?


> QAZ9   (16.12.12 21:26) [150]
> а как же быстродействие о котором ты так печешся рассказывая
> про выдергивание вложенных "недокументированных" функции
> из "обычных" в своем бложике?

В своем "бложике" я пишу статьи для людей включающих внутренние отсеки черепной коробки. Конечно по поводу инлайн функций ты в курсе и наверное сможешь сделать выводы по поводу производительности в том числе?


 
QAZ9   (2012-12-16 21:35) [152]


> по поводу инлайн функций

в курсе что их в старых версиях нет


 
QAZ9   (2012-12-16 21:37) [153]


> внутренние отсеки черепной коробки

там как бы один отсек, если что ...


 
Игорь Шевченко ©   (2012-12-16 21:39) [154]

Rouse_ ©   (16.12.12 21:33) [151]


> Опять предлагаешь лоботомировать всю эмбаркадеру?


Ты про Delphi Intrinsic Routines или про что ?


 
Rouse_ ©   (2012-12-16 21:46) [155]


> QAZ9   (16.12.12 21:35) [152]
> в курсе что их в старых версиях нет

Не - не слышал...


> QAZ9   (16.12.12 21:37) [153]
> там как бы один отсек, если что ...

ну у кого как...


> Игорь Шевченко ©   (16.12.12 21:39) [154]

Не понял.


 
Rouse_ ©   (2012-12-16 21:50) [156]


> QAZ9   (16.12.12 21:26) [150]

Ах, да и по поводу быстродействия, еще раз включи чего там у тебя есть и уясни что отключение двух трех, да шут с ним даже пяти однотактовых асм инструкций, не дадут прироста в производительности, за исключением их вызова в продолжительном цикле на несколько миллионов итераций, в отличие от того примера, что я показывал в своем "бложике" ;)


 
DVM ©   (2012-12-16 21:54) [157]


> Игорь Шевченко ©   (16.12.12 21:06) [148]


>  а люди, реализовавшие Inc и Dec в виде функций, и, более
> того, использующие их, заслуживают живительной эвтаназии
> чуть более, чем полностью.

А что в этом плохого? Особенно с учетом inline?


> QAZ9   (16.12.12 20:47) [146]
> я бы так называл людей которые одну строчку кода обертывают
> в функцию

вот здесь одна строчка:

function ROL16(const AValue: Word; const AShift: Byte): Word;
begin
 Result := (AValue shl AShift) or AValue shr (16 - AShift);
end;


В криптоалгоритме эта функция встречается в сотне мест. И что теперь дублировать это сто раз? Я уж не говорю о наглядности. А inline она прекрасно становится.


 
Игорь Шевченко ©   (2012-12-16 22:07) [158]

Rouse_ ©   (16.12.12 21:46) [155]


> Не понял.


These intrinsic routines are actually handled by the compiler rather than the run-time library.

System.Dec  Decrements a variable by 1 or N.
System.Inc   Increments an ordinal value by one or N.


 
Rouse_ ©   (2012-12-16 22:09) [159]


> Игорь Шевченко ©   (16.12.12 22:07) [158]

Угу, и чем они тебе плохи?


 
DVM ©   (2012-12-16 22:18) [160]

Inc и Dec это и не функции или процедуры вообще в привычном понимании, это магия компилятора скорее, Inc(p) дает более оптимальный код, чем p := p + 1


 
QAZ9   (2012-12-16 22:29) [161]


> Особенно с учетом inline?

нету инлайна в "старых" делфях


 
Rouse_ ©   (2012-12-16 22:36) [162]


> QAZ9   (16.12.12 22:29) [161]
>
> > Особенно с учетом inline?
>
> нету инлайна в "старых" делфях

Та шош ты так уперся :) Ну во первых есть, нужно только уметь его использовать. Во вторых не там ты ищешь :)


 
QAZ9   (2012-12-16 22:38) [163]

где в 7ке например искать?


 
DVM ©   (2012-12-16 22:40) [164]


> QAZ9   (16.12.12 22:29) [161]
>
> > Особенно с учетом inline?
>
> нету инлайна в "старых" делфях

Ну применительно к Inc Dec хоть есть он хоть нет его, все одно код будет вставлен по месту, никакого вызова функции то и не будет, самой функции то и нет.

Речь даже не о скорости, а о наглядности, удобстве использования. Там где все упрется в быстродействие, можно и ASM использовать.


 
Игорь Шевченко ©   (2012-12-16 22:44) [165]

Rouse_ ©   (16.12.12 22:09) [159]


> люди реализовавшие Inc/Dec/Max/Min


Я не вижу, чтобы они были реализованы как функции в одну строку.
Я про другое - в каком-то юните (по-моему, из VCL, не могу найти, не хочу врать) есть масса нелепых конструкций, повторяющих поведение сишных операторов.


 
Игорь Шевченко ©   (2012-12-16 22:46) [166]

DVM ©   (16.12.12 22:18) [160]


> Inc(p) дает более оптимальный код, чем p := p + 1


Это было давно и неправда


 
Rouse_ ©   (2012-12-16 22:46) [167]


> QAZ9   (16.12.12 22:38) [163]
> где в 7ке например искать?

Открою тайну - инклуды :)


 
Rouse_ ©   (2012-12-16 22:55) [168]


> Я про другое - в каком-то юните (по-моему, из VCL, не могу
> найти, не хочу врать) есть масса нелепых конструкций, повторяющих
> поведение сишных операторов.

А вот это уже нюанс - покажешь, может и соглашусь...


 
DVM ©   (2012-12-16 23:00) [169]


> Игорь Шевченко ©   (16.12.12 22:46) [166]


> Это было давно и неправда

да, посмотрел, действительно теперь компилятор заменяет выражения k := k + 1 на точно такой же код, какой раньше он порождал для Inc(k). Один в один.


Unit5.pas.37: inc(k, 10);
00510639 8345E80A         add dword ptr [ebp-$18],$0a

Unit5.pas.52: k := k + 10;
005106E9 8345E80A         add dword ptr [ebp-$18],$0a


 
DVM ©   (2012-12-16 23:05) [170]


> Игорь Шевченко ©   (16.12.12 22:44) [165]


> Я про другое - в каком-то юните (по-моему, из VCL, не могу
> найти, не хочу врать) есть масса нелепых конструкций, повторяющих
> поведение сишных операторов.

этот юнит случайно не для линковки какой то сишной либы типа zlib?


 
Rouse_ ©   (2012-12-16 23:10) [171]


> DVM ©   (16.12.12 23:00) [169]
>
> > Игорь Шевченко ©   (16.12.12 22:46) [166]
>
>
> > Это было давно и неправда
>
> да, посмотрел, действительно теперь компилятор заменяет
> выражения k := k + 1 на точно такой же код, какой раньше
> он порождал для Inc(k). Один в один.

с адресной арифметикой INC выиграет, но на нюансах, надо найти в загашниках код который кажет данный нюанс...


 
Игорь Шевченко ©   (2012-12-16 23:11) [172]

DVM ©   (16.12.12 23:05) [170]

Нет, но явно что-то сишное переписывалось. Даже в блогах по этому модулю или связанному с ним проходились.


 
Игорь Шевченко ©   (2012-12-16 23:34) [173]

Дабы не слыть голословным

возможно, я натыкался на это

function Incr(var Arg: Integer): Integer; inline;
begin
 Inc(Arg);
 Result := Arg;
end;

function Decr(var Arg: Integer): Integer; inline;
begin
 Dec(Arg);
 Result := Arg;
end;

function IncrAfter(var Arg: Integer): Integer; inline;
begin
 Result := Arg;
 Inc(Arg);
end;

function DecrAfter(var Arg: Integer): Integer; inline;
begin
 Result := Arg;
 Dec(Arg);
end;

function C_Conditional(const Condition: Boolean; const TruePart, FalsePart: UnicodeString): UnicodeString;
begin
 if Condition then
   Result := TruePart
 else
   Result := FalsePart;
end;


C:\Program Files\Embarcadero\RAD Studio\7.0\source\database\dbxplatform.pas

причем, только в 10% эти функции используются, как функции, в 90% - как процедуры, то есть, ничем не отличаются от стандартных Inc, Dec


 
Игорь Шевченко ©   (2012-12-16 23:39) [174]

Оттуда же

 if Hex = nil then
 begin
   SetLength(Hex,16);
   Hex[0] := Ord("0");
   Hex[1] := Ord("1");
   Hex[2] := Ord("2");
   Hex[3] := Ord("3");
   Hex[4] := Ord("4");
   Hex[5] := Ord("5");
   Hex[6] := Ord("6");
   Hex[7] := Ord("7");
   Hex[8] := Ord("8");
   Hex[9] := Ord("9");
   Hex[10] := Ord("A");
   Hex[11] := Ord("B");
   Hex[12] := Ord("C");
   Hex[13] := Ord("D");
   Hex[14] := Ord("E");
   Hex[15] := Ord("F");
   SetLength(MethodStart,10);
   MethodStart[0] := Ord("{");
   MethodStart[1] := Ord(""");
   MethodStart[2] := Ord("m");
   MethodStart[3] := Ord("e");
   MethodStart[4] := Ord("t");
   MethodStart[5] := Ord("h");
   MethodStart[6] := Ord("o");
   MethodStart[7] := Ord("d");
   MethodStart[8] := Ord(""");
   MethodStart[9] := Ord(":");
   SetLength(ParamsStart,10);
   ParamsStart[0] := Ord(""");
   ParamsStart[1] := Ord("p");
   ParamsStart[2] := Ord("a");
   ParamsStart[3] := Ord("r");
   ParamsStart[4] := Ord("a");
   ParamsStart[5] := Ord("m");
   ParamsStart[6] := Ord("s");
   ParamsStart[7] := Ord(""");
   ParamsStart[8] := Ord(":");
   ParamsStart[9] := Ord("[");
   SetLength(Connect,10);
   Connect[0] := Ord(""");
   Connect[1] := Ord("c");
   Connect[2] := Ord("o");
   Connect[3] := Ord("n");
   Connect[4] := Ord("n");
   Connect[5] := Ord("e");
   Connect[6] := Ord("c");
   Connect[7] := Ord("t");
   Connect[8] := Ord(""");
   Connect[9] := Ord(",");
   SetLength(Disconnect,13);
   Disconnect[0] := Ord(""");
   Disconnect[1] := Ord("d");
   Disconnect[2] := Ord("i");
   Disconnect[3] := Ord("s");
   Disconnect[4] := Ord("c");
   Disconnect[5] := Ord("o");
   Disconnect[6] := Ord("n");
   Disconnect[7] := Ord("n");
   Disconnect[8] := Ord("e");
   Disconnect[9] := Ord("c");
   Disconnect[10] := Ord("t");
   Disconnect[11] := Ord(""");
   Disconnect[12] := Ord(",");
   SetLength(Prepare,10);
   Prepare[0] := Ord(""");
   Prepare[1] := Ord("p");
   Prepare[2] := Ord("r");
   Prepare[3] := Ord("e");
   Prepare[4] := Ord("p");
   Prepare[5] := Ord("a");
   Prepare[6] := Ord("r");
   Prepare[7] := Ord("e");
   Prepare[8] := Ord(""");
   Prepare[9] := Ord(",");
   SetLength(Parameters,15);
   Parameters[0] := Ord("{");
   Parameters[1] := Ord(""");
   Parameters[2] := Ord("p");
   Parameters[3] := Ord("a");
   Parameters[4] := Ord("r");
   Parameters[5] := Ord("a");
   Parameters[6] := Ord("m");
   Parameters[7] := Ord("e");
   Parameters[8] := Ord("t");
   Parameters[9] := Ord("e");
   Parameters[10] := Ord("r");
   Parameters[11] := Ord("s");
   Parameters[12] := Ord(""");
   Parameters[13] := Ord(":");
   Parameters[14] := Ord("[");
   SetLength(Execute,10);
   Execute[0] := Ord(""");
   Execute[1] := Ord("e");
   Execute[2] := Ord("x");
   Execute[3] := Ord("e");
   Execute[4] := Ord("c");
   Execute[5] := Ord("u");
   Execute[6] := Ord("t");
   Execute[7] := Ord("e");
   Execute[8] := Ord(""");
   Execute[9] := Ord(",");
   SetLength(CommandClose,16);
   CommandClose[0] := Ord(""");
   CommandClose[1] := Ord("c");
   CommandClose[2] := Ord("o");
   CommandClose[3] := Ord("m");
   CommandClose[4] := Ord("m");
   CommandClose[5] := Ord("a");
   CommandClose[6] := Ord("n");
   CommandClose[7] := Ord("d");
   CommandClose[8] := Ord("_");
   CommandClose[9] := Ord("c");
   CommandClose[10] := Ord("l");
   CommandClose[11] := Ord("o");
   CommandClose[12] := Ord("s");
   CommandClose[13] := Ord("e");
   CommandClose[14] := Ord(""");
   CommandClose[15] := Ord(",");
   SetLength(ReaderClose,15);
   ReaderClose[0] := Ord(""");
   ReaderClose[1] := Ord("r");
   ReaderClose[2] := Ord("e");
   ReaderClose[3] := Ord("a");
   ReaderClose[4] := Ord("d");
   ReaderClose[5] := Ord("e");
   ReaderClose[6] := Ord("r");
   ReaderClose[7] := Ord("_");
   ReaderClose[8] := Ord("c");
   ReaderClose[9] := Ord("l");
   ReaderClose[10] := Ord("o");
   ReaderClose[11] := Ord("s");
   ReaderClose[12] := Ord("e");
   ReaderClose[13] := Ord(""");
   ReaderClose[14] := Ord(",");
   SetLength(ResultStart,11);
   ResultStart[0] := Ord("{");
   ResultStart[1] := Ord(""");
   ResultStart[2] := Ord("r");
   ResultStart[3] := Ord("e");
   ResultStart[4] := Ord("s");
   ResultStart[5] := Ord("u");
   ResultStart[6] := Ord("l");
   ResultStart[7] := Ord("t");
   ResultStart[8] := Ord(""");
   ResultStart[9] := Ord(":");
   ResultStart[10] := Ord("[");
   SetLength(ErrorStart,17);
   ErrorStart[0] := Ord("{");
   ErrorStart[1] := Ord(""");
   ErrorStart[2] := Ord("e");
   ErrorStart[3] := Ord("r");
   ErrorStart[4] := Ord("r");
   ErrorStart[5] := Ord("o");
   ErrorStart[6] := Ord("r");
   ErrorStart[7] := Ord(""");
   ErrorStart[8] := Ord(":");
   ErrorStart[9] := Ord("{");
   ErrorStart[10] := Ord(""");
   ErrorStart[11] := Ord("n");
   ErrorStart[12] := Ord("a");
   ErrorStart[13] := Ord("m");
   ErrorStart[14] := Ord("e");
   ErrorStart[15] := Ord(""");
   ErrorStart[16] := Ord(":");
   SetLength(CodeLabel,7);
   CodeLabel[0] := Ord(""");
   CodeLabel[1] := Ord("c");
   CodeLabel[2] := Ord("o");
   CodeLabel[3] := Ord("d");
   CodeLabel[4] := Ord("e");
   CodeLabel[5] := Ord(""");
   CodeLabel[6] := Ord(":");
   SetLength(MessageLabel,10);
   MessageLabel[0] := Ord(""");
   MessageLabel[1] := Ord("m");
   MessageLabel[2] := Ord("e");
   MessageLabel[3] := Ord("s");
   MessageLabel[4] := Ord("s");
   MessageLabel[5] := Ord("a");
   MessageLabel[6] := Ord("g");
   MessageLabel[7] := Ord("e");
   MessageLabel[8] := Ord(""");
   MessageLabel[9] := Ord(":");
   SetLength(NullValue,4);
   NullValue[0] := Ord("n");
   NullValue[1] := Ord("u");
   NullValue[2] := Ord("l");
   NullValue[3] := Ord("l");
   SetLength(TrueValue,4);
   TrueValue[0] := Ord("t");
   TrueValue[1] := Ord("r");
   TrueValue[2] := Ord("u");
   TrueValue[3] := Ord("e");
   SetLength(FalseValue,5);
   FalseValue[0] := Ord("f");
   FalseValue[1] := Ord("a");
   FalseValue[2] := Ord("l");
   FalseValue[3] := Ord("s");
   FalseValue[4] := Ord("e");
...
 end;


 
GEN++ ©   (2012-12-16 23:40) [175]

Пусть я n! раз тормоз прогресса и заклятый враг программистов
все времен и народов - но ставить begin ... end даже на один оператор
буду!!!!!


 
DVM ©   (2012-12-16 23:55) [176]


> Игорь Шевченко ©   (16.12.12 23:34) [173]


> function C_Conditional(const Condition: Boolean; const TruePart,
>  FalsePart: UnicodeString): UnicodeString;

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


> Игорь Шевченко ©   (16.12.12 23:39) [174]

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


 
Игорь Шевченко ©   (2012-12-17 00:01) [177]

DVM ©   (16.12.12 23:55) [176]


> а вот такого плана функция на мой взгляд часто бывает полезна,
>  другое ее название IIF и для разных типов перегруженные
> ее варианты. Помогает сильно сократить запись, например
> при формировании строки подключения ADO к серверу.


Расстреливать из ржавого пистолета за такое применение. Во-первых, вызов влечет за собой вычисление ВСЕХ ее операндов, даже тех, которые по условию не будут нужны, во-вторых, код становится непонятнее.

Что делается в этой строке ? (indy)

     StreamWrite(AStream, iif(HeadContent <> "", HeadContent));


 
Игорь Шевченко ©   (2012-12-17 00:02) [178]

DVM ©   (16.12.12 23:55) [176]


> а это какая то жесть


целиком код не влез, там еще сотня строк такого же плана


 
DVM ©   (2012-12-17 00:07) [179]


> Игорь Шевченко ©   (17.12.12 00:01) [177]


> Во-первых, вызов влечет за собой вычисление ВСЕХ ее операндов,
>  даже тех, которые по условию не будут нужны

ну это критично редко бывает


> во-вторых, код становится непонятнее.

Есть такое. Но все равно, на мой взгляд удобно с ней.


>
> Что делается в этой строке ? (indy)
>
>      StreamWrite(AStream, iif(HeadContent <> "", HeadContent));
>
>
>

а где еще один параметр у iif ?


 
Игорь Шевченко ©   (2012-12-17 00:18) [180]

DVM ©   (17.12.12 00:07) [179]

А почему должно быть несколько параметров ?

Я привел код, источник
C:\Program Files\Embarcadero\RAD Studio\7.0\source\IntraWeb\iwtemplateprocessorwap.pas

еще пример (не из indy)

         for I := 0 to S.Count - 1 do
           writeln(T, Format("   ""%s""%s", [S[I], IIF(S.Count - 1 - I,
                 0, "", "||CHR(13)||CHR(10)||")]));

сколько времени потребуется, чтобы понять смысл действий ?


 
DVM ©   (2012-12-17 00:28) [181]


> Игорь Шевченко ©   (17.12.12 00:18) [180]
> DVM ©   (17.12.12 00:07) [179]
>
> А почему должно быть несколько параметров ?

А какой смысл когда параметров только 2 (условие и один из вариантов)?

Ну обычно IIF(условие, результат при ИСТИНА, результат при ЛОЖНО): тип результата;

Я только за такой вариант.


> for I := 0 to S.Count - 1 do
>            writeln(T, Format("   ""%s""%s", [S[I], IIF(S.
> Count - 1 - I,
>                  0, "", "||CHR(13)||CHR(10)||")]));
>
> сколько времени потребуется, чтобы понять смысл действий
> ?

Кому как, это дело привычки, если знать доподлинно, что делает IIF тому понятно, остальным нет.
А вообще мудрено написано. В си стиле я бы даже сказал.


 
Игорь Шевченко ©   (2012-12-17 00:36) [182]

DVM ©   (17.12.12 00:28) [181]


> А какой смысл когда параметров только 2 (условие и один
> из вариантов)?


Смотрим потроха indy и видим несколько объявлений:

function iif(ATest: Boolean; const ATrue: Integer; const AFalse: Integer): Integer; overload;
function iif(ATest: Boolean; const ATrue: string; const AFalse: string = ""): string; overload; { do not localize }
function iif(ATest: Boolean; const ATrue: Boolean; const AFalse: Boolean): Boolean; overload;

Я сам в таком же недоумении был - как это, iif и два параметра ?

а стандартная конструкция if then else не может быть overload, поэтому всегда понятна :)

Я все к одному - если код подобных субгениев не приходилось бы сопровождать - пусть себе пишут, как хотят.


 
Германн ©   (2012-12-17 02:12) [183]

А в результате весь спор свёлся к тому, что давно уже очевидно:
Borland/CodeGear/Embarkadero собирают весь "мусор", если он бесплатный.
Ну или его можно купить со скидкой.


 
RGV ©   (2012-12-17 05:09) [184]

я пишу так
 
 case day of
    1: FeedCat("Мурзик");
    2: begin
           FeedCat("Масяня");
           FeedCat("Мурзик");
        end;
    else FeedAllCats;
 end;
 try getObject(obj) except  DoSomething end;


 
TUser ©   (2012-12-17 07:04) [185]

у iif 4 параметра?

IIF(
S.Count - 1 - I,
0,
"",
"||CHR(13)||CHR(10)||")


 
DVM ©   (2012-12-17 10:14) [186]


> TUser ©   (17.12.12 07:04) [185]
> у iif 4 параметра?

да их там хоть 100 сделать можно, тогда он CASE подобным становится.


 
QAZ9   (2012-12-17 10:16) [187]


> Открою тайну - инклуды :)

мдаааа ,так и думал что про них вспомнишь
и как ты себе это представляеш?
например x:=x+1; помещенный в иклюд каким местом мне применить для y ?


 
RWolf ©   (2012-12-17 10:35) [188]


>  [180]
>          for I := 0 to S.Count - 1 do
>            writeln(T, Format("   ""%s""%s", [S[I], IIF(S.
> Count - 1 - I,                  0, "", "||CHR(13)||CHR(10)||")]));
>


этот код непрозрачен не из-за IIF, а из-за кривой записи.

for I := 0 to S.Count - 1 do
begin
 arg := IIF(S.Count - 1 - I, 0,
               "",
               "||CHR(13)||CHR(10)||");
 writeln(T, Format("   ""%s""%s", [S[I], arg]));
end;


 
Дмитрий С ©   (2012-12-17 10:37) [189]


> например x:=x+1; помещенный в иклюд каким местом мне применить
> для y ?

{$I include_begin.inc}y{$I include_middle.inc}1{$I include_end.inc} :)


 
Rouse_ ©   (2012-12-17 10:38) [190]


> QAZ9   (17.12.12 10:16) [187]
>
> > Открою тайну - инклуды :)
>
> мдаааа ,так и думал что про них вспомнишь

А зачем x := x + 1 в инклуд то помещать, когда есть Inc? :)
В остальных случаях соблюдаются определенные правила.


 
QAZ9   (2012-12-17 10:43) [191]


> А зачем x := x + 1 в инклуд то помещать

это минимальный гипотетический пример на твой гипотетический ответ

> Дмитрий С ©   (17.12.12 10:37) [189]

а содержимое этих самых файлов?
и кстати по любому проще повторить 100500 раз нужный код в разных местах чем инклюдить или и тут поспорим ?


 
DVM ©   (2012-12-17 11:22) [192]


> QAZ9   (17.12.12 10:43) [191]


> и кстати по любому проще повторить 100500 раз нужный код
> в разных местах

Проще функцию сделать, чем повторять код 100500 раз в нужных местах. А накладные расходы на вызов функции как правило в обычном коде не заметны, если только функция не вызывается в цикле миллионы раз.


 
QAZ9   (2012-12-17 11:35) [193]


> DVM ©   (17.12.12 11:22) [192]

неспорю :)
но батонокидатели обожают такие функции пихать в циклы миллиоразные :)
типа чем меньше букв тем оптимизированней код


 
Игорь Шевченко ©   (2012-12-17 11:53) [194]

RWolf ©   (17.12.12 10:35) [188]

А чем вариант


        for I := 0 to S.Count - 1 do
          if I <> S.Count - 1 then //Не последняя строка
            writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
          else
            writeln(T, Format("   ""%s""", [S[I]]));


менее прозрачен ?


 
RWolf ©   (2012-12-17 11:56) [195]


> [194]

ничем, лично я так и написал бы.


 
RWolf ©   (2012-12-17 11:58) [196]

впрочем, вру, я написал бы
writeln(T, "   """, S[I], ""||CHR(13)||CHR(10)||")
;)


 
Sha ©   (2012-12-17 12:32) [197]

> Игорь Шевченко ©   (17.12.12 11:53) [194]

Я бы и этот вариант развернул.
Спрашивается, нафига там формат, а не обычное сцепление?

P.S.
Сейчас как раз ковыряю корпоративный софт.
Настоящее лекарство от альцгеймера:
ребусы, кроссворды, анекдоты рядом не стояли.


 
Компромисс1   (2012-12-17 12:47) [198]

Кстати, всегда раздражал код вида

for I := 0 to S.Count - 1 do
          if I <> S.Count - 1 then //Не последняя строка
            writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
          else
            writeln(T, Format("   ""%s""", [S[I]]));

так и хочется его заменить на

if S.Count > 0 then
begin
 for I := 0 to S.Count - 2 do
 begin
     writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
 end;
 // последняя строка
  writeln(T, Format("   ""%s""", [S[S.Count-1]]));
end;


 
Компромисс1   (2012-12-17 12:47) [199]

Кстати, всегда раздражал код вида

for I := 0 to S.Count - 1 do
          if I <> S.Count - 1 then //Не последняя строка
            writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
          else
            writeln(T, Format("   ""%s""", [S[I]]));

так и хочется его заменить на

if S.Count > 0 then
begin
 for I := 0 to S.Count - 2 do
 begin
     writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
 end;
 // последняя строка
  writeln(T, Format("   ""%s""", [S[S.Count-1]]));
end;


 
Игорь Шевченко ©   (2012-12-17 15:16) [200]

Компромисс1   (17.12.12 12:47) [199]


> if S.Count > 0 then
> begin
>  for I := 0 to S.Count - 2 do
>  begin
>      writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||",
> [S[I]]))
>  end;
>  // последняя строка
>   writeln(T, Format("   ""%s""", [S[S.Count-1]]));
> end;


непонятно

Sha ©   (17.12.12 12:32) [197]


> Я бы и этот вариант развернул.
> Спрашивается, нафига там формат, а не обычное сцепление?
>


Кстати, да. Формат там ни к селу


> Сейчас как раз ковыряю корпоративный софт.
> Настоящее лекарство от альцгеймера:
> ребусы, кроссворды, анекдоты рядом не стояли.


Не сыпь мне соль на рану :)


 
Компромисс1   (2012-12-17 15:20) [201]

А так?

Count := S.Count;
if Count > 0 then
begin
// обработаем все элементы, кроме последнего
 for I := 0 to Count - 2 do
 begin
     writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||",
[S[I]]))
 end;
 // теперь обработаем последний элемент
  writeln(T, Format("   ""%s""", [S[Count-1]]));
end;


 
Игорь Шевченко ©   (2012-12-17 15:27) [202]

Компромисс1   (17.12.12 15:20) [201]

Меня смущает фраза Count - 2 в обоих вариантах кода


 
vuk ©   (2012-12-17 15:31) [203]

Если так свербит из-за этого IIF, то его надо просто раскрыть в доп. переменную:


>   for I := 0 to S.Count - 1 do
>   begin
>     if i <> s.Count - 1 then
>       tmp := "||CHR(13)||CHR(10)||"
>     else
>       tmp := "";
>     writeln(T, Format("   ""%s%s", [s[i], tmp]));
>   end;

И, кстати, в данном применении этот IIF использует исключительно константы, поэтому при его использовании ничего дпоплнительно не вычисляется. А стоит ли такие конструкции применять - это дело личное и читаемость только дело привычки. А то так можно дойти и до того, что вызовы функций ведут к тому, что непонятно что в коде делается. :)


 
Kerk ©   (2012-12-17 15:34) [204]

Видел однажды такую ситуацию:

SomeVar := IIF(Obj = nil, SomeDefaultValue, Obj.ParamValue);

:)


 
Компромисс1   (2012-12-17 15:38) [205]

Тогда можно заменить Count на LastIndex

LastIndex := S.Count - 1;
if LastIndex >= 0 then
begin
// обработаем все элементы, кроме последнего
 for I := 0 to LastIndex - 1 do
 begin
     writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||",
[S[I]]))
 end;
 // теперь обработаем последний элемент
  writeln(T, Format("   ""%s""", [S[LastIndex]]));
end;

Сейчас вроде нет никаких -2, все логично и привычно


 
Kerk ©   (2012-12-17 15:39) [206]

Офигеть как тебе удалось все запутать :)))


 
Аббат Пиккола   (2012-12-17 15:39) [207]

У одного амеиканского автора как-то читал, что формат работает быстрее, чем "обычное сцепление" строк в Дельфи. Сам не проверял.


 
Компромисс1   (2012-12-17 15:54) [208]

Это я еще плохо запутал :) Обычно я overuse functions и vars и пишу так:
Count := S.Count;
if(Count > 0) then
begin
 ProcessAllButLast(...)
 ProcessLast(...)
end;

но данном конкретном случае я бы постарался не отличать последнюю строку от предпоследней, уменьшив длину строки на N после цикла, чтобы избавиться от ненужных разделителей строк


 
Компромисс1   (2012-12-17 15:54) [209]

Это я еще плохо запутал :) Обычно я overuse functions и vars и пишу так:
Count := S.Count;
if(Count > 0) then
begin
 ProcessAllButLast(...)
 ProcessLast(...)
end;

но данном конкретном случае я бы постарался не отличать последнюю строку от предпоследней, уменьшив длину строки на N после цикла, чтобы избавиться от ненужных разделителей строк


 
Игорь Шевченко ©   (2012-12-17 16:06) [210]

Аббат Пиккола   (17.12.12 15:39) [207]


> У одного амеиканского автора как-то читал, что формат работает
> быстрее, чем "обычное сцепление" строк в Дельфи. Сам не
> проверял.


"Не верь, хозяин, этому константинопольскому ходже".
С чего ради ему работать быстрее ?


 
O'ShinW ©   (2012-12-17 17:06) [211]

это легко проверить
вроде, так?

var
 s1, s2, s: string;
 i,j: integer;
 t1,t2: Cardinal;
begin
 {$O-}
 for j := 0 to 9 do
 begin
   t1 := GetTickCount;
   for i := 0 to 9999999 do
   begin
     s1 := "qw";
     s2 := "er" + IntToStr(1);
     s := s1 + s2;
     if s = "qwer2" then ShowMessage("мда?"); //пусть еще и к результату обратится
   end;
   t1 := GetTickCount - t1;

   t2 := GetTickCount;
   for i := 0 to 9999999 do
   begin
     s1 := "qw";
     s2 := "er" + IntToStr(1);
     s := Format("%s%s",[s1,s2]);
     if s = "qwer2" then ShowMessage("мда? ");
   end;
   t2 := GetTickCount - t2;

   mmo1.Lines.Add(Format("%d(+) %d(fmt)",[t1, t2]));
 end;
 {$O+}
end;


 
O'ShinW ©   (2012-12-17 17:09) [212]

явных предпочтений нет,
6115(+) 5569(fmt)
5788(+) 5834(fmt)
6349(+) 5897(fmt)
6022(+) 6084(fmt)
6443(+) 5709(fmt)
5835(+) 5444(fmt)
6100(+) 5616(fmt)
5647(+) 5320(fmt)
5444(+) 5866(fmt)
5897(+) 6146(fmt)

хотя в асмах там по-другому
LStrCat3 vs (Более долго что-то)


 
Игорь Шевченко ©   (2012-12-17 17:29) [213]

O"ShinW ©   (17.12.12 17:06) [211]

Ты работу со строками в Delphi себе представляешь ?


 
O'ShinW ©   (2012-12-17 17:51) [214]


> Игорь Шевченко ©   (17.12.12 17:29) [213]

честно - не очень. Надо будет посмотреть.
Знаю, что отличается от других, С-подобных


 
Аббат Пиккола   (2012-12-17 18:07) [215]

2 O"ShinW ©
А если взять строки подлиннее?


 
Студент   (2012-12-17 18:16) [216]

Kerk ©   (17.12.12 15:34) [204]

И в чем тут криминал?


 
RWolf ©   (2012-12-17 18:57) [217]


> [216]

в AV, вестимо.



Страницы: 1 2 3 4 5 6 вся ветка

Форум: "Прочее";
Текущий архив: 2013.04.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.12 MB
Время: 0.01 c
15-1355913207
Дмитрий С
2012-12-19 14:33
2013.04.14
Открыть файл от имени администратора.


2-1349594839
alexdn
2012-10-07 11:27
2013.04.14
Совершенно не понятный эффект


15-1355337472
Игорь Шевченко
2012-12-12 22:37
2013.04.14
Люди, которые пишут begin..end вокруг одного оператора


15-1355571069
OLEG1963LORA
2012-12-15 15:31
2013.04.14
Аппаратное обеспечение


15-1354877433
TUser
2012-12-07 14:50
2013.04.14
Судебные перспективы





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