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

Вниз

Ода молодому поколению   Найти похожие ветки 

 
Kerk ©   (2011-09-07 11:19) [80]

Скорость понимания кода при чтении такой подход снижает в разы.
Попробуй разгляди разницу между cn, pn и nn, не вчитываясь в каждую букву.


 
Kerk ©   (2011-09-07 11:21) [81]

Да и попробуй догадайся сразу чего вы там зашифровали в этих аббревиатурах.


 
Компромисс   (2011-09-07 11:28) [82]


> В понятности ничего не добавляют... Чего плодить-то
>


1. Добавляют и еще как. Например, мне в коде Sha пришлось голову напрячь, чтобы понять суть алгоритма
2. Опечаток меньше. Трудно вместо next набрать current. Да и легче ошибку в чужом коде найти, если вдруг current := nil присваивается. А на p := nil никто не отреагирует
3. Ctrl+пробел позволяет выбрать переменную из списка, а не набирать ее имя вручную. Поэтому между q и next нет большой разницы. Проблемы будут (и с восприятием в том числе), есть иметь переменные nodeNext, nodeCurrent и nodePrevious, ну так я поэтому и написал именно nextNode, а не наоборот


 
Игорь Шевченко ©   (2011-09-07 11:33) [83]


> Да и легче ошибку в чужом коде найти, если вдруг current
> := nil присваивается. А на p := nil никто не отреагирует


Поддерживаю целиком и полностью


 
CRLF   (2011-09-07 11:35) [84]

Нам на первом курсе списки читали как раз с переменными p и q, по Вирту...  %-)


 
Игорь Шевченко ©   (2011-09-07 11:37) [85]

CRLF   (07.09.11 11:35) [84]

Преподаватели они те же чайники. Дальше учебных примеров и Hello, world их кругозор редко простирается, поэтому что такое сопровождение большого проекта, для них тайна, покрытая мраком.


 
Kerk ©   (2011-09-07 11:41) [86]

Во, люди понимают :)


 
TUser ©   (2011-09-07 11:48) [87]

Надо называть все переменные в стиле iCounterOfElements, так всякому сразу понятно, что это целое число. А дочитав до конца название, - даже понятно, зачем оно. Такой правильный стиль называется обфускацией.

function FindElementInListGivenAsParameter (ListWhichWeSentToFindFunction: TListOfHZFoo; ElementWhichWeLookForInListGivenAsFirstParameterOfThisFunction: THZFoo);
var iCounterOfElementsInListGivenAsParameter: integer;
begin
 for iCounterOfElementsInListGivenAsParameter := 0 to ListWhichWeSentToFindFunction.CountOfElementsInList - 1 do
   if ListWhichWeSentToFindFunction.ElementsOfList[i] = ElementWhichWeLookForInListGivenAsFirstParameterOfThisFunction then begin
     result := i;
     exit;
     end;
 result := -1;
end;


 
Kerk ©   (2011-09-07 11:50) [88]


> TUser ©   (07.09.11 11:48) [87]

Это называется доведением до абсурда - демагогический прием.


 
Sha ©   (2011-09-07 11:53) [89]

> Компромисс   (07.09.11 10:12) [73]

Кажется, ты не совсем понял суть алгоритма,
а предлагаемые имена только запутают читающего.

> q должно было быть next (или nextNode),

По смыслу алгоритма q - временная переменная, используемая для ротации значений, как здесь:
temp:=a; a:=b; b:=temp;
Зачем называть ее nextNode, если тут идет работа с двумя списками,
и Next"ов тут 2, вернее он тут 1, но одновременно он же Prev в другом списке,
ну, в общем, ты понял.

> p должно было быть current (или currentNode),

p - изменяющаяся голова старого списка, который уменьшается в процессе работы.
Она, конечно, current. Но, в первую очередь, - голова.

> вместо Result должна была быть еще одна переменная previos (previousNode),

Какой, нафиг, previos, если это голова нового списка


> а Result присваиваться только один раз (Result := Current).

Не взлетит. Где бы ты не написал такое, это будет ошибкой.
В начале работы у тебя Current - голова старого списка,
в конце - nil.

> Лично я убил бы за имена переменных.

Я бы тоже. А за ошибку - еще раз.


 
Kerk ©   (2011-09-07 11:55) [90]


> Sha ©   (07.09.11 11:53) [89]

Ну вот видишь, ты настолько плохо подобрал имена, что Компромисс с простейшим алгоритмом сходу не смог разобраться. Отличный пример.


 
TUser ©   (2011-09-07 12:00) [91]


> Это называется доведением до абсурда - демагогический прием.

Зато легко доходит.

Человек способен прочесть 5-15 строк примитивного кода, который является единым блоков (процедурой или методом) то есть воспринимается как единое целое. Замена там i: integer на абсурд затрудняет погнимание, а не облегчает его. Длинно должны называться те переменные, для которых разница между хотя бы парочкой мест их использования (включая объявление) больше этих 15 строк. Также как и те переменные, которые используются в разных единых блоках (процедурах или методах). То есть:

в коде длинной функции (а лучше, чтобы таких функций вовсе не было),

либо

поля классов, параметры процедур и методов, глобальные переменные

.


 
Kerk ©   (2011-09-07 12:02) [92]


> TUser ©   (07.09.11 12:00) [91]

Выше отличный пример. У Sha он получился даже лучше, чем я думал. Код написан в стиле "знаю алгоритм, поэтому понимаю код", а должно быть наоборот "вижу код, понимаю алгоритм".


 
Компромисс   (2011-09-07 12:08) [93]


> Кажется, ты не совсем понял суть алгоритма,
> а предлагаемые имена только запутают читающего.


Вполне возможно. Но не понял я именно из-за плохих имен, то есть по твоей вине :-)


 
Компромисс   (2011-09-07 12:12) [94]


> Выше отличный пример. У Sha он получился даже лучше, чем
> я думал. Код написан в стиле "знаю алгоритм, поэтому понимаю
> код", а должно быть наоборот "вижу код, понимаю алгоритм".
>


Было немало веток, где Sha в подобном стиле оптимизировал алгоритмы строчек так в 50 на производительность. Вот там я даже не пытался понять алгоритм, потому как написан он явно для компилятора, а не для людей.


 
Sha ©   (2011-09-07 12:15) [95]

это надо сильно принять, чтобы не увидеть обмен трех значений.


 
Kerk ©   (2011-09-07 12:17) [96]


> Sha ©   (07.09.11 12:15) [95]

Причем здесь сам обмен трех значений?

1) Для чего он нужен?
2) ЧТО он обменивает?


 
Sha ©   (2011-09-07 12:26) [97]

> 1) Для чего он нужен?

У функции говорящее название

> 2) ЧТО он обменивает?

Первая итерация покажет.

А если не помогло, см. [89] :-)


 
Kerk ©   (2011-09-07 12:29) [98]


> Sha ©   (07.09.11 12:26) [97]

Ну т.е., судя по ссылке на [89], ты вместо того, чтоб дать переменным понятные имена, предлагаешь написать пояснительный комментарий в 3 раза длиннее функции?


 
Компромисс   (2011-09-07 12:40) [99]

function Reverse(list: PNode): pNode;
var
 previous, next, current: pNode;
begin;
 current := list;
 previous:=nil;
 while current<>nil do begin;
     next:=current.Next;
     current.Next:=previous;
     previous:=current;
     current:=next;
   end;
  Result := previous;
 end;


Кстати, в моем варианте Result = nil, если параметр nil.


 
Компромисс   (2011-09-07 12:42) [100]

Кстати, еще убил бы и за то, , что в одной строке несколько операторов.


 
Inovet ©   (2011-09-07 12:49) [101]

> [100] Компромисс   (07.09.11 12:42)
> Кстати, еще убил бы и за то, , что в одной строке несколько операторов.

Так здесь обмен через temp т.е. одно логическое действие, почему бы и не в одной строке. Убивать за другое надо.


 
Компромисс   (2011-09-07 12:54) [102]

Inovet ©   (07.09.11 12:49) [101]
Так здесь обмен через temp т.е. одно логическое действие, почему бы и не в одной строке. Убивать за другое надо.

Посмотрите [99]. Я всего лишь переименовал переменные в цикле. Нет там никакого обмена через temp. Создавалась лишь видимость обмена из-за неправильных имен переменных.


 
Компромисс   (2011-09-07 12:56) [103]

Кстати, next (q) лишняя.

function Reverse(list: PNode): pNode;
var
 previous, next, current: pNode;
begin;
 current := list;
 previous:=nil;
 while current<>nil do begin;
     current.Next:=previous;
     previous:=current;
     current:=current.Next;
   end;
  Result := previous;
 end;


 
Компромисс   (2011-09-07 12:57) [104]

В [103] ошибся.


 
Sha ©   (2011-09-07 13:36) [105]

Все-таки, есть где ошибиться.
И это точно имена )


 
Павел Калугин ©   (2011-09-07 13:50) [106]


> pasha_golub ©   (05.09.11 10:57) [3]
> Кстати, озвучилось мнение, что Сапер для студента - это
> слишком сложно. Кто согласен?

Народ на втром-третьем куррсе на турбопаскале изваял "супертетрис" на двоих игроков и ниче. А тут сапер слишком сложно.. Ужос..


 
Romkin ©   (2011-09-07 13:58) [107]

Ну я же говорю, что это хороший пример. Простенькое задание - а сколько обсуждения сразу :)
И испытания, разумеется, на обращение пустого списка, списка из одного элемента, из нескольких. И чтобы утечек памяти не было.
Думаете многие студенты это напишут, хотя бы за час-другой? :D


 
Павел Калугин ©   (2011-09-07 14:03) [108]


Romkin ©   (07.09.11 13:58) [107]
> Думаете многие студенты это напишут, хотя бы за час-другой?

Из тех, с кем я учился, процентов 80..


 
Romkin ©   (2011-09-07 14:03) [109]

Второй пример: те же условия, только на объектах и с рекурсией.


 
Компромисс   (2011-09-07 14:19) [110]

И испытания, разумеется, на обращение пустого списка, списка из одного элемента, из нескольких.

Понемногу подводить к Test Driven Development? :)


 
Компромисс   (2011-09-07 14:20) [111]

Второй пример: те же условия, только на объектах и с рекурсией.

Тогда уже лучше с деревьями, а не списками. Чтобы смысл был в рекурсии...


 
Sha ©   (2011-09-07 15:05) [112]

Romkin ©   (07.09.11 14:03) [109]

Наверно, так

function TNode.Reverse: TNode;
  function Renew(New, Old: TNode): TNode;
  var
    Tail: TNode;
  begin;
    if Old<>nil then begin;
      Tail:=Old.GetNext;
      Old.SetNext(New);
      Result:=Renew(Old, Tail);
      end
    else Result:=New;
    end;
begin;
  Result:=nil;
  Renew(Result, Self);
  end;


 
Sha ©   (2011-09-07 15:08) [113]

Последний оператор заменить на

  Result:=Renew(Result, Self);


 
Sha ©   (2011-09-07 15:10) [114]

или лучще оба на :-)

Result:=Renew(nil, Self);

Так вроде приятнее смотрится


 
Romkin ©   (2011-09-07 15:17) [115]


> Из тех, с кем я учился, процентов 80..

А из тех, что приходят, процентов 80 - нет :(


 
Компромисс   (2011-09-07 15:18) [116]

Sha

Надо метод Renew переименовать. Только не знаю, как :-) Разбираться в коде лень, а что он делает, из названия непонятно.


 
Romkin ©   (2011-09-07 15:28) [117]


> Sha ©   (07.09.11 15:05) [112]

Приставить процедуру в объект - это не совсем ООП :)
При переходе к объектам важно отойти от процедурного подхода:
TList = class
 Key: Word;
 Tail: TList;
...

И у Tail как объекта есть те же самые методы, которые можно вызвать, он же тоже TList.


 
Sha ©   (2011-09-07 15:36) [118]

> Компромисс   (07.09.11 15:18) [116]
> Надо метод Renew переименовать

а если чувак совсем не знает буржуйского, мне весь код переписывать

> Romkin ©   (07.09.11 15:28) [117]

Можно совсем в ООП стиле написать
че-нить вроде MoveStackToStack(Source, Dest),
но в сочетании с требованием рекурсии ужасно смотреться будет.
И так уже - ух, а так - ваще будет )

Самый первый процедурный вариант гораздо понятнее.
ООП - не самоцель.


 
pasha_golub ©   (2011-09-07 15:43) [119]


> Компромисс   (07.09.11 12:40) [99]
>
> function Reverse(list: PNode): pNode;
> var
>  previous, next, current: pNode;
> begin;
>  current := list;
>  previous:=nil;
>  while current<>nil do begin;
>      next:=current.Next;
>      current.Next:=previous;
>      previous:=current;
>      current:=next;
>    end;
>   Result := previous;
>  end;


А чего у тебя в коде единобразия нетути? :) То отделяется оператор присваивания пробелами, то нет. Почему begin висит на строчке с условием, да еще и с пустым оператором после него?

Ай-айай, а еще боремся за звание дома высокой культуры и быта (с)


 
pasha_golub ©   (2011-09-07 15:44) [120]

Вообщем, по результам ветки готов взять Sha © к себе студентом. Не знаю, научу ли программировать, но сало с водкой употреблять возможно :)



Страницы: 1 2 3 4 5 6 7 8 вся ветка

Форум: "Прочее";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.69 MB
Время: 0.023 c
2-1317089272
я
2011-09-27 06:07
2012.01.01
Имитация нажатия клавиш


6-1249372147
Ливр
2009-08-04 11:49
2012.01.01
проблема: в Webbrowser е проблемы с вводом с клавиатуры


2-1316690831
Laguna
2011-09-22 15:27
2012.01.01
Позиционирование в Combobox по значению объекта


2-1316800223
HF-Trade
2011-09-23 21:50
2012.01.01
Как узнать, позицию горизонтальной полосы прокрутки TListView


15-1316092006
Железкин
2011-09-15 17:06
2012.01.01
не включается комп, может кто сталкивался?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский