Comments 22
Для наглядности не помешала бы пара литературных листингов
Смотрите «TeX The Program». Я когда первый раз это увидел, меня честное слово, аж на слезу пробило.
Тоже взглянул. Я правильно понял что объё коментов при таком подходе должен в разы превышать объём кода?
Читая Ваши цитаты Кнута тое «загорелся», но увидев скока там букаф, задумался, а не противоречит ли Дядька сам себе. Ведь хорошо оформленный код, с информативными именами переменных/функций/итп по большей части вообще не нуждается в комментариях вроде…
Читая Ваши цитаты Кнута тое «загорелся», но увидев скока там букаф, задумался, а не противоречит ли Дядька сам себе. Ведь хорошо оформленный код, с информативными именами переменных/функций/итп по большей части вообще не нуждается в комментариях вроде…
Ведь хорошо оформленный код, с информативными именами переменных/функций/итп по большей части вообще не нуждается в комментариях вроде…
Вы, видимо, не писали наукоёмких/вычислительных программ, где за одной страницей алгоритма может стоять одна-две статьи и страниц 20 доказательств. Конечно, для типичной энтерпрайзной лапши интерфейса к базе данных даже некоторые комментарии кажутся излишними…
Вы, видимо, не писали наукоёмких/вычислительных программ
Ну, скажем, писал, и прямо сейчас пишу весьма сложную математическую систему (дробя код по-максимуму на простые как пять копеек (но, как наставлял дядька Айнштайн, не проще), предельно ясные функции на Scala, с однозначныи инфоративными именами и читабельной структурой).
где за одной страницей алгоритма может стоять одна-две статьи и страниц 20 доказательств
Тем не менее мне видится излишним мешать рабочую теорию с её выведением, доказательством, и т.п. Что возвращает функция понятно из названия, что принимает — из названий аргументов, как она это делает желающему видно из кода внутри, а вот почему мы решили что то, что внутри, равняется тому, что она должна возвратить — imho вполне уместно оставить за рамками, однажды и на всегда выведя/поняв/доказав.
PS: Я не спорю, я рассуждаю, вполне допускаю что я, вероятно, не понимаю чего-то важного.
А как потом читать код? В средней GUI программе в общем понятно, надо искать файлы со словами вроде model и controller и читать в первую очередь их. А как читать вычислительные программмы? Можно смотреть main() и спускаться по графу вызовов, попутно пропуская тысячи строк неинтересного кода вроде парсинга входных данных или проверки их на корректность. Так может пусть лучше автор сам расставит всё в нужном порядке?
Литературная программа фактически пишется на смеси псевдокода и реального кода, с последующим объяснением каждой строчки такого псевдокода с помощью более подробного псевдокода и кода (запутано, но просто по сути). Причем код рассказывается и объясняется в том порядке, который удобен человеку, а он может не совпадать с порядком кода в конечном файле программы для машины, который будет сгенерирован из литературной программы.
Завтра в своем блоге я выложу один большой наглядный листинг Emacs Starter Kit на 2000 строк, на русском, в стиле литературного программирования. ОК?
Да, принцип озвучен, но не расталкован. Чем ЛП принципиально отличается от просто качественного документирования исходников? В чем соль?
Не уверен, что смогу сейчас правильно растолковать суть. Это статья-затравка, мотиватор чтобы посмотреть оригинальную статью Кнута «Literate Programming» и посмотреть на реальные ЛП-программы: «TeX The Program» [http://db.tt/X8debml],
«METAFONT The Program» и «MMIXware», дальнейшие выводы можно сделать только после знакомства с примерами.
«METAFONT The Program» и «MMIXware», дальнейшие выводы можно сделать только после знакомства с примерами.
UFO just landed and posted this here
Программа подготавливается к работе. Тысячи маленьких функций заботливое суетятся, за доли секунды выделяя память, считывая конфигурацию, и прорисовывая интерфейс. Строго, но со вкусом расположенные элементы воявляются на экране. Юркие функции, закончив дело, ложатся спать. Только несколько из них остаются, чтобы следить за работой, программы и быть готовыми разбудить функции обработки формы, когда будет нажата кнопка Ок."...
Еще листинг.
Синий экран опустился на всё - как будето огромное бархотное синее небо сошло на землю, чтобы порадовать пользователя своими яркими красками. Как белые облака, красуются на экране буквы. Но что говорят они пользователю? О нет, они не поздравляют его с днем рождения! Небесный экран вещает ему его судьбу - Мене, мене, текел, упарсин. Твой драйвер взвешен и найден легким...
примеры, блин, где???
Конечно не всегда обязательно описывать действия кода художественным языком, однако идея в целом очень полезная. Проблема в том, что многие авторы программ, как например один из комментаторов, считают, что и так все ясно. Название функции и переменных, классов, как бы говорят сами за себя и очевидны. Это далеко не всегда так. Что ясно для автора, может быть совершенно не ясно другому программисту. Поэтому пояснять в идеале нужно всегда.
Логика программы бывает достаточно очевидна, но почему именно так, чего хотел этим достичь автор, не всегда ясно. В идеале нужно пояснять смысл программы.
Например есть задача обработать массив или строку определенным образом. Автор пишет, хочу обработать строку, на выходе получить другую строку такого то вида. Для этого нужно создать 2 функции, одна делает то то, другая то то. На выходе получаем то что надо. Другой, более опытный программист посмотрит такой комментарий и сразу скажет, уже есть одна встроенная функция для решения этой задачи. Более того эта функция работает оптимальным образом. В итоге ему даже не нужно разбираться в коде, он просто убирает эти 2 функции и вставляет встроенную. Полезность такого рода комментариев я думаю очевидна.
Логика программы бывает достаточно очевидна, но почему именно так, чего хотел этим достичь автор, не всегда ясно. В идеале нужно пояснять смысл программы.
Например есть задача обработать массив или строку определенным образом. Автор пишет, хочу обработать строку, на выходе получить другую строку такого то вида. Для этого нужно создать 2 функции, одна делает то то, другая то то. На выходе получаем то что надо. Другой, более опытный программист посмотрит такой комментарий и сразу скажет, уже есть одна встроенная функция для решения этой задачи. Более того эта функция работает оптимальным образом. В итоге ему даже не нужно разбираться в коде, он просто убирает эти 2 функции и вставляет встроенную. Полезность такого рода комментариев я думаю очевидна.
Вот фрагмент из программы, написанной по законам этого жанра:
Before opening the thin door:
if player wear the uniform:
say «Second pilot! Welcome on board!»;
continue the action;
otherwise:
say «For staff only!»;
stop the action.
After going to Cockpit:
end the game in victory;
After going through the metal detector:
if player carry id and electric switch is switched on:
end the game in death;
otherwise:
continue the action.
After taking the news paper:
Now the boarding pass is in the location;
say «The piece of paper fall down at the floor»;
continue the action.
Carry out inserting something into the slot:
if noun is id:
say «Click!»;
now the wood door is unlocked;
otherwise:
remove the noun from play.
Report inserting something into the slot: say "[if noun is not id][The noun] falls out of sight, and you know you will never see it again."
Instead of giving pass to Stewardess:
now Stewardess carries pass;
say «All Right, Please find your place rear of plane».
Instead of going from Front of Plane to Rear of plane:
if Stewardess carries the Boarding pass:
continue the action;
otherwise:
say «Stop. Give me pass»;
stop the action;
Before opening the thin door:
if player wear the uniform:
say «Second pilot! Welcome on board!»;
continue the action;
otherwise:
say «For staff only!»;
stop the action.
After going to Cockpit:
end the game in victory;
After going through the metal detector:
if player carry id and electric switch is switched on:
end the game in death;
otherwise:
continue the action.
After taking the news paper:
Now the boarding pass is in the location;
say «The piece of paper fall down at the floor»;
continue the action.
Carry out inserting something into the slot:
if noun is id:
say «Click!»;
now the wood door is unlocked;
otherwise:
remove the noun from play.
Report inserting something into the slot: say "[if noun is not id][The noun] falls out of sight, and you know you will never see it again."
Instead of giving pass to Stewardess:
now Stewardess carries pass;
say «All Right, Please find your place rear of plane».
Instead of going from Front of Plane to Rear of plane:
if Stewardess carries the Boarding pass:
continue the action;
otherwise:
say «Stop. Give me pass»;
stop the action;
да, это inform7 www.inform7.com
Sign up to leave a comment.
Литературное программирование