Я никогда не работал на работодателя, и у меня в ходе написания моей программы сформировался собственный стиль кода. Вот два фрагмента 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>Ну или нет объектов вообще. Так тоже делают.
кто-то еще пишет в процедурном стиле? Вроде уже даже в школах процедурным языкам не учат