Я никогда не работал на работодателя, и у меня в ходе написания моей программы сформировался собственный стиль кода. Вот два фрагмента Delphi-кода моей программы:
case lowercase(curstrings[0])[1] of'v': begin//Вектор
et:=vetOneArrow;
if curstrings.Count>7 then if lowercase(curstrings[7])='n'then et:=vetNoArrows;
if curstrings.Count>8 then begin
AddCustomVector(vector(strtofloat(curstrings[1]),strtofloat(curstrings[2]),strtofloat(curstrings[3])),vector(strtofloat(curstrings[4]),strtofloat(curstrings[5]),strtofloat(curstrings[6])),false,et,strtofloat(curstrings[8]),strtofloat(curstrings[9]),floatcolor(strtofloat(curstrings[10]),strtofloat(curstrings[11]),strtofloat(curstrings[12])),strtofloat(curstrings[13]));
end
else AddCustomVector(vector(strtofloat(curstrings[1]),strtofloat(curstrings[2]),strtofloat(curstrings[3])),vector(strtofloat(curstrings[4]),strtofloat(curstrings[5]),strtofloat(curstrings[6])),true,et,0,0,floatcolor(0,0,0),0);
end;//v'p': begin//Плоскость
pltransp:=true;
if curstrings.Count>13 then if lowercase(curstrings[13])='n'then pltransp:=false;
if curstrings.Count>14 then begin
AddCustomPlane(vector(strtofloat(curstrings[1]),strtofloat(curstrings[2]),strtofloat(curstrings[3])),vector(strtofloat(curstrings[4]),strtofloat(curstrings[5]),strtofloat(curstrings[6])),vector(strtofloat(curstrings[7]),strtofloat(curstrings[8]),strtofloat(curstrings[9])),vector(strtofloat(curstrings[10]),strtofloat(curstrings[11]),strtofloat(curstrings[12])),false,floatcolor(strtofloat(curstrings[14]),strtofloat(curstrings[15]),strtofloat(curstrings[16])),strtofloat(curstrings[17]),pltransp);
end
else AddPlane(vector(strtofloat(curstrings[1]),strtofloat(curstrings[2]),strtofloat(curstrings[3])),vector(strtofloat(curstrings[4]),strtofloat(curstrings[5]),strtofloat(curstrings[6])),vector(strtofloat(curstrings[7]),strtofloat(curstrings[8]),strtofloat(curstrings[9])),vector(strtofloat(curstrings[10]),strtofloat(curstrings[11]),strtofloat(curstrings[12])),0,false);
end;//pend;//casefor q:=0 to groups.Count-2 do begin
if not hasnums[q] then continue;
for w:=q+1 to groups.Count-1 do begin
if not hasnums[w] then continue;
if tpointgroup(groups[q]).Name<>tpointgroup(groups[w]).Name then continue;
if tpointgroup(groups[q]).GeneratorsCount<>tpointgroup(groups[w]).GeneratorsCount then continue;
curequal:=tpointgroup(groups[q]).MainOperationsEqual(tpointgroup(groups[w]));
if curequal then begin//У двух групп одинаковые номера соответствия. Значит, одну из этих групп, у которой больше расхождение, следует удалитьif displvals[q]>displvals[w] then begin hasnums[q]:=false; break; end
else begin hasnums[w]:=false; continue; end;
end;//ifend;//next wend;//next q
Здесь в браузере обрезаются строки, а так у меня в коде могут быть строки больше 500 символов.
Мои особенности стиля:
1) Нет стандартных пробелов в начале каждой строки.
2) Во многих местах стоят мелкие комментарии, например часто после end; — это может быть конец цикла, конец условного оператора и т.д., соответственно после end-а пишу //next x и т.п.
3) Довольно часто несколько операторов помещаются в одну строку, например какое-то действие и exit; или break;
Я одно время пытался перейти на стандартный стиль, но пришёл к выводу что мой собственный удобнее, по крайней мере для меня. Например, мне лень расставлять правильные пробелы в каждой строке; без этих пробелов возникает проблема, что иногда трудно различить, какому begin-у соответствует каждый end, и для решения этой проблемы после end-ов часто ставятся комментарии (next I, end if, end case и т.п.). Код, на мой взгляд, выглядит компактнее и удобнее для чтения, если во многих случаях в одну строку помещается много операторов (обычно вся такая строка выглядит как обособленный участок кода).
Пожалуйста не пинайте меня, профессиональные офисные программеры, лучше скажите – где-нибудь ещё может использоваться похожий стиль?
Убедительная просьба использовать специальные теги для оформления кода
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Пожалуйста не пинайте меня, профессиональные офисные программеры, лучше скажите – где-нибудь ещё может использоваться похожий стиль?
Мое мнение, лучше длинные строки разбивать.
Неудобно бегать туда-сюда.
Обычно открываю два файла параллельно, тогда совсем трудно становится такой код читать.
Здравствуйте, Khimik, Вы писали:
K>Пожалуйста не пинайте меня, профессиональные офисные программеры, лучше скажите – где-нибудь ещё может использоваться похожий стиль?
Используется конечно. Обфускаторы примерно по тому же принципу работают
Если серьёзно, то коммерческий код должен покрывать ровно две цели:
1. Решать проблему заказчика.
2. После того, как выяснится, что код решает не ту проблему и не так, код правится без обращения к автору кода любым из разработчиков в команде. Даже если он видит этот код в первый раз.
Что-то я не уверен, что со вторым пунктом у вас всё ок.
Здравствуйте, VladFein, Вы писали:
VF>Надеюсь что нет.
Зря надеешься. Код после обработки обфускаторами конечно читается получше чем этот, но все таки стиль очень похож. Топикстартеру просто браво, я думал я все в этой жизни видел, меня ничем не удивить, по в плане метрик WTF в коде этот шедевр переплюнуть просто нереально. Первое место просто — такой стиль перебил класс с двумя методами на 10000 строк со сплошными копипастами и мешаниной табов из пробелов и сбившимися отсупами, а это нужно умудриться. И это еще тривиальный код, я полагаю автор на средней задаче в состоянии развернуться гораздо круче, чем здесь показал.
S>Если серьёзно, то коммерческий код должен покрывать ровно две цели: S>1. Решать проблему заказчика. S>2. После того, как выяснится, что код решает не ту проблему и не так, код правится без обращения к автору кода любым из разработчиков в команде. Даже если он видит этот код в первый раз.
S>Что-то я не уверен, что со вторым пунктом у вас всё ок.
А если код нужен только одному человеку (шароварщику)?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
S>>Если серьёзно, то коммерческий код должен покрывать ровно две цели: S>>1. Решать проблему заказчика. S>>2. После того, как выяснится, что код решает не ту проблему и не так, код правится без обращения к автору кода любым из разработчиков в команде. Даже если он видит этот код в первый раз.
S>>Что-то я не уверен, что со вторым пунктом у вас всё ок.
K>А если код нужен только одному человеку (шароварщику)?
Тогда никаких проблем нет.
Пока ты пишешь только для себя — можно писать как угодно, лишь бы тебе самому было удобно.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Khimik, Вы писали:
K>Мои особенности стиля: K>1) Нет стандартных пробелов в начале каждой строки. K>2) Во многих местах стоят мелкие комментарии, например часто после end; — это может быть конец цикла, конец условного оператора и т.д., соответственно после end-а пишу //next x и т.п. K>3) Довольно часто несколько операторов помещаются в одну строку, например какое-то действие и exit; или break;
Здесь конечно сложно что то усовершенствовать, но я попробую. Советую имена переменных называть из смеси катайских, финских, иврита слов. Можно еще какие нидь языки всяких исчезнувших цивилизаций подключить. Не намного конечно, но будет еще круче. А, дельфя вроде юникод не поддерживает? Эххх, плохо. Ну, тогда эту смесь языков можно транслитом попробовать писать.
Такой стиль вряд ли где-то используется в "групповом" программировании.
Раньше был принят стандарт в ширину 80 символов практически во всех языках. Сейчас чуть побольше, но с другой стороны сейчас на всех языках код выглядит примерно одинаково в плане форматирования (отступы, пробелы между операторами и тд). И сейчас максимальная ширина кода всё равно ограничивается (самый популярный стиль, наверное, 120 символов).
Поэтому все профессиональные разработчики сейчас пишут примерно одинаково, в том числе и чтобы понимать друг друга. Необычные стили вроде приведённого могут встречаться либо у одиночек, либо в каких-то очень изолированных непрофессиональных коллективах.
case lowercase(curstrings[0])[1] of'v': begin//Вектор
et:=vetOneArrow;
if curstrings.Count>7 then if lowercase(curstrings[7])='n'then et:=vetNoArrows;
if curstrings.Count>8 then begin
AddCustomVector(vector(strtofloat(curstrings[1]),strtofloat(curstrings[2]),strtofloat(curstrings[3])),vector(strtofloat(curstrings[4]),strtofloat(curstrings[5]),strtofloat(curstrings[6])),false,et,strtofloat(curstrings[8]),strtofloat(curstrings[9]),floatcolor(strtofloat(curstrings[10]),strtofloat(curstrings[11]),strtofloat(curstrings[12])),strtofloat(curstrings[13]));
end
else AddCustomVector(vector(strtofloat(curstrings[1]),strtofloat(curstrings[2]),strtofloat(curstrings[3])),vector(strtofloat(curstrings[4]),strtofloat(curstrings[5]),strtofloat(curstrings[6])),true,et,0,0,floatcolor(0,0,0),0);
end;//v'p': begin//Плоскость
pltransp:=true;
if curstrings.Count>13 then if lowercase(curstrings[13])='n'then pltransp:=false;
if curstrings.Count>14 then begin
AddCustomPlane(vector(strtofloat(curstrings[1]),strtofloat(curstrings[2]),strtofloat(curstrings[3])),vector(strtofloat(curstrings[4]),strtofloat(curstrings[5]),strtofloat(curstrings[6])),vector(strtofloat(curstrings[7]),strtofloat(curstrings[8]),strtofloat(curstrings[9])),vector(strtofloat(curstrings[10]),strtofloat(curstrings[11]),strtofloat(curstrings[12])),false,floatcolor(strtofloat(curstrings[14]),strtofloat(curstrings[15]),strtofloat(curstrings[16])),strtofloat(curstrings[17]),pltransp);
end
else AddPlane(vector(strtofloat(curstrings[1]),strtofloat(curstrings[2]),strtofloat(curstrings[3])),vector(strtofloat(curstrings[4]),strtofloat(curstrings[5]),strtofloat(curstrings[6])),vector(strtofloat(curstrings[7]),strtofloat(curstrings[8]),strtofloat(curstrings[9])),vector(strtofloat(curstrings[10]),strtofloat(curstrings[11]),strtofloat(curstrings[12])),0,false);
end;//pend;//case
for q:=0 to groups.Count-2 do begin
if not hasnums[q] then continue;
for w:=q+1 to groups.Count-1 do begin
if not hasnums[w] then continue;
if tpointgroup(groups[q]).Name<>tpointgroup(groups[w]).Name then continue;
if tpointgroup(groups[q]).GeneratorsCount<>tpointgroup(groups[w]).GeneratorsCount then continue;
curequal:=tpointgroup(groups[q]).MainOperationsEqual(tpointgroup(groups[w]));
if curequal then begin//У двух групп одинаковые номера соответствия. Значит, одну из этих групп, у которой больше расхождение, следует удалитьif displvals[q]>displvals[w] then begin hasnums[q]:=false; break; end
else begin hasnums[w]:=false; continue; end;
end;//ifend;//next wend;//next q
Здравствуйте, andy1618, Вы писали:
A>Для начала: на RSDN есть средства подсветки кода...
Про длину строк: в крайнем проекте, который мы делали (Python, C++), пришли к ограничению в 120 символов из
соображений, что при мерджинге изменений в VCS строка должна два раза целиком умещаться на экран,
иначе просмотр диффа резко становится утомительным.
Про несколько операторов в одной строке: это плохо, т.к. невозможно ставить брейкпойнты (окно дизассемблера не в счёт).
Про комментарии в закрывающих end: вполне полезны, независимо от наличия/отсутствия отступов.
Ну и, в завершение, банальщина от М.Фаулера:
"Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку."
Здравствуйте, Khimik, Вы писали:
K>3) Довольно часто несколько операторов помещаются в одну строку, например какое-то действие и exit; или break; K>Я одно время пытался перейти на стандартный стиль, но пришёл к выводу что мой собственный удобнее, по крайней мере для меня. Например, мне лень расставлять правильные пробелы в каждой строке; без этих пробелов возникает проблема, что иногда трудно различить, какому begin-у соответствует каждый end, и для решения этой проблемы после end-ов часто ставятся комментарии (next I, end if, end case и т.п.). Код, на мой взгляд, выглядит компактнее и удобнее для чтения, если во многих случаях в одну строку помещается много операторов (обычно вся такая строка выглядит как обособленный участок кода).
когда напишите проект из хотя бы тысячи строк такого кода, вернитесь к нему через пару-тройку лет и попробуйте изменить и потом отладить. А еще лучше найдите единомышленника с проектом на тысячу строк и попробуйте внести в его код изменения и их отладить. Причем в отсутствии единомышленника(считайте что он уволился несколько лет назад)
Мне всегда хочется убить подобных "экономистов", потому что ни брекпоинт не поставить, ни посмотреть как переменные меняются — каждая строчка как "черный ящик". Туда же идут любители процедур на несколько экранов. И любители if и циклов десятерной вложенности (отсутствие подобного г. заодно решит проблему с next I, end if, end case в комментариях)
ЗЫ. И почитайте что-нибудь современнее книжек прошлого века, когда обособляли макросами и цветными разделителями в стопке перфокарт. Обособленный участок кода — это отдельный метод, носящий понятное имя и принадлежащий правильному объекту.
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, LaptevVV, Вы писали:
LVV>>Пока ты пишешь только для себя — можно писать как угодно, лишь бы тебе самому было удобно.
VF>Есть мнение, что "ты сам" через пару лет — уже другой
Шароварщик — это вряд ли.
ТС пишет же, что он НИКОГДА не работал программистом в конторе...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, elmal, Вы писали:
E>Зря надеешься. Код после обработки обфускаторами конечно читается получше чем этот, но все таки стиль очень похож. Топикстартеру просто браво, я думал я все в этой жизни видел, меня ничем не удивить, по в плане метрик WTF в коде этот шедевр переплюнуть просто нереально.
а вот хрен — func1(func2(func3(x), func4(x)*func5(y)), func6(z)?func7(x):func8(func2(x, y), z).... дальше мне лень писать, причем все это с осмысленными именами типа CalcSumIfFirstParmInRangeAndCoefIsGreaterThenSecondParam, в одну строчку при автоматическом переносе порождающее с десяток строк.
Или набор классов с конструкторами с несколькими десятками(!!!!!) параметров причем десяток последних — умолчальные
Здравствуйте, Khimik, Вы писали:
S>>Что-то я не уверен, что со вторым пунктом у вас всё ок. K>А если код нужен только одному человеку (шароварщику)?
Поверь, через пару лет ты не захочешь лезть разбираться где ошибка в коде
Вот захочешь тут ковыряться, хотя и выглядит набмого читабельнее, но никакого желания и удовольствия искать ошибку не вызывает.
procedure TSeed2.Steim2;
var
flag:boolean;
i,j,X,Y,count,p:integer;
ii:integer;
begin
ClrD0;
if NN>$19C9 then begin SeedInfo:='File garbled';exit;end;//Number of samples (6601max)
beg:=(DI(44)shl 8)+DI(45); //Beginning of data
j:=beg;//IN Byte count
p:=0; //OUT Byte countrepeat
i:=0;
while i<16 do
begin
NIBBLE[i]:= (DI(i div 4+j) and $C0) shr 6;
NIBBLE[i+1]:=(DI(i div 4+j) and $30) shr 4;
NIBBLE[i+2]:=(DI(i div 4+j) and $0C) shr 2;
NIBBLE[i+3]:=(DI(i div 4+j) and $03);
//form1.memo1.Lines.Add('Nibble['+inttostr(i)+']= '+inttostr(NIBBLE[i]));
//form1.memo1.Lines.Add('Nibble['+inttostr(i+1)+']= '+inttostr(NIBBLE[i+1]));
//form1.memo1.Lines.Add('Nibble['+inttostr(i+2)+']= '+inttostr(NIBBLE[i+2]));
//form1.memo1.Lines.Add('Nibble['+inttostr(i+3)+']= '+inttostr(NIBBLE[i+3]));
i:=i+4;//printf("%X ",j);getch();end;
if(NIBBLE[0]=0)and(NIBBLE[1]=0)and(NIBBLE[2]=0)then
begin
flag:=true;//cout<<"+\n";
DD[0]:=DI(j+4);DD[1]:=DI(j+5);DD[2]:=DI(j+6);DD[3]:=DI(j+7);
D0[p]:=(DD[0] shl 24)+(DD[1] shl 16)+(DD[2] shl 8)+DD[3];//first (real)
p:=p+1;
end else flag:=false;
for i:=0 to 15 do
begin
case NIBBLE[i] of
0: j:=j+4;
1:begin
DD[0]:=DI(j); if(DI(j) and $80)<>0 then DD[0]:=integer($FFFFFF00 or DI(j));
DD[1]:=DI(j+1);if(DI(j+1)and $80)<>0 then DD[1]:=integer($FFFFFF00 or DI(j+1));
DD[2]:=DI(j+2);if(DI(j+2)and $80)<>0 then DD[2]:=integer($FFFFFF00 or DI(j+2));
DD[3]:=DI(j+3);if(DI(j+3)and $80)<>0 then DD[3]:=integer($FFFFFF00 or DI(j+3));
D0[p]:=D0[p-1]+DD[0];
if not(flag and(i=3))then p:=p+1 //skip first diffelse if(p>1)and(p<=MAX_D0)then if ((D0[p-2]+DD[0])<>D0[p-1])
then begin//info(2,'Error630 '+inttostr(D0[p-2]+DD[0])+' '+inttostr(D0[p-1]));X:=X+1;end;
D0[p]:=D0[p-1]+DD[1];p:=p+1;
D0[p]:=D0[p-1]+DD[2];p:=p+1;
D0[p]:=D0[p-1]+DD[3];p:=p+1;
j:=j+4;
end;
2:begin
DD[0]:=DI(j);DD[1]:=DI(j+1);DD[2]:=DI(j+2);DD[3]:=DI(j+3);
DD[0]:=(DD[0] shl 24)or(DD[1] shl 16)or(DD[2] shl 8)or DD[3];
if((DI(j)and $C0)=$40)then
begin//dnib=01 (30)
DD[1]:=DD[0]and $3fffffff;
//if(DD[1] and $20000000)<>0 then DD[1] :=DD[1] or $C0000000;if(DD[1] and $20000000)<>0 then
DD[1] := DD[1] or $C0000000;
D0[p]:=D0[p-1]+DD[1];// printf("%x %X ",DI[j-27],NIBBLE[6]);if(not(flag and (i=3)))then p:=p+1 //skip first diffelse if p>1 then if((D0[p-2]+DD[1])<>D0[p-1])then
begin//info(2,'Error646 '+inttostr(D0[p-2]+DD[1])+' '+inttostr(D0[p-1]));
X:=X+1;
end;
j:=j+4;
end else
if((DI(j)and $C0)=$80)then//dnib=10 (2*15)begin
DD[1]:=(DD[0]shr 15)and $00007fff;if(DD[1]and $00004000)<>0 then DD[1]:=DD[1] or integer($ffff8000);
D0[p]:=D0[p-1]+DD[1];
if(not(flag and(i=3)))then p:= p+1 //skip first diffelse if p>1 then if((D0[p-2]+DD[1])<>D0[p-1]) then
begin//info(2,'Error657 '+inttostr(D0[p-2]+DD[1])+' '+inttostr(D0[p-1]));
X:=X+1;
end;
DD[1]:=DD[0]and $00007fff;if(DD[1]and $00004000)<>0 then DD[1]:=DD[1]or integer($ffff8000);
D0[p]:=D0[p-1]+DD[1];
p:=p+1;
j:=j+4;
end else
if((DI(j) and $C0)=$C0)then//dnib=11 (3*10)begin
DD[1]:=(DD[0]shr 20)and $000003ff;if(DD[1]and $00000200)<>0 then DD[1]:=DD[1] or integer($fffffC00);
D0[p]:=D0[p-1]+DD[1];
if(not(flag and(i=3)))then p:=p+1 //skip first diffelse if(p>1) then if((D0[p-2]+DD[1])<>D0[p-1]) then
begin//info(2,'Error671 '+inttostr(D0[p-2]+DD[1])+' '+inttostr(D0[p-1]));
X:=X+1;
end;
DD[1]:=(DD[0]shr 10)and $000003ff;if(DD[1]and $00000200)<>0 then DD[1]:=DD[1]or integer($fffffC00);
D0[p]:=D0[p-1]+DD[1];p:=p+1;
DD[1]:=DD[0]and $000003ff;if(DD[1]and $00000200)<>0 then DD[1]:=DD[1]or integer($fffffC00);
D0[p]:=D0[p-1]+DD[1];p:=p+1;
j:=j+4;
end;
end;
3:begin
DD[0]:=DI(j);DD[1]:=DI(j+1);DD[2]:=DI(j+2);DD[3]:=DI(j+3);
DD[0]:=(DD[0]shl 24)or(DD[1]shl 16)or(DD[2]shl 8)or DD[3];
//printf(" ^%lx^ ",DD[0]);if((DI(j)and $C0)=$00)then//dnib=00 (5*6)begin
DD[1]:=(DD[0]shr 24)and $0000003f;if(DD[1]and $00000020)<>0
then DD[1]:=DD[1]or integer($ffffffC0);
D0[p]:=D0[p-1]+DD[1];
if(not(flag and(i=3)))then p:=p+1 //skip first diffelse if p>1 then if((D0[p-2]+DD[1])<>D0[p-1])then
begin//info(2,'Error691 '+inttostr(D0[p-2]+DD[1])+' '+inttostr(D0[p-1]));
X:=X+1;
end;
DD[1]:=(DD[0]shr 18)and $0000003f;if(DD[1]and $00000020)<>0
then DD[1]:=DD[1]or integer($ffffffC0);
D0[p]:=D0[p-1]+DD[1];p:=p+1;
DD[1]:=(DD[0]shr 12)and $0000003f;if(DD[1]and $00000020)<>0
then DD[1]:=DD[1]or integer($ffffffC0);
D0[p]:=D0[p-1]+DD[1];p:=p+1;
DD[1]:=(DD[0]shr 6)and $0000003f;if(DD[1]and $00000020)<>0
then DD[1]:=DD[1]or integer($ffffffC0);
D0[p]:=D0[p-1]+DD[1];p:=p+1;
DD[1]:=(DD[0])and $0000003f;if(DD[1]and $00000020)<>0
then DD[1]:=DD[1]or integer($ffffffC0);
D0[p]:=D0[p-1]+DD[1];p:=p+1; //printf(" ^%lx^ ",DD[0]);
j:=j+4;
end else
if((DI(j)and $C0)=$40)then//dnib=01 (6*5)begin
DD[1]:=(DD[0]shr 25)and $0000001f;if(DD[1]and $00000010)<>0
then DD[1]:=DD[1]or integer($ffffffE0);
D0[p]:=D0[p-1]+DD[1];
if(not(flag and(i=3)))then p:=p+1 //skip first diffelse if(p>1)then if((D0[p-2]+DD[1])<>D0[p-1]) then
begin//info(2,'Error710 '+inttostr(D0[p-2]+DD[1])+' '+inttostr(D0[p-1]));
X:=X+1;
end;
DD[1]:=(DD[0]shr 20)and $0000001f;if(DD[1]and $00000010)<>0
then DD[1]:=DD[1]or integer($ffffffE0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0]shr 15)and $0000001f;if(DD[1]and $00000010)<>0
then DD[1]:=DD[1]or integer($ffffffE0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0]shr 10)and $0000001f;if(DD[1]and $00000010)<>0
then DD[1]:=DD[1]or integer($ffffffE0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0]shr 5)and $0000001f;if(DD[1]and $00000010)<>0
then DD[1]:=DD[1]or integer($ffffffE0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0] )and $0000001f;if(DD[1]and $00000010)<>0
then DD[1]:=DD[1]or integer($ffffffE0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
j:=j+4;
end else
if((DI(j)and $C0)=$80)then//dnib=10 (7*4) 0xC0 11***************begin
DD[1]:=(DD[0]shr 24)and $0000000f;if(DD[1]and $00000008)<>0
then DD[1]:=DD[1]or integer($fffffff0);
D0[p]:=D0[p-1]+DD[1];
if(not(flag and(i=3)))then p:=p+1 //skip first diffelse if(p>1)then if((D0[p-2]+DD[1])<>D0[p-1])then
begin//info(2,'Error731 '+inttostr(D0[p-2]+DD[1])+' '+inttostr(D0[p-1]));
X:=X+1;
end;
DD[1]:=(DD[0]shr 20)and $0000000f;if(DD[1]and $00000008)<>0
then DD[1]:=DD[1]or integer($fffffff0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0]shr 16)and $0000000f;if(DD[1]and $00000008)<>0
then DD[1]:=DD[1]or integer($fffffff0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0]shr 12)and $0000000f;if(DD[1]and $00000008)<>0
then DD[1]:=DD[1]or integer($fffffff0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0]shr 8)and $0000000f;if(DD[1]and $00000008)<>0 then
DD[1]:=DD[1]or integer($fffffff0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0]shr 4)and $0000000f;if(DD[1]and $00000008)<>0
then DD[1]:=DD[1]or integer($fffffff0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
DD[1]:=(DD[0] )and $0000000f;if(DD[1]and $00000008)<>0
then DD[1]:=DD[1]or integer($fffffff0);
D0[p]:=D0[p-1]+DD[1]; p:=p+1;
j:=j+4;
end;
end;
else begin//ERROR
j:=j-(j-beg) mod 64;
repeat
for ii:=0 to 63 do//;i<64;i++,j++){ //skip bloks to find sincbegin
if(ii mod 8)=0 then begin D0[p]:=0;p:=p+1;end; //write Zeros
j:=j+1;
end;
X:=X+1; //Add ERROR
//printf("^%x^\n",j);until ((DI(j)and $FC)<>0) and (j<4032); //nibble 0,1,2==0
//i:=16;
break;
end;
end;
end;
until not((j< SeedMax )and(p<NN));
DD[0]:=DI(beg+8);DD[1]:=DI(beg+9);DD[2]:=DI(beg+10);DD[3]:=DI(beg+11);
D0[p]:=(DD[0]shl 24)+(DD[1]shl 16)+(DD[2]shl 8)+DD[3];//last (real)if(D0[p]=D0[p-1])then{info('OK '+inttostr(D0[p])+' '+inttostr(NN))}else
begin//info(2,'Error771 '+inttostr(D0[p-1])+' <> '+inttostr(D0[p])+' ['+inttostr(X)+']');
X:=X+1;
end;
Errors:=X;
end;
Здравствуйте, jhfrek, Вы писали:
J>когда напишите проект из хотя бы тысячи строк такого кода, вернитесь к нему через пару-тройку лет и попробуйте изменить и потом отладить.
Нафига? Пишите сразу хорошо.
J>А еще лучше найдите единомышленника с проектом на тысячу строк и попробуйте внести в его код изменения и их отладить.
Он же в шароваре — там только конкуренты, единомышленников нет.
J>Мне всегда хочется убить подобных "экономистов", потому что ни брекпоинт не поставить, ни посмотреть как переменные меняются — каждая строчка как "черный ящик". Туда же идут любители процедур на несколько экранов. И любители if и циклов десятерной вложенности (отсутствие подобного г. заодно решит проблему с next I, end if, end case в комментариях)
проблемы такого рода, с вложенными циклами и ветвлениями, решаются разбиением на мелкие процедуры, после чего возникает проблема слишком большого количества мелких процедур. Как раз не так давно занимались тут склеиванием кучи модулей в один.
Здравствуйте, Sharowarsheg, Вы писали:
J>>когда напишите проект из хотя бы тысячи строк такого кода, вернитесь к нему через пару-тройку лет и попробуйте изменить и потом отладить. S>Нафига? Пишите сразу хорошо.
человек написал сюда пост в защиту своего стиля, он не будет хорошо писать пока не прочувствует что писать плохо — это плохо
J>>А еще лучше найдите единомышленника с проектом на тысячу строк и попробуйте внести в его код изменения и их отладить. S>Он же в шароваре — там только конкуренты, единомышленников нет.
зато есть компаньоны. Я на себя матерился даже из-за одного скрипта в сотню строк который я написал plain текстом без выделения констант и параметров, потому что скрипт должен был быть одноразовым. Через пару лет оказалось что нет. И, вместо 10 минут на корректировку, пришлось потратить несколько часов на вспоминание и внесение изменений.
S>проблемы такого рода, с вложенными циклами и ветвлениями, решаются разбиением на мелкие процедуры, после чего возникает проблема слишком большого количества мелких процедур. Как раз не так давно занимались тут склеиванием кучи модулей в один.
это только если они объединены в класс "TUtils" по принципу нам лень думать и рефакторить, а не разнесены по объектам которым они должны принадлежать. Ну или программист понял рефакторинг с выносом в метод буквально и каждую строчку обернул в метод, такое тоже видел
Здравствуйте, jhfrek, Вы писали:
J>>>когда напишите проект из хотя бы тысячи строк такого кода, вернитесь к нему через пару-тройку лет и попробуйте изменить и потом отладить. S>>Нафига? Пишите сразу хорошо.
J>человек написал сюда пост в защиту своего стиля, он не будет хорошо писать пока не прочувствует что писать плохо — это плохо
Ну у него не самый плохой стиль. Бывают, например, фабрики фабрик сервисов.
J>>>А еще лучше найдите единомышленника с проектом на тысячу строк и попробуйте внести в его код изменения и их отладить. S>>Он же в шароваре — там только конкуренты, единомышленников нет.
J>зато есть компаньоны.
Не всегда. Я б даже сказал, что компаньоны скорее исключение, чем правило.
J>Я на себя матерился даже из-за одного скрипта в сотню строк который я написал plain текстом без выделения констант и параметров, потому что скрипт должен был быть одноразовым. Через пару лет оказалось что нет. И, вместо 10 минут на корректировку, пришлось потратить несколько часов на вспоминание и внесение изменений.
Не дешевле ли было придерживаться исходного предположения, что скрипт-таки одноразовый, и переписать?
S>>проблемы такого рода, с вложенными циклами и ветвлениями, решаются разбиением на мелкие процедуры, после чего возникает проблема слишком большого количества мелких процедур. Как раз не так давно занимались тут склеиванием кучи модулей в один.
J>это только если они объединены в класс "TUtils" по принципу нам лень думать и рефакторить, а не разнесены по объектам которым они должны принадлежать.
Здравствуйте, Sharowarsheg, Вы писали:
S>Ну у него не самый плохой стиль. Бывают, например, фабрики фабрик сервисов.
для таких заскоков его стиль, конечно, лучше — можно быстро причесать редактором и отрефакторить. Рефакторить фабрику фабрик сервисов, да если еще без тестов — ну его в ж.
J>>Я на себя матерился даже из-за одного скрипта в сотню строк который я написал plain текстом без выделения констант и параметров, потому что скрипт должен был быть одноразовым. Через пару лет оказалось что нет. И, вместо 10 минут на корректировку, пришлось потратить несколько часов на вспоминание и внесение изменений. S>Не дешевле ли было придерживаться исходного предположения, что скрипт-таки одноразовый, и переписать?
дешевле было бы сразу написать нормально. А так что я на доделку пару часов потратил, что на написание заново потратил бы. С такими простыми случаями проблема скорее психологическая, когда думаешь что у тебя все есть, а оказывается что нефига.
А вот когда приходится копаться в сложном коде, на написание которого было потрачено пару месяцев, то приходится копаться, потому что написать заново — это опять же пара месяцев. Поэтому лучше сразу все сделать хорошо и модифицируемо.
Вообще, за свою программистскую практику, я понял что красота, оптимальность кода и прочее — это фигня, главное — поддерживаемость
S>>>проблемы такого рода, с вложенными циклами и ветвлениями, решаются разбиением на мелкие процедуры, после чего возникает проблема слишком большого количества мелких процедур. Как раз не так давно занимались тут склеиванием кучи модулей в один. J>>это только если они объединены в класс "TUtils" по принципу нам лень думать и рефакторить, а не разнесены по объектам которым они должны принадлежать. S>Ну или нет объектов вообще. Так тоже делают.
кто-то еще пишет в процедурном стиле? Вроде уже даже в школах процедурным языкам не учат
Здравствуйте, Khimik, Вы писали: K>Я никогда не работал на работодателя, и у меня в ходе написания моей программы сформировался собственный стиль кода. Вот два фрагмента Delphi-кода моей программы:
почему вы думаете что это ваш собственный стиль? так пишут все школьники после первого года обучения паскалю
Здравствуйте, vsb, Вы писали:
vsb>Такой стиль вряд ли где-то используется в "групповом" программировании.
vsb>Раньше был принят стандарт в ширину 80 символов практически во всех языках.
Я и сейчас стараюсь так писать. Иногда бывает удобно распечатать код и помедитировать над распечаткой, а больше 80(+-) на A4 не влазит.
Вызов функции с кучей параметров, например, удобно оформить с переносом каждого параметра на отдельную строку — и читать удобнее, и если что-то поменяется, diff покажет, какой параметр изменен. Ну и тп.
vsb>Поэтому все профессиональные разработчики сейчас пишут примерно одинаково, в том числе и чтобы понимать друг друга. Необычные стили вроде приведённого могут встречаться либо у одиночек, либо в каких-то очень изолированных непрофессиональных коллективах.
насколько я профессиональный разработчик, и в командах мало работал, но все равно у меня читабельность кода — один из важных критериев.
K>А если код нужен только одному человеку (шароварщику)?
Второй пункт все равно в силе. Только в качестве другого разработчика вы. Что на самом деле еще хуже, поскольку мучиться и страдать будете вы.
Здравствуйте, BrainSlug, Вы писали:
BS>Стало любопытно. А у вас монитор сколько дюймов? Поясню, — на мой монитор (телевизор точнее ) в 35'' не помещается этот код.
Что завидно, да? А у ТС такой монитор, похоже, был изначально
Здравствуйте, BrainSlug, Вы писали:
BS>Стало любопытно. А у вас монитор сколько дюймов? Поясню, — на мой монитор (телевизор точнее ) в 35'' не помещается этот код.
Глянул тут твою первую правку, ты там вспоминал про игру на gamedev'е, похожую по стилю кода — это же ЩИ!!!Симулятор жестокости
Такие вещи не забываются, имхо
Макароны, спакетти-код — эти термины уже отживают свое. ЩИ!!!-код — за этим названием будещее
M>Глянул тут твою первую правку, ты там вспоминал про игру на gamedev'е, похожую по стилю кода — это же ЩИ!!!Симулятор жестокости M>Такие вещи не забываются, имхо
да это оно щи-код (потом появится щи++)
Здравствуйте, jhfrek, Вы писали:
S>>Ну или нет объектов вообще. Так тоже делают.
J>кто-то еще пишет в процедурном стиле? Вроде уже даже в школах процедурным языкам не учат
Я пишу, особенно если задача меньше 10 тыс строк.
Когда меня в школе учили, объектных языков особо не было, а с тех пор, надо признаться, я не слишком заморачивался прогрессивными молодежными течениями.
Здравствуйте, Sharowarsheg, Вы писали:
J>>кто-то еще пишет в процедурном стиле? Вроде уже даже в школах процедурным языкам не учат S>Я пишу, особенно если задача меньше 10 тыс строк.
фортран или чистый С?
S>Когда меня в школе учили, объектных языков особо не было, а с тех пор, надо признаться, я не слишком заморачивался прогрессивными молодежными течениями.
тогда лучше и не заморачиватся, потому что переход от процедур к объектам по принципу "лишь бы было" действительно превращается в мегакласс TUtils с кучей методов Я такое видел, нафиг-нафиг.
Здравствуйте, Vaako, Вы писали:
V>Поверь, через пару лет ты не захочешь лезть разбираться где ошибка в коде
Он-то, конечно, не захочет, дак кто ж его спрашивать-то будет? Скажут — вот здесь бага, лог пришлют — и все. И будет копаться. В конторах такое копание обычно сопровождается восклицаниями типа "какой осел это писал".
Здравствуйте, Marty, Вы писали:
M>... ЩИ!!!Симулятор жестокости
M>Макароны, спакетти-код — эти термины уже отживают свое. ЩИ!!!-код — за этим названием будещее
Н-да. Я такого кода не видел даже у математиков и астрономов, писавших на Фортране-4. А они с целью экономии машинного времени практически все в главной программе держали. CALL в их программах встречалось нечасто.
Здравствуйте, elmal, Вы писали:
E>Здесь конечно сложно что то усовершенствовать, но я попробую. Советую имена переменных называть из смеси катайских, финских, иврита слов.
Достаточно на Runglish написать, эффект будет — никто за пределами России не поймет, а в пределах — все поймут, но такое скажут...
P>Н-да. Я такого кода не видел даже у математиков и астрономов, писавших на Фортране-4. А они с целью экономии машинного времени практически все в главной программе держали. CALL в их программах встречалось нечасто.
Автор этого кода, как он пояснял в форуме, выложил древний код, причём, когда он это писал, он программировать не умел совсем, а взял какую-то демку и стал её улучшать и развивать, делая всё по аналогии с кодом, который былв демке.
J>>>когда напишите проект из хотя бы тысячи строк такого кода, вернитесь к нему через пару-тройку лет и попробуйте изменить и потом отладить. S>>Нафига? Пишите сразу хорошо.
J>человек написал сюда пост в защиту своего стиля, он не будет хорошо писать пока не прочувствует что писать плохо — это плохо
У меня есть (шапочный) знакомый, который в подобном стиле пишет на Эрланге. Аргументы: «У меня художественное образование, стиль кода не имеют право обсуждать люди, не имеющие художественного образования».
Здравствуйте, Sinix, Вы писали:
S>2. После того, как выяснится, что код решает не ту проблему и не так, код правится без обращения к автору кода любым из разработчиков в команде. Даже если он видит этот код в первый раз.
с этого места поподробнее пжлста. как программер не знающий предметной области этого кода что-то будет править?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
S>>2. После того, как выяснится, что код решает не ту проблему и не так, код правится без обращения к автору кода любым из разработчиков в команде. Даже если он видит этот код в первый раз. V>с этого места поподробнее пжлста. как программер не знающий предметной области этого кода что-то будет править?
Кэп 1: в примере топикстартера знание предметной области никак не поможет
Кэп 2: эта проблема решается не кодом, а наличием ТЗ, соглашениями по стилю кода, историей в таск-трекере, правильным разделением задач в команде и ещё тонной других способов.
Здравствуйте, Sinix, Вы писали:
S>Кэп 2: эта проблема решается не кодом, а наличием ТЗ, соглашениями по стилю кода, историей в таск-трекере, правильным разделением задач в команде и ещё тонной других способов.
и каким же образом тз, знание стиля и истории трекера поможет знать предметную область? я что-то пропустил в этой жизни?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
S>>Кэп 2: эта проблема решается не кодом, а наличием ТЗ, соглашениями по стилю кода, историей в таск-трекере, правильным разделением задач в команде и ещё тонной других способов. V>и каким же образом тз, знание стиля и истории трекера поможет знать предметную область? я что-то пропустил в этой жизни?
Это вопрос чтоб докопаться или серьёзно? Вопрос странный какой-то. Такое впечатление, что ты увидел у меня в посте какой-то тайный смысл, который я не закладывал, и с ним споришь
Если код читаем и снабжён комментами/тестами, то проблема, которую должен решать код, восстанавливается и без автора.
Ссылка на ТЗ/лог таск-трекера позволяет уточнить детали (в том числе "предметную область кода") + найти человека, который поможет разобраться с непонятными моментами.
Ну и здравый смысл подсказывает, что внутри команды разработчики как минимум в курсе проблем, которые решают соседи.
Здравствуйте, Khimik, Вы писали:
K>Пожалуйста не пинайте меня, профессиональные офисные программеры, лучше скажите – где-нибудь ещё может использоваться похожий стиль?
Здравствуйте, Sinix, Вы писали:
S>>>Кэп 2: эта проблема решается не кодом, а наличием ТЗ, соглашениями по стилю кода, историей в таск-трекере, правильным разделением задач в команде и ещё тонной других способов. V>>и каким же образом тз, знание стиля и истории трекера поможет знать предметную область? я что-то пропустил в этой жизни? S>Это вопрос чтоб докопаться или серьёзно?
Я абсолютно серьёзно и безподколок. Видишь ли, я этот тезис про нового человека не знакомого с кодом вообще, читаемость сего кода и соответственно лёгкость его правки как следствие его "читаемости" слышу уже не в первый раз. Но на практике почему-то выходит, что этого не достаточно, а тезис всё повторяют и повторяют, как испорченную пластинку. Вот мне стало и интересна, сфигали?
S>Вопрос странный какой-то. Такое впечатление, что ты увидел у меня в посте какой-то тайный смысл, который я не закладывал, и с ним споришь
я вроде бы выделил твоё утверждение, но навсякий случай ещё раз:
После того, как выяснится, что код решает не ту проблему и не так, код правится без обращения к автору кода любым из разработчиков в команде. Даже если он видит этот код в первый раз.
S>Если код читаем и снабжён комментами/тестами, то проблема, которую должен решать код, восстанавливается и без автора.
Это не правда, потому-что читаемость кода не прибавляет знаний в предметной области. Читаемость кода это чисто личностное и только личностное восприятие написанного, с предметной областью не имеющего ничего общего. Наоборот, изначально надо иметь знания в предметной области (и в проекте тоже) чтобы правильно исправить код. А для этого нужно изучить достаточно значительную массу кода, включая код, который собираешься править, т.е. быть подготовленным к исправлению. Я не исключаю что есть простые случаи, которые выбиваются из сказанного, но только лишь потому, что это исключения подтверждающие правила — в исправляемом коде ты уже знаком с предметной областью.
S>Ссылка на ТЗ/лог таск-трекера позволяет уточнить детали (в том числе "предметную область кода") + найти человека, который поможет разобраться с непонятными моментами.
тогда мне не понятно это:
код правится без обращения к автору кода любым из разработчиков в команде
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Я абсолютно серьёзно и безподколок. Видишь ли, я этот тезис про нового человека не знакомого с кодом вообще, читаемость сего кода и соответственно лёгкость его правки как следствие его "читаемости" слышу уже не в первый раз. Но на практике почему-то выходит, что этого не достаточно, а тезис всё повторяют и повторяют, как испорченную пластинку. Вот мне стало и интересна, сфигали?
А блин, я выразился некорректно Сорри
Речь шла про человека в команде, который видит конкретно этот кусок кода в первый раз, а не весь код вообще
Ну и дальше пошли недоразумения. Если натянуть ситуацию на абсолютного новичка — конечно бред получается, ему ещё минимум две недели надо въезжать что и куда.
Здравствуйте, jhfrek, Вы писали:
J>Мне всегда хочется убить подобных "экономистов", потому что ни брекпоинт не поставить, ни посмотреть как переменные меняются — каждая строчка как "черный ящик"
А как же всякая околофункциональщина с лямбдой и comprehensions?
J>>Мне всегда хочется убить подобных "экономистов", потому что ни брекпоинт не поставить, ни посмотреть как переменные меняются — каждая строчка как "черный ящик"
A>А как же всякая околофункциональщина с лямбдой и comprehensions?
В лямбдах брейпойнты можно поставить, а list comprehensions обычно достаточно короткие, чтобы не вызывать проблем
Здравствуйте, Vain,
V> Наоборот, изначально надо иметь знания в предметной области (и в проекте тоже) чтобы правильно исправить код. А для этого нужно изучить достаточно значительную массу кода, включая код, который собираешься править, т.е. быть подготовленным к исправлению.
Нет, вот тут ты не прав. Знания в предметной области чаще всего вообще не связаны с кодом. И хоть обизучайся "достаточно значительную массу кода", но знаний именно в предметной области — не прибавится.
Здравствуйте, Khimik, Вы писали: K>Я никогда не работал на работодателя, и у меня в ходе написания моей программы сформировался собственный стиль кода. Вот два фрагмента Delphi-кода моей программы:
Если это троллинг то он удался
Если же нет, то правильно говорят, что не умеешь ничего делать — иди в программисты. Программирование не производство — кривые руки компьютером не вырвет, а как хотелось бы как хотелось.
Здравствуйте, elmal, Вы писали:
E>Здравствуйте, VladFein, Вы писали:
VF>>Надеюсь что нет. E>Зря надеешься. Код после обработки обфускаторами конечно читается получше чем этот, но все таки стиль очень похож. Топикстартеру просто браво, я думал я все в этой жизни видел, меня ничем не удивить, по в плане метрик WTF в коде этот шедевр переплюнуть просто нереально. Первое место просто — такой стиль перебил класс с двумя методами на 10000 строк со сплошными копипастами и мешаниной табов из пробелов и сбившимися отсупами, а это нужно умудриться. И это еще тривиальный код, я полагаю автор на средней задаче в состоянии развернуться гораздо круче, чем здесь показал.
Я, между прочии, уже 9 лет зарабатываю на своей программе, и мой опыт говорит что мой стиль лучше стандартного, по крайней мере для меня.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали: K>Я, между прочии, уже 9 лет зарабатываю на своей программе, и мой опыт говорит что мой стиль лучше стандартного, по крайней мере для меня.
и ты 9 лет остаешься на одном уровне?
Здравствуйте, __kot2, Вы писали:
__>Здравствуйте, Khimik, Вы писали: K>>Я, между прочии, уже 9 лет зарабатываю на своей программе, и мой опыт говорит что мой стиль лучше стандартного, по крайней мере для меня. __>и ты 9 лет остаешься на одном уровне?
Узкий специались, только он может прочитать что он написал.
Здравствуйте, Sinix, Вы писали:
S>2. После того, как выяснится, что код решает не ту проблему и не так, код правится без обращения к автору кода любым из разработчиков в команде. Даже если он видит этот код в первый раз. S>Что-то я не уверен, что со вторым пунктом у вас всё ок.
Эээээ. Вот давайте проведём мысленный эксперимент — я вам дам ссылку на ишью Розлина, а вы сначала проэстимейтите время, необходимое для фикса ишью, а потом попробуете это сделать? Ишью даже выберем уже закрытое, что бы сравнить ваши оценку/рельтат с тем, что потребовалось, скорее всего, автору кода. Мне кажется, серьёзных упрёков по стилю кодирования к тому проекту не будет.
Конечно, вы не один из команды, но дак ну и что? Во многих проектах _любой_ член команды может понятия не иметь что и как в соседних кусках. И выполнить требование того, что бы "любой" мог где угодно что поправить невозможно. Какую-то простейшую ошибку из разряда опечаток, off-by-one error и т.п. — конечно. Но что-то системное — сильно сомневаюсь. Где-то конечно такое возможно, но далеко не везде. Неоправданно много времени может уйти на изучение подсистемы, в которой необходимо внести правку.
В трёхзвенке, дапустим, тот, кто "клепает формочки" может сильно подпортить много чего, забравшись в веб-сервер или БД без должной квалификации и наоборот ("может", а не "обязательно сделает" :о)). Разве нет? У вас в команде почему таких проблем не возникает? И почему они не могут возникать в других командах?
Здравствуйте, Khimik, Вы писали:
K>Пожалуйста не пинайте меня, профессиональные офисные программеры, лучше скажите – где-нибудь ещё может использоваться похожий стиль?
Если вас заинтересовал стиль программирования – первым делом покурите Code Complete (http://www.cc2e.com/, http://www.combook.ru/product/10015183/ — кстати, редкий момент, когда книгу можно преобрести). Вовсе не обязательно перенимать как догму всё что там написано, но эта книга покажет методику, с которой нужно браться за обсуждение стиля кода.
Сравнив используемый вами стиль с предлагаемым автором и ознакомившись с аргументами автора вы сможете составить представление о том, что (и почему) о вашем коде может подумать другой программист в самом худшем случае :о) Потом приходите и можно будет обсудить более предметно.
Здравствуйте, xy012111, Вы писали:
X>В трёхзвенке, дапустим, тот, кто "клепает формочки" может сильно подпортить много чего, забравшись в веб-сервер или БД без должной квалификации и наоборот ("может", а не "обязательно сделает" :о)). Разве нет? У вас в команде почему таких проблем не возникает? И почему они не могут возникать в других командах?
Это болезнь кывт-а по-моему. В процессе обсуждения "в идеале должно быть как-то так" всегда превращается в "собеседник идиот и он считает, что должно быть так и никак иначе". Дисклаймеры не помогают, проверял
ув.Кодта. Он тот же вопрос расписал другими словами, я с его точкой зрения полностью согласен. (Ок, поскольку это рсдн, то примерно тот же вопрос и практически полностью.)
Здравствуйте, Khimik, Вы писали:
K>Я никогда не работал на работодателя, и у меня в ходе написания моей программы сформировался собственный стиль кода. Вот два фрагмента Delphi-кода моей программы:
Извините, а не Вы, случайно, автор вот этой замечательной игры? Там внизу первой страницы примеры кода http://www.gamedev.ru/projects/forum/?id=160897
Уж очень стиль оформления кода похож.
Здравствуйте, Sinix, Вы писали:
X>>В трёхзвенке, дапустим, тот, кто "клепает формочки" может сильно подпортить много чего, забравшись в веб-сервер или БД без должной квалификации и наоборот ("может", а не "обязательно сделает" :о)). Разве нет? У вас в команде почему таких проблем не возникает? И почему они не могут возникать в других командах? S>Это болезнь кывт-а по-моему. В процессе обсуждения "в идеале должно быть как-то так" всегда превращается в "собеседник идиот и он считает, что должно быть так и никак иначе". Дисклаймеры не помогают, проверял
S>Чтобы не флудить попусту: прочитайте вот это сообщение
ув.Кодта. Он тот же вопрос расписал другими словами, я с его точкой зрения полностью согласен. (Ок, поскольку это рсдн, то примерно тот же вопрос и практически полностью.)
Да ладно расстраиваться :о) просто употребляя слова "любой" и тому подобные нужно быть готовым, что их воспримут не так, как бы вам того хотелось бы. Это закономерно и даже ожидаемо должно быть. Тут многие долго и упорно мучили свой мозг различными науками, отсюда и склонность, согласен порою излишняя, к строгости формулировок.
Если в "код правится без обращения к автору кода любым из разработчиков в команде" под "любым" понимается "любой из разработчиков", работающих над этим же кодом плюс-минус, а "комнда" — это некая макрокоманда, что ли в узком смысле этого слова, то полностью с утверждением согласен
Здравствуйте, xy012111, Вы писали:
X>Если в "код правится без обращения к автору кода любым из разработчиков в команде" под "любым" понимается "любой из разработчиков", работающих над этим же кодом плюс-минус, а "комнда" — это некая макрокоманда, что ли в узком смысле этого слова, то полностью с утверждением согласен
А, ну ок тогда
Как-то так сложилось, что везде, где я работал, под командой понималась собственно команда из 5-7 человек (девелоперы,аналитик,qa), которая собственно работала над определённым куском проекта (ну, или над отдельным проектом, если он мелкий). Если хоцца чётких определений, то что-то в стиле хирургической бригады по Бруксу.
Разумеется, разделение на команды не предполагает никакой бюрократии, изоляции или общения только через начальство, речь только о разделении ответственности между командами.
Не, при желании можно собрать коллектив и побольше, но из практики — или всё фейлится, или люди сами собираются в небольшие команды. Других вариантов не встречал, если видели и оно работало на практике — делитесь, как вы так умудрились?
Здравствуйте, Sinix, Вы писали:
S>Как-то так сложилось, что везде, где я работал, под командой понималась собственно команда из 5-7 человек (девелоперы,аналитик,qa), которая собственно работала над определённым куском проекта (ну, или над отдельным проектом, если он мелкий). Если хоцца чётких определений, то что-то в стиле хирургической бригады по Бруксу.
Да, вот как-то и "команда" в широком понимании (например, командs MSVS, Windows или SAP, даже "команда разработчиков Майкрософт") и команда в более узком понимании (команда language services нарпимер) обозначаются одним словом. А законы Мёрфи пока никто отменить не осмелился…
S>Не, при желании можно собрать коллектив и побольше, но из практики — или всё фейлится, или люди сами собираются в небольшие команды. Других вариантов не встречал, если видели и оно работало на практике — делитесь, как вы так умудрились?
Было другое — в проекте несколько ведущих программистов, пишущих раличные слабосвязанные куски (с остальными кусками общаются посредством интерфейсов/протоколов), и между собой регулярных ревью не проводящих, разве что по очень важным поводам. Они не взаимозаменяемы. И, опционально, некоторое количество "студентов", коммиты которых проходят ревью от соответствующего "ментора" и других "студентов". Понятно, что "студенты" получаются заменяемыми другими студентами и ментором. И это отлично работает (дай Бог здоровья ведущим).
Вот про такие небольшие команды, где все равноценно плюс-минус заменяемы — видеть не приходилось.
Здравствуйте, Kudriako, Вы писали:
K>Здравствуйте, Khimik, Вы писали:
K>>Я никогда не работал на работодателя, и у меня в ходе написания моей программы сформировался собственный стиль кода. Вот два фрагмента Delphi-кода моей программы:
K>Извините, а не Вы, случайно, автор вот этой замечательной игры? Там внизу первой страницы примеры кода K>http://www.gamedev.ru/projects/forum/?id=160897 K>Уж очень стиль оформления кода похож.
Нет, у меня программа Chemcraft.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Я никогда не работал на работодателя, и у меня в ходе написания моей программы сформировался собственный стиль кода. Вот два фрагмента Delphi-кода моей программы: K>Здесь в браузере обрезаются строки, а так у меня в коде могут быть строки больше 500 символов.
Я не знаю, чем он вам удобен, но если записать с отступами, то сразу виден простор для оптимизации весь ужас этого кода, состоящий в том, что вызовы AddCustomVector производятся по совершенно магическим правилам завязанным на длину curstrings.
'v':
begin//Вектор
et:=vetOneArrow;
if curstrings.Count>7 then
if lowercase(curstrings[7])='n'then
et:=vetNoArrows;
if curstrings.Count>8 then
begin
AddCustomVector(
vector(
strtofloat(curstrings[1]),
strtofloat(curstrings[2]),
strtofloat(curstrings[3])
),
vector(
strtofloat(curstrings[4]),
strtofloat(curstrings[5]),
strtofloat(curstrings[6])
),
false,
et,
strtofloat(curstrings[8]),
strtofloat(curstrings[9]),
floatcolor(
strtofloat(curstrings[10]),
strtofloat(curstrings[11]),
strtofloat(curstrings[12])
),
strtofloat(curstrings[13])
);
end
else
AddCustomVector(
vector(
strtofloat(curstrings[1]),
strtofloat(curstrings[2]),
strtofloat(curstrings[3])
),
vector(
strtofloat(curstrings[4]),
strtofloat(curstrings[5]),
strtofloat(curstrings[6])
),
true,
et,
0,
0,
floatcolor(0,0,0),
0
);
end;//v'p':
begin//Плоскость
pltransp:=true;
if curstrings.Count>13 then
if lowercase(curstrings[13])='n'then
pltransp:=false;
if curstrings.Count>14 then
begin
AddCustomPlane(
vector(
strtofloat(curstrings[1]),
strtofloat(curstrings[2]),
strtofloat(curstrings[3])
),
vector(
strtofloat(curstrings[4]),
strtofloat(curstrings[5]),
strtofloat(curstrings[6])
),
vector(
strtofloat(curstrings[7]),
strtofloat(curstrings[8]),
strtofloat(curstrings[9])
),
vector(
strtofloat(curstrings[10]),
strtofloat(curstrings[11]),
strtofloat(curstrings[12])
),
false,
floatcolor(
strtofloat(curstrings[14]),
strtofloat(curstrings[15]),
strtofloat(curstrings[16])
),
strtofloat(curstrings[17]),
pltransp
);
end
else
AddPlane(
vector(
strtofloat(curstrings[1]),
strtofloat(curstrings[2]),
strtofloat(curstrings[3])
),
vector(
strtofloat(curstrings[4]),
strtofloat(curstrings[5]),
strtofloat(curstrings[6])
),
vector(
strtofloat(curstrings[7]),
strtofloat(curstrings[8]),
strtofloat(curstrings[9])
),
vector(
strtofloat(curstrings[10]),
strtofloat(curstrings[11]),
strtofloat(curstrings[12])
),
0,
false
);
end;//p