Текущий архив: 2006.12.31;
Скачать: CL | DM;
ВнизОптимальный стиль программирования Найти похожие ветки
← →
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]
> О, хоть один добрый человек перевёл, что же это за такие "циклы в юзасах" :-)
А зачем, для трепа это не требуется, а большего эта ветка не представляет.
Страницы: 1 2 3 вся ветка
Текущий архив: 2006.12.31;
Скачать: CL | DM;
Память: 0.66 MB
Время: 0.083 c