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

Вниз

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

 
Кен   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.009 c
14-44869
LinOS
2003-06-26 07:47
2003.07.14
Плодимся и размножаемся.


3-44581
McSimm2
2003-06-20 14:59
2003.07.14
Соединение двух таблиц по полю у которых могут быть значения null


14-44816
Ahmad K
2003-06-28 07:54
2003.07.14
Задачка для мастеров


1-44636
NeVa
2003-07-02 00:23
2003.07.14
Замена символов


4-44951
HollowMan
2003-05-12 15:23
2003.07.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский