Интуитивная мотивация для грамотного программирования? - PullRequest
4 голосов
/ 07 августа 2009

Итак, я использовал модуль scribble / lp , чтобы написать свою первую грамотную программу с использованием plt-схемы:

#lang scribble/lp
(require scribble/lp)

<<lp_scheme.ss>>

@chunk[<squarefunction>
        (define (f x)
         (* x x))]

Ничего полезного там, конечно. Теперь мне интересно, почему бы мне просто не использовать простые комментарии вместо грамотных программных конструкций. Любые мнения приветствуются. Было бы здорово, если бы кто-то, кто, вероятно, имел больше экспозиции / опыта. с его помощью возможно дать более интуитивное объяснение различий между хорошо документированным кодом и кодом, написанным с использованием грамотных программных конструкций.

Ответы [ 3 ]

9 голосов
/ 08 августа 2009

(Я предполагаю, что вы используете определение грамотного программирования Дональда Кнута.)

Разница в ключах: последовательность .

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

Для иллюстрации:

  • Весь код для определенного класса должен быть выражен в одном месте
    (или в очень небольшом количестве мест, например частичные классы C #)
  • Весь код для одного метода должен быть дан за один раз, в правильном порядке выполнения
  • Зависимости должны быть объявлены перед тем, что зависит от них
    (переменные, объявленные перед использованием в большинстве языков; процедуры / функции, объявленные перед использованием в Pascal; библиотечные сборки, скомпилированные перед другими в .NET)

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

Это имеет другое следствие - в некоторых формах вы можете выразить концепцию один раз (скажем, «Все свойства будут запускать событие PropertyChanged при изменении»), и иметь это тканое по всему приложению во множестве других мест.

Для очень простых программ грамотная и хорошо прокомментированная программа может выглядеть одинаково - но по мере роста сложности системы они начнут казаться совершенно разными.

0 голосов
/ 16 января 2015

Грамотное программирование основано на трех простых утверждениях:

  1. Программисты должны написать код, понятный компьютеру
  2. Программисты должны писать документацию, понятную людям
  3. Если это отдельные документы, неизбежно, что они будут несинхронизированы

Действительно, по моему опыту, # 2 обычно становится коротким. Я потерял счет того, сколько раз QA сообщило мне: «Документ говорит об этом, но код делает ЭТО; код неправильный или документ устарел?» Я не ожидаю, что мое рабочее место будет необычным в этом отношении. Кроме того, в одном из моих ранних проектов я пытался обновлять документы, так как взаимодействие с заинтересованными сторонами приводило к изменению требований. Это заняло достаточно много времени, и мне сказали, чтобы руководство прекратило возиться с документами и просто заставить проект работать. С тех пор мы перешли к менее утомительным процессам документирования (слава Богу!).

У нас есть инструменты для проверки кода, где, когда мы вносим изменения в код, несколько человек могут видеть изменения, четко очерченные, и могут быть сделаны комментарии, задавая вопросы, объясняя вещи, предлагая улучшения. Если бы код был написан с использованием методов грамотного программирования, большая часть этого вопроса / ответа была бы излишней, потому что было бы включено объяснение.

Большая часть мышления современного программирования заключается в том, что ваш код должен быть собственной документацией. Многие эксперты утверждают, что, если вам нужно объяснить свой код в комментариях, вам, вероятно, следует переформатировать код (изменение имен переменных / функций и т. Д.) Так, чтобы комментарии были ненужными. Я считаю, что это здорово в теории, менее практично в реальности. Я имею в виду, что когда я использую библиотеки, созданные / поддерживаемые кем-то другим, их выбор имен методов / функций не всегда интуитивен для меня. Например:

Set<String> statesWeCareABout = new HashSet<String>(Arrays.asList(new String[] { "one", "two", "three" }));
Set<String> statesWeFound = <some function>;
statesWeFound.retainAll(statesWeCareAbout);

Если вы не знакомы с Set <> или HashSet <>, вы, возможно, не знаете, что .retainAll () означает, что дайте мне пересечение двух, и в результате получите измененный Set <>.

Наконец, грамотное программирование обычно позволяет разбить вещи так, чтобы вы могли объяснить этот фрагмент кода изолированно, а затем встроить его в этот другой фрагмент кода. Это больше соответствует тому, как работает человеческое понимание. Объясните мне, как это работает, а затем воспользуйтесь этим пониманием, чтобы объяснить общую картину. Компьютерам все равно; Вы можете написать одну функцию с 1000 строками кода, и это не проблема для понимания всего этого. Да поможет вам Бог, если вы, как разработчик, должны это поддерживать.

И в этом, собственно, и заключается причина грамотного программирования. Код должен быть сохранен, будь то исправление ошибок или добавление функций. И если это не может быть понято кем-то другим, позже, эффективным способом, это будет заменено. В этом мире существует множество способов «писать только». Грамотное программирование облегчает чтение и понимание, что повышает вероятность его сохранения и использования в долгосрочной перспективе.

А у нас действительно есть время, чтобы заново изобретать колесо?

0 голосов
/ 24 января 2013

Основная мотивация, как по мне, заключается в том, что каждый программист использует бумажные листы / тетради для «проектирования» архитектуры, разработки идей, там он пишет схемы, диаграммы, пробует кое-какую математику и так далее. После завершения программы все эти тетради / листы бумаги теряются, поэтому поддержка программы снижается. Я написал об этом в WiKi моего инструмента LP NanoLP: http://code.google.com/p/nano-lp/wiki/AboutLP.

Второе побуждение, не столь явно, это меньшие ошибки. Но это не «теоретическая» вещь, это факт опыта (для меня) - когда вы «размышляете» над документом, рисуете диаграммы, алгоритмические схемы - ваша программа будет иметь меньше ошибок. LP - это такая «бумага», больше ничего.

Есть много разработчиков, которые никогда ничего не рисуют, даже не комментируют (!), Пишут только программы ... Ужасно!

И LP помогает вам создавать хорошую документацию (не формально - описание функций, их аргументов и того, что он возвращает, и, конечно, это хорошо известно в сигнатуре функции, так почему такая документация нужна ??), но помогает писать РЕАЛЬНУЮ АКТУАЛЬНУЮ документацию с семантикой, с картинками, с описанием реальных действий ...

Множество мотиваций :) И конечно, иногда лучше использовать только реверсивный LP (например, Doxygen), иногда - реальный LP, зависит от многих факторов.

...