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

Вниз

Какой должен быть код, чтобы вам было легче его понять ?   Найти похожие ветки 

 
Кен ©   (2003-06-27 06:19) [0]

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

Вот так :

for i := 0 to 9 do
begin
for j := 0 to 9 do
begin
...
end;
end;


или так :

for i := 0 to 9 do begin for j := 0 to 9 do begin
...
end; end;


Зато второе компактнее. Меньше листать экран.

--------
Как лучше записывать формулы с пробелами или без ?
i := 1; или i:=1;
Тоже самое про вызовы функций
f(1,2,3) , f( 1, 2, 3), f ( 1 , 2 , 3 )

--------
Как писать if ?
if ( ( a < b ) and ( c < d ) ) then
или
if ( ( a < b )
and ( c < d ) )
then
ваш вариант.

--------------
Лично меня всегда раздрожает отсутсвие begin и end; Стараюсь их писать всегда. Так проще добавлять чего нибудь. И просто проще, когда всё в одном стиле. Понятнее что к чему относится, где начинается и где кончается.

Как же лучше ?


 
Zacho ©   (2003-06-27 06:38) [1]


> Кен © (27.06.03 06:19)
> Как вообще лучше писать программный код, чтобы он был понятен
> другим программистам ?
>
> Вот так :

И не так, и не так. А вот так:
for i := 0 to 9 do
begin
for j := 0 to 9 do
begin
...
end;
end;

А вообще - посмотри исходники RTL и VCL Дельфи. Imho, вполне можно использовать как пример правильного оформления кода.


 
Думкин ©   (2003-06-27 06:47) [2]

for i := 0 to 9 do
for j := 0 to 9 do
begin
...
end;

Или по настроению:

for i := 0 to 9 do
for j := 0 to 9 do begin
...
end;



 
sniknik ©   (2003-06-27 09:00) [3]

четкого ответа на вопрос что массам больше нравится нет.
обычно пишу так как Думкин © по настроению, почти.

for i := 0 to 9 do begin
...
for j := 0 to 9 do begin
...
end;
...
end;

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


 
Всеволод Соловьёв ©   (2003-06-27 09:02) [4]

а если влом расставлять (мне не влом, я автоматом) есть прога DelForEx, она сама все расставит. встраивается в IDE


 
Думкин ©   (2003-06-27 09:04) [5]

> sniknik © (27.06.03 09:00)
Когда писал - отступов не было - это само прибилось. Отступы всегда дела. %-)


 
passm ©   (2003-06-27 09:16) [6]

procedure CodeExample(const StepCount: Integer);
var
i, j: Integer;
begin
for i:= 0 to StepCount - 1 do
begin
for j:= 0 to StepCount - 1 do
begin
...
end;
...
end;
...
i:= 1;
func(i, j, StepCount);
if j < j then
begin
DoSome(StepCount);
DoAny(StepCount)
end
else
DoSomeEx(StepCount)
end;


 
Dmitriy O. ©   (2003-06-27 09:28) [7]

>passm © (27.06.03 09:16)В своем коде Вы написали
....
func(i, j, StepCount);
if j < j then
....
Это опечатка или нет как такой if может работать ведь всегда j=j.
А begin и end я тоже всегда стараюсь ставить.Хотя расставлять код в лом спасибо Всеволод Соловьёв © (27.06.03 09:02) .




 
ZeroDivide ©   (2003-06-27 09:28) [8]

>Какой должен быть код, чтобы вам было легче его понять ?

Существуют правила оформления исходного кода. см. исходники VCL.


 
k-man ©   (2003-06-27 09:40) [9]

Я обычно делаю отступ вложенности 3 пробела. И соблюдаю везде.
Оператор присваивания обязательно так
i := 5;
А условия например так-
if ( ( i < 4 ) and ( b > 5 ) ) then


 
passm ©   (2003-06-27 10:09) [10]

Dmitriy O. © (27.06.03 09:28)> Опечатка.
Begin & end ставлю только при необходимости. Еще не ставлю ; перед end.


 
Poirot ©   (2003-06-27 10:21) [11]

Господа!
На скрлько я помню - у Borland есть свои рекомендации по написанию кода и некоторые русифицированные выдержки есть на сайте http://www.xprogramming.ru
А сами рекомендации есть помоему на сайте борланда, но там где-то далеко...
Эксперт по ним и работает!!!


 
Sha ©   (2003-06-27 11:51) [12]

Экономия строк, отступы и запятые - все с ЕС ЭВМ осталось :)

for i := 0 to 9 do for j := 0 to 9 do begin;
...
end;


 
Malder ©   (2003-06-27 12:01) [13]

По моему, по рускому Госту какому-то, правильно так:

for i := 0 to 9 do
begin
for j := 0 to 9 do
begin
i:=5;
end;
j:=5;
end;

Я так и пишу...


 
Sha ©   (2003-06-27 12:26) [14]

Я для себя эту проблему решил так (с) чей-то:
1) По ГОСТам легко писать, если мозги ГОСТированные.
2) Проще один раз конвертировать, чем постоянно мучиться.
3) Всего несколько простых правил:
- точка с запятой после каждого оператора,
- после begin сдвигаемся враво, после end - влево,
- все пишем в одну строку до точки с запятой или до границы строки,
- при разбиении строки - сдвиг вправо,
- then и else пишутся точно по соответствующим if, если вся конструкция не умещается на одной строке.


 
Malder ©   (2003-06-27 12:31) [15]

По ГОСТам легко писать, если мозги ГОСТированные

Наезд что ли ?

3) Всего несколько простых правил:
- точка с запятой после каждого оператора


Гхм. А почему ты не упомянул про точку после конечного END"а ?

все пишем в одну строку до точки с запятой или до границы строки

then и else пишутся точно по соответствующим if, если вся конструкция не умещается на одной строке


А где вы нашли собственно границу строки ?


 
Юрий Федоров ©   (2003-06-27 12:46) [16]

http://delphi.vitpc.com/article/coderules.htm


 
Sha ©   (2003-06-27 12:55) [17]

>Malder © (27.06.03 12:31)
>Наезд что ли?
Просто к слову пришлось :) ибо ГОСТ есть крайнее выражение рекомендаций.


 
Sha ©   (2003-06-27 13:14) [18]

Автор ветки спрашивал: Какой должен быть код, чтобы вам было легче его понять?
Свой код я понимаю в любом (самом расслабленном) состоянии.
Не возникает никаких проблем с поиском begin-end (всегда ясно, а была ли тут ладья), вложенные if-then-else прекрасно видны (пропустить else просто невозможно). Есть и еще несколько дополнительных правил, на мой взгляд, улучшающих читабельность.
Приведенный стиль довольно давно используется (ноги растут от ЕС-7066, 10 строк х 80 символов) и неплохо себя зарекомендовал.

Malder © (27.06.03 12:31)
- граница строки = граница окна конечно (а что это такое?)
- точка после конечного END обязательна
- привел основные правила


 
stalker780 ©   (2003-06-27 14:30) [19]

А еще лучше пиши на русском языке, IMHO так всем будет понятнее, особенно у кого проблэмс с аглицким :)


 
stalker780 ©   (2003-06-27 14:32) [20]

А еще лучше пиши на русском языке(накрайняк транслитерацией :)), IMHO так всем будет понятнее, особенно у кого проблэмс с аглицким :)

типа:
pri i := 0 do 9 sdelat
nachat
pri j := 0 do 9 sdelat
nachat
...
konec; /*самая веселая часть :)*/
konec;


 
Malder ©   (2003-06-27 18:25) [21]

Так

Malder © (27.06.03 12:31)
- граница строки = граница окна конечно (а что это такое?)


Допустим, у тебя 1024x768. Ты все оформил как надо. И вот отдаешь исходник другу, а у него 800x600. И все твои правила летят к чертовой матери ? Не надо на это рассчитывать...


- точка после конечного END обязательна

ага, значит
точка с запятой после каждого оператора
необязательна ?


 
Fenik ©   (2003-06-27 20:27) [22]

> Кен © (27.06.03 06:19)

> Как писать if ?
> if ( ( a < b ) and ( c < d ) ) then
> или
> if ( ( a < b )
> and ( c < d ) )
> then
> ваш вариант.


Вот так:
if (a < b) and (c < d) then ...


 
Sha ©   (2003-06-27 21:03) [23]

>Malder © (27.06.03 18:25)
Не цепляйся

>Допустим, у тебя 1024x768. Ты все оформил как надо. И вот
>отдаешь исходник другу, а у него 800x600. И все твои правила >летят к чертовой матери ? Не надо на это рассчитывать...
Не рассчитываю. Обычно предельная длина строки = 80, иногда 100. То, что отдаю кому-нибудь не из команды, всегда привожу в божеский вид. Мои исходники есть на UBPFD - посмотри.

>ага, значит точка с запятой после каждого оператора необязательна?
Извини, если задел :)



 
NightAngel   (2003-06-27 21:12) [24]

Есть отличная книга о том, каким должен быть код и процесс его проектирования: "Ален И. Голуб - C & C++. Правила программирования".


 
nikkie ©   (2003-06-27 22:25) [25]

>значит точка с запятой после каждого оператора необязательна?
необязательна



 
Mihey ©   (2003-06-27 22:36) [26]

Могет так?


for i := 0 to 9 do // -------------------+
begin // |
for j := 0 to 9 do // -----------+ |
begin // | |
... // | |
end; // -----------+ |
end; // -------------------+


 
Neox ©   (2003-06-27 23:39) [27]

немного оффтоп, но может кто видел правила оформления РНР кода или "расчески" для него?


 
Asteroid ©   (2003-06-28 02:35) [28]

У меня такое форматирование:

interface

const MSG_MESSAGE = 1;
MSG_NOMESSAGE = 2;
MSG_ERROR = 3;

ERROR_TYPE1 = 100;
ERROR_TYPE2 = 101;
...

type
PFloat = ^Float;
Float = Single;

type
TSomeRecord = record
posx, posy: Float;
velx, vely: Float;
accx, accy: Float;
end;

type
TSomeClass = class( TBaseClass )
private
FParm1: Integer;
FParm2: Float;
FParm3: TSomeRecord;
FNumbers: array [ 0..99 ] of Integer;
...
public
constructor Craete();
destructor Destroy(); override;

procedure Init( parm1: Integer; var parm2: string );
procedure Deinit();

function CheckCollision(): Boolean;

function IsAlive(): Boolean;
end;
// Поясняю: пустые строчки группируют функции по смыслу

procedure InitAll( parm1: Integer; var parm2: string );

var Obj: TSomeClass;

implementation

procedure TSomeClass.Init( parm1: Integer; var parm2: string );
var i, j: Integer;
res: string;

function InnerFunction( s: string; var offset: Integer ): string;
begin
Result := Copy( s, offset, offset + 2 );
Inc( offset, 2 );
end;

begin
DoSomething();
res := InnerFunction( parm2, parm1 );
FParm1 := GetTickCount();
// скобки, чтобы проще было понять, что это ф-ция, а не переменная + привычка
...
if ( a + b > 5 ) or ( a - b < 2 ) and
( ( not SomeLongNamedBooleanVariable ) or
( SomeVeryLongBooleanExpression ) ) then
begin
DoSomething(); // бывает, что и для одной строчки begin+end
end
else if ( FParm2 < 3.0 )
begin
// .0 для вещественных ставлю,
// скобки по привычке + удобнее добавлять новые условия
try
DoSomethingElse();
finally
Finalize();
end;

end; // } // а это для комментирования куска кода

// и наконец
for i := 0 to Length( FNumbers ) - 1 do
FNumbers[ i ] := i;

end;

Думаю, общий смысл понятен.
- отступ два пробела на уровень и по смыслу / выравниванию
- begin и end с отступами и на своих строчках
- имена переменных английские, комментарии в основном тоже
- стараюсь не вылезать за ширину окна ( кстати, у меня видна линия на 80 символах )
- пробелы после открывающих и перед закрывающими скобками, между операндами и после запятой ( т.е. почти везде :) ).
- массивы нумеруются с нуля, кроме особых случаев
- скобки при вызове функций и процедур без параметров
- константы заглавными буквами, знаки равенства на одной колонке
- переменные при объявлении группируются по типу и по смыслу
- функции группируются по смысслу, стараюсь сохранить порядок объявления
- в последнее время ненависть к длинным файлам, поэтому глобальные функции разных назначений в разных юнитах.


 
Кен ©   (2003-06-28 03:39) [29]

> Zacho © (27.06.03 06:38)
> > Кен © (27.06.03 06:19)
> > Как вообще лучше писать программный код, чтобы он был
> понятен
> > другим программистам ?
> >
> > Вот так :

Я тоже писал в первом своём посте с отступами, но почему то в форуме отобразилось без них.

> И не так, и не так. А вот так:
> for i := 0 to 9 do
> begin

А вот выносят бегин на новую сточку те, кто не писал действительно больших кодов. Ибо листать замучаешься.
Бегин надо всегда писать в конце того к чему он относится и увеличивать отступ. А когда энд, то отступ уменьшать. Глазу проще по отступу ориентироваться, чем по бегину.



> passm © (27.06.03 09:16)
> end
> else

А вот разносить на разные строчки end и else - вообще расточительство. Всегда пишу слитно end else begin


> ZeroDivide © (27.06.03 09:28)
> >Какой должен быть код, чтобы вам было легче его понять ?
> Существуют правила оформления исходного кода. см. исходники
> VCL.

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


> Sha © (27.06.03 11:51)
> Экономия строк, отступы и запятые - все с ЕС ЭВМ осталось
> :)
> for i := 0 to 9 do for j := 0 to 9 do begin;
> ...
> end;

Нет. Просто эта фраза for i := 0 to 9 do for j := 0 to 9 do begin; просто достала. Ночами сниться. Потому глупо на неё много места тратить. И так ведь всё понятно.
Почему нельзя сделать какую нибуь команду для перебора всех элементов массива ? Хотя это больше в тему о том каких языковых конструкций нам не хватает.


> Sha © (27.06.03 12:26)
> - точка с запятой после каждого оператора,
> - после begin сдвигаемся враво, после end - влево,
> - все пишем в одну строку до точки с запятой или до границы
> строки,
> - при разбиении строки - сдвиг вправо,
> - then и else пишутся точно по соответствующим if, если
> вся конструкция не умещается на одной строке.

Во многом согласен. Насколько после Begin сдвигаться лучше ?
Если множество коротких строк, то не лучше ли их в одну записать ?
i:=0; j:=0; d:=0; b:=0;
Или когда два for подряд идут ?
Про if если не помещается в одну строчку, то чаcто пишу

if ( i<j) then a:="asdf"
else b:="qwer";

То есть else точно под then.

> Asteroid © (28.06.03 02:35)
> if ( a + b > 5 ) or ( a - b < 2 ) and
> ( ( not SomeLongNamedBooleanVariable ) or
> ( SomeVeryLongBooleanExpression ) ) then

Мне больше нравится писать and и or не в концах а в началах последующих строк. Так их проще отключать знаком (//) поставленным перед ними.


 
Кен ©   (2003-06-28 03:53) [30]

Скажите, что делать, если программа достигла скажем 5000 строк ? Как её лучше расчленить, чтобы проще было просматривать, перемещаться по ней ?

Что лучше комментировать ? И как правильно комментировать код ?
Комментарием ведь надо передавать смысл, а не конкретные действия описывать русским языком. Что есть смысл ?


 
Asteroid ©   (2003-06-28 04:32) [31]

(черт, уползло в const все...однако я накатал...)
Кен © (28.06.03 03:39)
А вот выносят бегин на новую сточку те, кто не писал действительно больших кодов. Ибо листать замучаешься.
Да ну? Так ты пишешь один пробел (после then или else) - а с новой строкой либо ни одного, максимум - лишний enter.
Лично я если не нахожу begin на следующей строчке, то считаю, что там должна идти одна команда, а не несколько - соответственно при ошибке зачастую приходится возвращаться обратно к if.

Не существует никаких правил
Так же, как и ложки :) Все-таки есть общие рекомендации по оформлению. К тому же, где-то могут потребовать строгое соответствие правилам.

Потому глупо на неё много места тратить
Нет, не глупо. Опять-таки это дело привычки, но я читаю начала строчки - если она длиннее простого выражения, начинаю "подтормаживать", искать, откуда взялась эта j и пр. Насчет команды - а как ты будешь обращаться к элементам массива?

Про if если не помещается в одну строчку
Меня приучили писать if отдельно от else. Jxtym gомогает при отладке.

Если множество коротких строк, то не лучше ли их в одну записать ?
А почему бы и нет?

Или когда два for подряд идут ?
А вот это лучше не надо.

Мне больше нравится писать and и or не в концах а в началах последующих строк
Да, не спорю, но мне проще форматировать, когда они в конце. Просто ставлю два (или три) пробела - и все ок.

Кен © (28.06.03 03:53)
если программа достигла скажем 5000 строк
Я стараюсь не достигать и 1000. Ищи те функции, которые на можно отделить от общей части (например, загрузку и сохранение файлов, рисование, управление, инициализаия + завершение - уже на 4 юнита).

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


 
Malder ©   (2003-06-28 10:48) [32]

>значит точка с запятой после каждого оператора необязательна?
необязательна


Так. Nikkie, то есть, я могу ставить ";" после оператора, а могу не ставить ? Необязательно - имеет именно такой смысл - делай как хочешь. Верно ?

А вот выносят бегин на новую сточку те, кто не писал действительно больших кодов

Вот не надо, пожалуйста. Те, кто писали большие программы давно научились разбивать все по модулям. А не думают, как "расчленить" программу из 5000 строк.
Не говоря уже о способах перемещения по тексту. Советую почитать про них


 
blackweber ©   (2003-06-28 10:50) [33]

http://community.borland.com/soapbox/techvoyage/article/1,1795,10280,00.htm - The "Borland style", required for contributers to the JEDI project.
http://www.econos.de/delphi/cs.html - Econos (based on "Delphi Developers Guide")
http://www.ocdelphi.org/standard.htm - Orange County Delphi Users Group
http://delphi.about.com/cs/standards/ - Other standards...


 
Fenik ©   (2003-06-28 13:05) [34]

> Кен:

> Про if если не помещается в одну строчку, то чаcто пишу
> if ( i<j) then a:="asdf"
> else b:="qwer";
> То есть else точно под then.


Зачем лишние скобки???

if i < j then a := "asdf"
else b := "qwer";



 
Кен ©   (2003-06-29 03:33) [35]

> Asteroid © (28.06.03 04:32)
> Кен © (28.06.03 03:53)
> если программа достигла скажем 5000 строк
> Я стараюсь не достигать и 1000. Ищи те функции, которые
> на можно отделить от общей части (например, загрузку и сохранение
> файлов, рисование, управление, инициализаия + завершение
> - уже на 4 юнита).

А как их отделить то ? Если они все к текущей форме общаюатся и при ОнКлик на них всё переходит ?
Я с удовольствием бы сделал кучу Юнитов и разместил бы в них логические части. Но как это связать то всё воедино ? Переменная объявляется в Unit1 , а вызывается в Unit2 и т. д.


> Malder © (28.06.03 10:48)
>> А вот выносят бегин на новую сточку те, кто не писал действительно
>> больших кодов
>
> Вот не надо, пожалуйста. Те, кто писали большие программы
> давно научились разбивать все по модулям. А не думают, как
> "расчленить" программу из 5000 строк.

Так научите же этому форум ! На то он и создан.


> Fenik © (28.06.03 13:05)
> > Кен:
>
> > Про if если не помещается в одну строчку, то чаcто пишу
> > if ( i<j) then a:="asdf"
> > else b:="qwer";
> > То есть else точно под then.
>
> Зачем лишние скобки???
>
> if i < j then a := "asdf"
> else b := "qwer";

Только чтобы глазу было легче зацепиться. Скобки они узкие. На них всёравно много не сэкономишь.


 
Asteroid ©   (2003-06-29 03:51) [36]

> Кен © (29.06.03 03:33)
У юнита есть две части: interface и implementation. Если ты объявляешь переменную в interface, а затем включаешь юнит в другом юните, ты получаешь к ней доступ. Если объявляешь переменную в implementation, она становится глобальной только для функций этого юнита. Юниты можно включать как в interface, так и в implementation.

Лучше пиши код не в OnClick, а в отдельной процедуре. В onClick только ее вызов. Тогда спокойно можно будет все разнести. Какие-то переменные логичнее сделать глобальными - возможно даже завести отдельный класс или record с параметрами и глобальную переменную с типом этого класса или записи.

Кстати, если не знаешь - Ctrl+Scroll - прокрутка постранично.


 
Bayer_Linse ©   (2003-06-29 04:00) [37]

> Кен © (28.06.03 03:53)
> Скажите, что делать, если программа достигла скажем 5000 строк ? Как её лучше расчленить, чтобы проще было просматривать, перемещаться по ней ?

Не правильное проектирование.
Для каждого класса отдельный файл.
Класс не займет 5000 строк.
Если занимает- займись перепроектированием.


 
Anatoly Podgoretsky ©   (2003-06-29 08:17) [38]

Fenik © (28.06.03 13:05)
Что бы тяжелее было читать, так глаз и режет. Вместо зацепки насилии над головой.



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

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

Наверх




Память: 0.6 MB
Время: 0.013 c
3-44574
mikeee
2003-06-18 15:47
2003.07.14
Подскажите по InstallShield Express


3-44560
n1tro
2003-06-19 18:14
2003.07.14
Как отобразить запрос ч/з TDBGird


1-44748
INCOGNITO
2003-06-30 23:36
2003.07.14
Вопрос по TStringGrid


1-44678
BOA_KAA
2003-06-30 13:31
2003.07.14
TDriveComboBox


14-44801
Шустрый
2003-06-26 08:26
2003.07.14
От чего же зависит