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

Вниз

Оптимальный стиль программирования   Найти похожие ветки 

 
Cyrax ©   (2006-12-01 20:31) [0]

1. В Delphi для имён типов стандартом является буква "T" вначале имени. Причём для всех типов, включая классы. Хотя для классов можно было использовать и букву "C". Для имён указателей используется буква "P".
В С и C++ картина совсем иная. Имена типов и классов формально никак не выделяются.

2. В Delphi активно используются заглавные буквы для неконстант, для разделения слов в составе имени используется регистр. В C и C++ - знак "_", причём заглавные буквы в составе имени неконстант встречаются намного реже, чем в Delphi...

3. Отступы. По-моему, 8 пробелов это уже слишком. Фрагмент кода

void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString )
{
       int i=0;

       while( i<(int)str.length() )
       {
               unsigned char c = (unsigned char) str[i];

               if (    c == "&"
                    && i < ( (int)str.length() - 2 )
                        && str[i+1] == "#"
                        && str[i+2] == "x" )
               {

Оптимальный вариант - 2 или 4 пробела. Я использую 2...


 
Джо ©   (2006-12-01 20:33) [1]

И в чем суть ветки? Крик души? :)


 
Cyrax ©   (2006-12-01 20:38) [2]

Джо ©   (01.12.06 20:33) [1]
И в чем суть ветки? Крик души? :)

Хочу узнать предпочтения Delphi"стов и C-ников относительно организации кода. Часто вижу код, извращённый до невозможности... А веть ещё и либы пишут...


 
Cyrax ©   (2006-12-01 20:39) [3]

Да и по первым двум веткам - разница налицо. Тут уже встаёт вопрос, с чем связаны эти две тенденции (для Delphi/Pascal и C/С++)...


 
ANTPro ©   (2006-12-01 20:46) [4]

> [2] Cyrax ©   (01.12.06 20:38)

Эксперт тебе в руки :)
http://www.dow.wau.nl/aew/downloads/DelForEx.zip


 
Cyrax ©   (2006-12-01 21:06) [5]

Что там ?
6 метром - многовато...


 
Vga ©   (2006-12-01 21:07) [6]

> [3] Cyrax ©   (01.12.06 20:39)

Исторически. Кстати, встречал для С++ рекомендации разделять слова заглавной буквой, но первое слово - с маленькой. Примерно так myFunctionWithLongMultiwordName() :)
Примерно такой стиль вроде и Qt поощряет...


 
Чапаев ©   (2006-12-01 21:08) [7]

> Хочу узнать предпочтения Delphi"стов и C-ников относительно
> организации кода
А предпочтения 1С-ников не хочешь? Могу натравить франчайзинг...


 
Vga ©   (2006-12-01 21:08) [8]

> [5] Cyrax ©   (01.12.06 21:06)

Форматтер сорсов на Delphi. А вот откуда про 6 метров??? Он вроде меньше полуметра весит...


 
Джо ©   (2006-12-01 21:09) [9]

> Кстати, встречал для С++ рекомендации разделять слова заглавной
> буквой, но первое слово - с маленькой

Это т.н. "camelCase", используется активно в Java для имен методов.


 
Vga ©   (2006-12-01 21:09) [10]

> [2] Cyrax ©   (01.12.06 20:38)

Дельфист. Стиль - почти как в генофонде (на пробелы местами скуплюсь, и на комменты).


 
Vga ©   (2006-12-01 21:10) [11]

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


 
ANTPro ©   (2006-12-01 21:12) [12]

> [5] Cyrax ©   (01.12.06 21:06)

Какие 6 метров? 472кб...
Delphi Formatter - Встраивается в IDE. Жмем ctrl+D и открытый файл оформляется по стилю Borland.


 
Он   (2006-12-01 21:15) [13]


> 3. Отступы. По-моему, 8 пробелов это уже слишком

В студии 4. И в настройках настраивается. Как, впрочем, и в Delphi.


 
Vga ©   (2006-12-01 21:15) [14]

> [12] ANTPro ©   (01.12.06 21:12)

Не совсем. Стиль настраивается. Плюс штуки 4 пресетов стиля.


 
ProgRAMmer Dimonych ©   (2006-12-01 21:31) [15]

> Оптимальный вариант - 2 или 4 пробела. Я использую 2...
Объясните мне тупому, почему два? Неужели у всех программистов, кроме меня, так плохо со зрением, что один пробел и его отсутствие - неразличимы?

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


 
ANTPro ©   (2006-12-01 21:38) [16]

> [15] ProgRAMmer Dimonych ©   (01.12.06 21:31)
> почему два?

Потому что, все измеряется степенью двойки :)


 
Джо ©   (2006-12-01 21:41) [17]

> [15] ProgRAMmer Dimonych ©   (01.12.06 21:31)
> Очень часто приходится сталкиваться с кодом, в котором вложенных
> begin...end"ов не меньше десятка

Коду такому — отступы не помогут, его нужно переписать.


 
Vga ©   (2006-12-01 21:44) [18]

> [15] ProgRAMmer Dimonych ©   (01.12.06 21:31)

Затем, что 18 и 20 пробелов проще различить, чем 9 и 10


 
ProgRAMmer Dimonych ©   (2006-12-01 21:44) [19]

> ANTPro ©   (01.12.06 21:38) [16]
2 в нулевой = 1.

> Джо ©   (01.12.06 21:41) [17]
Ну, иногда бывает, что такой код читать удобнее, но просто количество пробелов не позволяет этого делать, не трогая прокрутки. С ходу примера не приведу, но двойной for с двойным if"ом внутри (каждый из if"ов - с begin...end"ом) - это не фантастика, а вполне реальный код.


 
isasa ©   (2006-12-01 21:44) [20]

Крик души.
Все, что угодно, только не венгерская нотация. :)


 
ProgRAMmer Dimonych ©   (2006-12-01 21:45) [21]

> Vga ©   (01.12.06 21:44) [18]
:) ?


 
Джо ©   (2006-12-01 21:46) [22]

> [20] isasa ©   (01.12.06 21:44)
> Крик души.
> Все, что угодно, только не венгерская нотация. :)

Мой крик души: Всё, что угодно, только не этот противный Джавовский camelCase! :D


 
Джо ©   (2006-12-01 21:48) [23]

> С ходу примера не приведу, но двойной for с двойным if"ом
> внутри (каждый из if"ов - с begin...end"ом) - это не фантастика,
> а вполне реальный код.

Десятка не набирается:
for
begin
  for
    begin
      if
        begin
          if
            begin

Всего 8 :)

Но и такое, по-моему, переписать нужно. Одинарными оступами не лечится :)


 
Vga ©   (2006-12-01 21:49) [24]

> [21] ProgRAMmer Dimonych ©   (01.12.06 21:45)

В прямом смысле. Чем больше отступ, тем он заметнее. Иначе в некоторых случаях становится сложно понять, какой это отступ/блок.


 
Vga ©   (2006-12-01 21:50) [25]

> [23] Джо ©   (01.12.06 21:48)

Да и влезает нормально (правда, у меня 17" ЖК в стандартном разрешении).


 
Джо ©   (2006-12-01 21:52) [26]

> [25] Vga ©   (01.12.06 21:50)
> > [23] Джо ©   (01.12.06 21:48)
>
> Да и влезает нормально (правда, у меня 17" ЖК в стандартном
> разрешении).

У меня 19, влезает тем более :) Но что с того, что он в экран помещается? Оно в мозгу не помещается, вот главная проблема :)


 
Vga ©   (2006-12-01 21:53) [27]

> [26] Джо ©   (01.12.06 21:52)

Если 19" ЖК и ничего не изменилось (т.е. они по прежнему 1280х1024) - то помещается точно также :)
А чтобы в мозгу не помещалось, есть и более эффективные методы, тут где-то на сишный сорец шахмат была ссылка :)


 
ProgRAMmer Dimonych ©   (2006-12-01 21:54) [28]


> for
> begin
>   for
>     begin
>       if
>         begin
>           if
>             begin


После первого for"а тоже надо бы отступ сделать, как после второго. :)
А код вполне нормальный. IMHO.

> Vga ©   (01.12.06 21:49) [24]
В QBasic в своё время подпрограммы в редакторе показывалисьне прямо в тексте программы, а отдельно. Может, проще использовать что-то подобное, чем 5432135 пробела?


 
Джо ©   (2006-12-01 21:56) [29]

> [28] ProgRAMmer Dimonych ©   (01.12.06 21:54)
>
> > for
> > begin
> >   for
> >     begin
> >       if
> >         begin
> >           if
> >             begin
>
>
> После первого for"а тоже надо бы отступ сделать, как после
> второго. :)


Это просто опечатка у меня. Набирал прямо в форуме.

> А код вполне нормальный. IMHO.
Жутки код, жуткий. ИМХО :)
П.С. У меня такой тоже встречается, я не лицемер :)


 
Vga ©   (2006-12-01 21:58) [30]

> > Vga ©   (01.12.06 21:49) [24]
> В QBasic в своё время подпрограммы в редакторе показывалисьне
> прямо в тексте программы, а отдельно. Может, проще использовать
> что-то подобное, чем 5432135 пробела?

???
Насколько я знаю, подпрограммы (которые теперь функциями зовутся) и в дельфи отдельно. А коду, изобилующему goto вообще отступы ни к чему. Он и так разбору не подлежит.


 
Vga ©   (2006-12-01 21:59) [31]

> [29] Джо ©   (01.12.06 21:56)

На самом деле надо так:
for
begin
 for
 begin
   if
   begin
     if
     begin


 
ProgRAMmer Dimonych ©   (2006-12-01 22:02) [32]

> Vga ©   (01.12.06 21:58) [30]
В какой версии Delphi? У меня в 7 всё идёт в одном текстовом поле, одном окне редактора.

Кстати, goto ближе к ассемблеру. Если Вы мне покажете программу, в которой нет ни одного jmp, буду очень признателен.


 
ProgRAMmer Dimonych ©   (2006-12-01 22:03) [33]

> Vga ©   (01.12.06 21:59) [31]
Сколько пробелов? В этом шрифте смотрится вполне прилично, IMHO...


 
TUser ©   (2006-12-01 22:08) [34]

Я пробелов раньше ставил три. Логика - если надо будет вставить промежуточный уровень, то это легко можно следать даже два раза, несмещая кусок кода. Получалось, что где-то два пробела, глде-то 1, где-то три. Вот это было ужасно. Теперь ставлю два всегда. В последнее время стал не ставить "лишние" пробелы, например
for i := ...
for j := ... do begin
 ...
 end;

вместо
for i := ...
 for j := ... do begin
   ...
   end;


 
ANTPro ©   (2006-12-01 22:13) [35]

> [19] ProgRAMmer Dimonych ©   (01.12.06 21:44)
> 2 в нулевой = 1.

Черт, про четность забыл сказать :)


 
Vga ©   (2006-12-01 22:13) [36]

> [32] ProgRAMmer Dimonych ©   (01.12.06 22:02)

Не на x86. Никакой замены jxx в этой системе команд нет.

> [33] ProgRAMmer Dimonych ©   (01.12.06 22:03)

2, как обычно. Разрешение надо выше ставить... И вообще, форматируй как хочешь, для приведения к любимому виду чужих сорцов есть DelFor и подобные.

> > Vga ©   (01.12.06 21:58) [30]
> В какой версии Delphi? У меня в 7 всё идёт в одном текстовом
> поле, одном окне редактора.

А в этом плане... Естественно в одном, там же только подпрограммы. Программа - это в dpr от begin до end. Обычно 2+<количество форм> строк.


 
ProgRAMmer Dimonych ©   (2006-12-01 22:16) [37]

> Vga ©   (01.12.06 22:13) [36]
> > В какой версии Delphi? У меня в 7 всё идёт в одном текстовом
>
> > поле, одном окне редактора.
>
> А в этом плане... Естественно в одном, там же только подпрограммы.
>  Программа - это в dpr от begin до end. Обычно 2+<количество
> форм> строк.
Вот. А в QBasic отображалась только основная часть программы, а доступ к подпрограммам осуществлялся через F2. По нажатии на F2 выводился список всех процедур/функций программы свозможностью перехода к выбранной. На экране каждая процедура была похожа на отдельную программу (за исключением оформления как процедуры). В файл сохранялось единым целым. Так сказать, удобства ради.


 
Vga ©   (2006-12-01 22:21) [38]

> [37] ProgRAMmer Dimonych ©   (01.12.06 22:16)

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


 
MeF Dei Corvi ©   (2006-12-01 22:27) [39]


> Вот. А в QBasic отображалась только основная часть программы,
>  а доступ к подпрограммам осуществлялся через F2. По нажатии
> на F2 выводился список всех процедур/функций программы свозможностью
> перехода к выбранной. На экране каждая процедура была похожа
> на отдельную программу (за исключением оформления как процедуры).

Это же жутко неудобно!


 
ProgRAMmer Dimonych ©   (2006-12-01 22:28) [40]

> MeF Dei Corvi ©   (01.12.06 22:27) [39]
Чем?


 
Ермак ©   (2006-12-01 22:35) [41]

Лично я использую такой стиль (в Компонентном Паскале):
1) без префиксов;
2) имена типов и процедур - с заглавной буквы, всегда;
3) имена переменных с маленькой буквы, всегда;
4) разделение слов в имени - скачком регистра (myVariable) - это еще называют "стиль верблюд";
5) явная квалификация имени модуля перед идентификатором и явное именование self-контекста - этого у нас язык требует, и правильно делает... :-)


 
MeF Dei Corvi ©   (2006-12-01 22:36) [42]


> Чем?

Тем, что не видишь всего кода :) Уменьшается эффективность "просмотра кода"(code review всмысле). Да и слишком долго это - переключаться, выбирать функцию из списка... Дело вкуса) У меня подобная фича вызывает отвращение))

Тем более, что в BDS есть сворачивание кусков кода, которые в данный момент не нужны. Вот подобное мне нравится больше, т.к. лично мне удобнее видеть что конкретно делает каждая функция.


 
Kolan ©   (2006-12-01 22:47) [43]

> стандартом является буква "T"

В UML тоже так. И CamelCase тоже. А UML - это международный стандарт.


 
ЮЮ ©   (2006-12-02 10:20) [44]


> Джо ©   (01.12.06 21:48) [23]
> > С ходу примера не приведу, но двойной for с двойным if"ом
>
> > внутри (каждый из if"ов - с begin...end"ом) - это не фантастика,
>
> > а вполне реальный код.
>
> Десятка не набирается:
> for
> begin
>   for
>     begin
>       if
>         begin
>           if
>             begin

>
> Всего 8 :)
>
> Но и такое, по-моему, переписать нужно. Одинарными оступами
> не лечится :)



> Vga ©   (01.12.06 21:59) [31]
> > [29] Джо ©   (01.12.06 21:56)
>
> На самом деле надо так:
> for
> begin
>  for
>  begin
>    if
>    begin
>      if
>      begin


Где вас писать учили? Надо ИСКЛЮЧИТЕЛЬНО так:

>
 for  ... do begin
   for  ... do begin
     if ... then  begin
       ...
       if ... then  begin
         ...
       end;
       ...
   end;
 end;

begin пишется с начала строки только в том случае, если он не вошер в 80 символов строки с do (then). Да и то уже в виде
if
 ...
then begin
 ...
end
else begin
 ...
end;

Какие 19 дюймов. Серая вертикаль редактора кола IDE - дальше не моги.


 
Cyrax ©   (2006-12-02 10:31) [45]

ЮЮ ©   (02.12.06 10:20) [44]

В этом случае нарушается удобочитаемость кода и затрудняется его структурное восприятие.
Все парные "теги" должны находится на одной вертикали, т.е. begin после for, then и else должен находиться на следующей строке. Исключением является случай, когда весь блок begin end умещается в одной строке (скажем, 2-3 коротких оператора).
В C, C++ и C# то же самое...

Что касается отступов, то 1 отступ опять-таки препятствует удобочитаемости. 2 отступа - уже вполне достаточно для визуального структурирования кода. 4 отступа - это уже на любителя, но при этом может возникнуть проблема с шириной кода, ограниченной (формально) 80 символами.


 
Vga ©   (2006-12-02 10:47) [46]

> Какие 19 дюймов. Серая вертикаль редактора кола IDE - дальше
> не моги.

Известно какие. На 800х600 даже 80 символов на экран не лезут.

> Где вас писать учили? Надо ИСКЛЮЧИТЕЛЬНО так:

Покажи в генофонде преобладание этого стиля. Я вот например помню, что там именно как в [31].


 
ЮЮ ©   (2006-12-02 10:52) [47]


>Все парные "теги" должны находится на одной вертикали, т.е. begin после for, then и else должен находиться на следующей
> строке.


В нашем корпоративном стиле - не должны :)
И после нескольких лет писания по стилю такие связки режут глаз.


 
Vga ©   (2006-12-02 10:55) [48]

> [47] ЮЮ ©   (02.12.06 10:52)

Ваш стиль тоже глаза режет тому, кто уже несколько лет Борландовского стиля придерживается.


 
ЮЮ ©   (2006-12-02 11:00) [49]


> Покажи в генофонде

такое, как в генофонде, тоже многим не нравится :)
var
 <B>I: Integer;


 
ЮЮ ©   (2006-12-02 11:01) [50]

имелось в виду - локальные переменные с заглавной буквы


 
Vga ©   (2006-12-02 11:07) [51]

> [50] ЮЮ ©   (02.12.06 11:01)

Ну это тоже на вкус... Например, переменные циков - i, j, k, l у меня обычно маленькие (а l вообще не рекомендуется использовать), остальные - большие (S, P, B - если требуется одиночная и не слишком осмысленная строка, указатель, булева переменная).


 
Mystic ©   (2006-12-02 11:15) [52]

Во-первых, я не понял как тут применимо слово "оптимальное". Есть общепринятое, но чем буква T в названии класса оптимальнее буквы C или, например, суффикса _t?

Во вторых, в C отступ есть табуляция, а уже в редакторе ты сам можешь настроить чему она равна.

Во-третьих в общем случае если это не корпоративное требование, то лично для меня стандарт не есть догма, и если я считаю что форматирование которое не стыкуется со стандартом в данном конкретном случае более ясно выделит мои намерения, то так и поступаю. Например, отступы. В данном конкретном примере

static int is_white_king_castle_possible(chess_context* ctx)
{
 if (ctx->board.castle_ability & WHITE_KING_CASTLE)
 if (WHITE_KING_SQUARE(&ctx->board) == E1)
 if (WHITE_ROOK_MASK(&ctx->board) & BITBOARD_FROM_SQUARE(H1))
 if (!(ctx->board.occupied & (BITBOARD_FROM_SQUARE(F1) | BITBOARD_FROM_SQUARE(G1))))
 if (ctx->status == STATUS_INVALID || !chess_is_under_attack(&ctx->board, TOGGLE(ctx->color), E1))
 if (ctx->status == STATUS_INVALID || !chess_is_under_attack(&ctx->board, TOGGLE(ctx->color), F1))
 if (ctx->status == STATUS_INVALID || !chess_is_under_attack(&ctx->board, TOGGLE(ctx->color), G1))
   return 1;
 return 0;


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

Или, например, когда много вложеных циклов for, то тоже иногда их выписываю без отступа:

 { Test Estimate hand }
 for r1 := TWO to ACE do
 for s1 := SPADES to HEARTS do
 for r2 := TWO to ACE do
 for s2 := SPADES to HEARTS do
 for r3 := TWO to ACE do
 for s3 := SPADES to HEARTS do
 for r4 := TWO to ACE do
 for s4 := SPADES to HEARTS do
 for r5 := TWO to ACE do
 for s5 := SPADES to HEARTS do
   EstimateFiveCardHand(r1, s1, r2, s2, r3, s3, r4, s4, r5, s5);



> А коду, изобилующему goto вообще отступы ни к чему. Он и
> так разбору не подлежит.


Почему не подлежит? Взять к примеру TeX, код читается отлично, не смотря на использоние goto :) При реализации конечного автомата goto напрашивается сам-собой. Ибо если не выделять как-то состояния, то получается жуткая смесь if-ов большой вложености часто с дублированием кода. В приведеном ниже примере я обошелся без goto введением дополнительной переменной и использованием комбинации while + switch, но я не понимаю, чем альтернатвная реализация с goto была бы менее читабельной?


#define goto_state(no)    { state = (no); break; }
static int PGN_read_move_data(
 chess_context* ctx,
 chess_piece* promotion)
{
 enum {
   DONE,              /* finish state */
   INITIAL,           /* initial state */
   FIRST_LETTER,      /* the current symbol is a first letter in the move */
   FIRST_DIGIT,       /* the current symbol is first digit in the move */
   TAKING,            /* the the current symbol is taking ("x") */
   SIMPLE_MOVE,       /* the the current symbol is movement ("-") */
   LAST_square,        /* the last square is expected */
   LAST_DIGIT,        /* the last digit in the input */
   RUS_PAWN_TAKING,   /* the pawn taking in the russian style: cd, ef, ... */
   PAWN_PROMOTION,    /* pawn promotion part */
   SWAP_FROM_AND_TO   /* the move contains only destination square */
 } state = INITIAL;

 int src_file = -1;
 int src_rank = -1;
 int dest_file = -1;
 int dest_rank = -1;

 if (promotion) *promotion = NO_PIECE;
 ctx->is_take = 0;

 while (state != DONE)
 {
   switch(state)
   {

     case INITIAL:
       if (*ctx->ptr == "x" || *ctx->ptr == ":") goto_state(TAKING);
       if (*ctx->ptr >= "a" && *ctx->ptr <= "h") goto_state(FIRST_LETTER);
       if (*ctx->ptr >= "1" && *ctx->ptr <= "8") goto_state(FIRST_DIGIT);
         return ERR_PGN_INVALID_MOVE_NOTATION;

     case FIRST_LETTER:
       src_file = *ctx->ptr - "a";
       ++ctx->ptr;
       if (*ctx->ptr == "x" || *ctx->ptr == ":") goto_state(TAKING);
       if (*ctx->ptr >= "a" && *ctx->ptr <= "h") goto_state(LAST_square);
       if (*ctx->ptr >= "1" && *ctx->ptr <= "8") goto_state(FIRST_DIGIT);
         return ERR_PGN_INVALID_MOVE_NOTATION;

     case FIRST_DIGIT:
       src_rank = *ctx->ptr - "1";
       ++ctx->ptr;
       if (*ctx->ptr >= "a" && *ctx->ptr <= "h") goto_state(LAST_square);
       if (*ctx->ptr == "x" || *ctx->ptr == ":") goto_state(TAKING);
       if (*ctx->ptr == "-") goto_state(SIMPLE_MOVE);
       if (*ctx->ptr == "=") goto_state(PAWN_PROMOTION);
       goto_state(SWAP_FROM_AND_TO)

     case TAKING:
       ++ctx->ptr;
       ctx->is_take = 1;
       goto_state(LAST_square);

          /* Еще такой же текст*/
          ........................

     case DONE: /* No action */;

   }
 }

 /* Тут еще немного обработки порезано */
 ...........................................
}


 
SergP ©   (2006-12-02 11:57) [53]

> [17] Джо ©   (01.12.06 21:41)
> > [15] ProgRAMmer Dimonych ©   (01.12.06 21:31)
> > Очень часто приходится сталкиваться с кодом, в котором
> вложенных
> > begin...end"ов не меньше десятка
>
> Коду такому — отступы не помогут, его нужно переписать.


Не всегда.


 
Джо ©   (2006-12-02 12:36) [54]

> [53] SergP ©   (02.12.06 11:57)
> > [17] Джо ©   (01.12.06 21:41)
> > > [15] ProgRAMmer Dimonych ©   (01.12.06 21:31)
> > > Очень часто приходится сталкиваться с кодом, в котором
>
> > вложенных
> > > begin...end"ов не меньше десятка
> >
> > Коду такому — отступы не помогут, его нужно переписать.
>
>
> Не всегда.

Конечно, не всегда. Я же не ходячий кладезь единственно верных знания на все случаи жизни :)


 
ProgRAMmer Dimonych ©   (2006-12-02 16:01) [55]

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


 
Palladin ©   (2006-12-02 16:09) [56]

Первое, на что я напоролся у Джоела где я категорически не согласен с его позицией.

http://local.joelonsoftware.com/mediawiki/index.php/Как_заставить_неправильный_код_выглядеть_неправильно


 
isasa ©   (2006-12-02 18:55) [57]

Cyrax ©   (02.12.06 10:31) [45]
но при этом может возникнуть проблема с шириной кода, ограниченной (формально) 80 символами.


:)
Главное переломить себя и установить в голове альбомную ориетацию страницы ....


 
palva ©   (2006-12-02 19:05) [58]

А у мегя когда-то были такие увлечения. Я писал так:

if then begin
   for i := 0 to 10 do begin
       begin
           begin
end end end end;

или так еще:

if ... then begin
   a := ...
end else if ... begin
   a := do ...
end else if ... begin
   a := ...
end else begin
   a := ...
end


 
Sam Stone ©   (2006-12-02 19:15) [59]

непонятная какая-то тема... Да и какая разница, как писать? так
if then begin

end;

или так
if then
begin

end;

? Что, если вы используете первый вариант, то не примите на работу программиста, который юзает второй вариант?
Оба варианта ведь удобочитаемы.


 
isasa ©   (2006-12-02 19:30) [60]

Sam Stone ©   (02.12.06 19:15) [59]

непонятная какая-то тема... Да и какая разница, как писать?


А поговорить?


 
Sam Stone ©   (2006-12-02 19:44) [61]

> А поговорить?

это святое :)))


 
Anatoly Podgoretsky ©   (2006-12-02 20:39) [62]

> isasa  (02.12.2006 18:55:57)  [57]

Нафиг, надо монитор R2 и Matrox и не надо ничего переламывать.


 
MsGuns ©   (2006-12-02 20:54) [63]

>Mystic ©   (02.12.06 11:15) [52]
>Я не использовал отступы во вложеных if отчасти потому что текст последнего из условий сьехал бы далеко вправо, а также потому что в целях оптимизации возможно необходимо будет поменять порядок проверки условий, и с этой точки зрения мне важно подчеркнуть их расноправность (каждое из условий может быть безошибочно проверено отдельно от других).

Если условия равноправные и нет обработки альтернативы, почему бы вместо этажерки из IF не использовать связки and/or ?


 
ProgRAMmer Dimonych ©   (2006-12-02 22:44) [64]

> MsGuns ©   (02.12.06 20:54) [63]
> Если условия равноправные и нет обработки альтернативы,
> почему бы вместо этажерки из IF не использовать связки and/or?
Пример:

if X=5 then
begin
MessageBox(...);
if Y=10 then
begin
 Z:=15;
 F:=Screen.Width+5;
end;
end;


 
jack128 ©   (2006-12-02 22:59) [65]

Palladin ©   (02.12.06 16:09) [56]
я категорически не согласен с его позицией.


там этих позиций - несколько.  На счет венгерской натации - я с ним согласен, на счет исключений - нет.


 
MsGuns ©   (2006-12-02 23:01) [66]

>ProgRAMmer Dimonych ©   (02.12.06 22:44) [64]

У Mystic в коде нету блоков


 
Kostafey ©   (2006-12-02 23:32) [67]

> [4] ANTPro ©   (01.12.06 20:46)
> > [2] Cyrax ©   (01.12.06 20:38)
>
> Эксперт тебе в руки :)
> http://www.dow.wau.nl/aew/downloads/DelForEx.zip

А что эт такое ?


 
Mystic ©   (2006-12-02 23:32) [68]

> Если условия равноправные и нет обработки альтернативы,
> почему бы вместо этажерки из IF не использовать связки and/or
> ?


Мне кажется, что это дело вкуса. Выражение в несколько строчек выглядит для меня не столь эстетично, да и закомментировать первое условие сложнее. Комментирование условий часто встречается при отладке SQL, там я использую симметричную запись, в которой очень легко закомментировать ряд условий и/или поменять местами условия:

SELECT * FROM DUAL DUMMY /* Для Oracle можно добиться также симметричной формы и в перечне таблиц! */
 , A
 , B
 , C
 , ...
WHERE 1=1
 AND A.ID = B.A_ID
 AND A.VALUE >= 5.5
 AND C.FEN LIKE "%KQkq%"


Такую же симметричную запись я стараюсь использовать и в случае объемных выражений на языках типа С, паскаль:

static void init_knight_control()
{
register int i;
for(i=0; i<64; i++)
 knight_control[i] = 0 /* For symmetry */
  | ((BITBOARD_FROM_SQUARE(i) & ~RANK_8_MASK & ~RANK_7_MASK & ~FILE_H_MASK) << 17 )
  | ((BITBOARD_FROM_SQUARE(i) & ~RANK_8_MASK & ~RANK_7_MASK & ~FILE_A_MASK) << 15 )
  | ((BITBOARD_FROM_SQUARE(i) & ~RANK_8_MASK & ~FILE_G_MASK & ~FILE_H_MASK) << 10 )
  | ((BITBOARD_FROM_SQUARE(i) & ~RANK_8_MASK & ~FILE_A_MASK & ~FILE_B_MASK) <<  6 )
  | ((BITBOARD_FROM_SQUARE(i) & ~RANK_1_MASK & ~FILE_G_MASK & ~FILE_H_MASK) >>  6 )
  | ((BITBOARD_FROM_SQUARE(i) & ~RANK_1_MASK & ~FILE_A_MASK & ~FILE_B_MASK) >> 10 )
  | ((BITBOARD_FROM_SQUARE(i) & ~RANK_1_MASK & ~RANK_2_MASK & ~FILE_H_MASK) >> 15 )
  | ((BITBOARD_FROM_SQUARE(i) & ~RANK_1_MASK & ~RANK_2_MASK & ~FILE_A_MASK) >> 17 )
  ;
}


 
Vga ©   (2006-12-02 23:37) [69]

> [52] Mystic ©   (02.12.06 11:15)

> > А коду, изобилующему goto вообще отступы ни к чему. Он
> и
> > так разбору не подлежит.
>
> Почему не подлежит? Взять к примеру TeX, код читается отлично,
> не смотря на использоние goto :) При реализации конечного
> автомата goto напрашивается сам-собой. Ибо если не выделять
> как-то состояния, то получается жуткая смесь if-ов большой
> вложености часто с дублированием кода. В приведеном ниже
> примере я обошелся без goto введением дополнительной переменной
> и использованием комбинации while + switch, но я не понимаю,
> чем альтернатвная реализация с goto была бы менее читабельной?

Ну то Кнут :) Да и Паскаль не дает так запутать программу goto как BASIC или ASM :)
Я имел в виду то, что с использованием goto программы часто очень запутаны, тем более на BASIC"е, на котором обычно пишут отнюдь не перцы.


 
Cyrax ©   (2006-12-09 21:51) [70]

Удалено модератором
Примечание: Создание пустых сообщений


 
Cyrax ©   (2006-12-10 15:16) [71]

Такой вопрос к теме: куда лучше совать инклуды, необходимые в имплементе модуля (.cpp) - в .h нашего модуля или в .cpp.
С одной стороны, лучше в .cpp, т.к. только там он и требуется (используется)
С другой стороны, происходит раброс инклудов - часть в .h, часть в .cpp...

Ещё интересно, почему в Delphi объявления и имплементы не разделяют, как в C/C++...


 
Vga ©   (2006-12-11 01:12) [72]

> [71] Cyrax ©   (10.12.06 15:16)

В .h - только те хедеры, которые используются в .h. В .cpp - только те, которые используются в нем минус те, которые уже объявлены в его хедере.
В Delphi - разделяют, по секциям implementation и interface. Разделение в С (С++ от С такое унаследовал) объясняется особенностями выбранного метода раздельной компиляции. В Pascal и Delphi используется более продвинутый метод раздельной компиляции.


 
Cyrax ©   (2006-12-11 01:34) [73]

>Vga ©   (11.12.06 01:12) [72]
>В Pascal и Delphi используется более продвинутый метод раздельной
>компиляции.

Знаю. Вижу. Понимаю, чего ты ожидаешь от меня...
Будет обязательно...


 
ors_archangel ©   (2006-12-11 05:12) [74]


> В Delphi - разделяют, по секциям implementation и interface.
>  Разделение в С (С++ от С такое унаследовал) объясняется
> особенностями выбранного метода раздельной компиляции. В
> Pascal и Delphi используется более продвинутый метод раздельной
> компиляции.

В C ты можешь кинуть h со своим проектом и его смогут юзать, а в Delphi тнбе придётся руками отделать интерфейсную чать от имплементной, т.к. они в одном файле (или сразу писать два проекта, как бы), в чём продвинутость, извини, можешь подробнее. Ещё в Делфи, мне кажется совсем уже (лучше промолчу), что если мне что-то нужно юзать в private интерфейсного класса, то я это юзаю в interface uses, хотя ведь это нужно в private <=> implementation и должно бы юзаться в implementation uses, здесь ещё очень помогает, что циклы в юзасах нельзя делать, т.к. Делфи их боится как вороны пугало, а боятся его нечего.


 
Юрий Зотов ©   (2006-12-11 08:08) [75]

> ors_archangel ©   (11.12.06 05:12) [74]

1. Зачем отделять интерфейсную чать от имплементной, если первая без второй на фиг никому не нужна? А если и приспичило, так есть include.

2. Private - он где угодно private и остается. Хоть в interface, хоть в implementation - разницы никакой и на доступность секции не влияет. А вот на доступность класса - влияет. Что вполне логично.
 
3. Циклические ссылки в uses делать можно, но в разных частях. И это тоже вполне логично (почему - см. п.5).

4. > т.к. Делфи их боится как вороны пугало
Не только Delphi. Eclipse, например, тоже боится. И это правильно (почему - см. п.5).

5. > а боятся его нечего.

unit Unit1;
interface
uses Unit2;
...
end.

unit Unit2;
interface
uses Unit1;
...
end.

Если сумеете указать правильный порядок инициализации этих двух модулей - соглашусь.

==================

Снова "Мартышка и очки"?


 
Vga ©   (2006-12-11 14:17) [76]

> [74] ors_archangel ©   (11.12.06 05:12)


> В C ты можешь кинуть h со своим проектом и его смогут юзать,
> а в Delphi тнбе придётся руками отделать интерфейсную чать
> от имплементной, т.к. они в одном файле (или сразу писать
> два проекта, как бы), в чём продвинутость, извини, можешь
> подробнее

Зачем? В С/С++ необходимо предоставить .h и .c/.cpp (для открытых) или .obj/.lib(ar архив с несколькими .obj) для закрытых, так как .obj ни малейшей инфы о своем интерфейса не предоставляет. В Delphi достаточно предоставить .pas или .dcu, так как они содержат в себе все необходимое.

> Ещё в Делфи, мне кажется совсем уже (лучше промолчу), что
> если мне что-то нужно юзать в private интерфейсного класса,
> то я это юзаю в interface uses, хотя ведь это нужно в private
> <=> implementation

А что, разве в С++ можно объявить поле в private, не подключив хедер с описанием типа этого поля? Не верю.
Что не позволяет циклическое подключение - и правильно, в С++ еще и самому приходится заботиться, чтобы оно не включило один хедер несколько раз (или того хуже, зациклилось - A включает B, B включает A и так без конца).


 
Vga ©   (2006-12-11 14:18) [77]

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


 
Vga ©   (2006-12-11 14:18) [78]

> Снова "Мартышка и очки"?

Да уж, похоже на то :( Не дошел он до книжки, а жаль...


 
Плохиш ©   (2006-12-11 15:53) [79]


> Юрий Зотов ©   (11.12.06 08:08) [75]


> 3. Циклические ссылки в uses делать можно

О, хоть один добрый человек перевёл, что же это за такие "циклы в юзасах" :-)

> Vga ©   (11.12.06 14:18) [78]

> Не дошел он до книжки

Не царское это дело, книжки какие-то читать.


 
Anatoly Podgoretsky ©   (2006-12-11 15:59) [80]

> Плохиш  (11.12.2006 15:53:19)  [79]

> О, хоть один добрый человек перевёл, что же это за такие "циклы в юзасах" :-)

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


 
GrayFace ©   (2006-12-12 19:43) [81]

В Delphi я отклоняюсь от генофонда в сторону не писания пробелов вокруг :=, *, / и одно-двухбуквенные переменные пишу с маленькой, а также break, continue и exit, и else прилепляю к end. Еще, если пишу в обну строку, то после then делаю 2 пробела: if a then  a:=b;. А в C++ по-Жабовски, но с 2 пробелами после if.

Vga ©   (01.12.06 22:13) [36]
Не на x86. Никакой замены jxx в этой системе команд нет.

Ну, например, вот jnz:
setnz cl
movzx ecx, cl
mov eax, @Label // Delphi так сделать, по-моему, не позволит
imul ecx, (JmpAddr - @Label)
add eax, ecx
push ecx
ret
@Label:


ЮЮ ©   (02.12.06 10:20) [44]
Где вас писать учили? Надо ИСКЛЮЧИТЕЛЬНО так:

for  ... do begin
  for  ... do begin
    if ... then  begin
      ...
      if ... then  begin
        ...
      end;
      ...
  end;
end;

УЖОС!

Vga ©   (11.12.06 14:17) [76]
В Delphi достаточно предоставить .pas или .dcu, так как они содержат в себе все необходимое.

Dcu меняются от версии к версии. Поэтому тут C++ впереди. Зато работать с .h-ками зверски неудобно.


 
Vga ©   (2006-12-12 21:38) [82]

> Vga ©   (01.12.06 22:13) [36]
> Не на x86. Никакой замены jxx в этой системе команд нет.
> Ну, например, вот jnz:
> setnz cl
> movzx ecx, cl
> mov eax, @Label // Delphi так сделать, по-моему, не позволит
> imul ecx, (JmpAddr - @Label)
> add eax, ecx
> push ecx
> ret
> @Label:

Это не замена, это завуалированный jump aka goto. А if then else, case/switch, while do там нету. Они реализуются через jxx.


 
Vga ©   (2006-12-12 21:39) [83]

> Vga ©   (11.12.06 14:17) [76]
> В Delphi достаточно предоставить .pas или .dcu, так как
> они содержат в себе все необходимое.
> Dcu меняются от версии к версии. Поэтому тут C++ впереди.
> Зато работать с .h-ками зверски неудобно.

.OBJ тоже бывают разных форматов, ни разу не приходилось видеть пяток статических библиотек для разных компилеров? Да и .pas все равно лучше :)


 
Vga ©   (2006-12-12 21:39) [84]

> Да и .pas все равно лучше :)

Чем .dcu я имею в виду.


 
GrayFace ©   (2006-12-12 22:18) [85]

Vga ©   (12.12.06 21:39) [83]
.OBJ тоже бывают разных форматов, ни разу не приходилось видеть пяток статических библиотек для разных компилеров?

Нет, с C++ мало работал.


 
Vga ©   (2006-12-12 23:23) [86]

> [85] GrayFace ©   (12.12.06 22:18)

Обычно закрытые библиотеки предоставляют версии для Borland C++, GCC/MinGW, MSVC, иногда еще для Watcom, LCC, etc, вплоть до десятка-двух. Плюс еще пяток версий SDK для других платформ (хорошо еще под Linux особых альтернатив нет, там библиотеки в одном формате).



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

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.73 MB
Время: 0.056 c
15-1164987661
Desdechado
2006-12-01 18:41
2006.12.31
Пишущий DVD в режиме PIO


3-1160987270
Merko2005
2006-10-16 12:27
2006.12.31
Процедура сохранения


2-1165897474
Kvinta
2006-12-12 07:24
2006.12.31
Вернуть Field а ADO


2-1165999682
sergeyst
2006-12-13 11:48
2006.12.31
Попадание точки в заданную область


15-1165511417
Карелин Артем
2006-12-07 20:10
2006.12.31
Мед осмотр или очередная галочка.





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