4

因此,我使用scribble/lp模块编写了我的第一个使用 plt-scheme 的识字程序:

#lang scribble/lp
(require scribble/lp)

<<lp_scheme.ss>>

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

当然,那里没有什么用处。现在我有点想知道为什么我不使用简单的注释,而不是文字编程结构。欢迎任何意见。如果有人可能有更多的曝光/经验,那就太好了。用它可能更直观地解释有据可查的代码和使用文学编程结构编写的代码之间的差异。

4

3 回答 3

9

(我假设您使用的是 Donald Knuth 对文学编程的定义。)

关键区别之一是sequence

在编写常规应用程序时,您表达事物的顺序受到限制。

为了显示:

  • 特定类的所有代码都必须在一个地方表示
    (或在极少数地方,例如 C# 部分类)
  • 必须以正确的执行顺序一次性给出一种方法的所有代码
  • 必须在依赖它们的事物之前声明依赖项
    (在大多数语言中使用之前声明的变量;在 Pascal 中使用之前声明的过程/函数;在 .NET 中在其他之前编译的库程序集)

通过文学编程,您可以摆脱这种限制,并可以在向其他开发人员解释程序时以任何对您有意义的顺序表达您的概念。

这还有另一个后果 - 在某些形式中,您可以表达一个概念一次(例如,“所有属性在更改时都会触发 PropertyChanged 事件”),然后将其贯穿于您的应用程序中的无数其他地方。

对于非常简单的程序,一个有文化的程序和一个有良好注释的程序可能看起来相同 - 但随着系统复杂性的增加,两者将开始出现非常不同的情况。

于 2009-08-08T05:52:49.287 回答
0

对我来说,主要动机是每个程序员都使用纸张/笔记本来“设计”架构,开发想法,在那里他写方案,图表,尝试一些数学等等。程序结束后,所有这些笔记本/纸张都丢失了,因此程序的可支持性正在下降。我在我的 LP 工具 NanoLP 的 WiKi 中写过这个:http ://code.google.com/p/nano-lp/wiki/AboutLP 。

第二个动机,不是那么明确,是较小的错误。但这不是“理论”的事情,这是经验事实(对我来说)——当你在纸上“思考”、绘制图表、算法方案时——你的程序会有更少的错误。LP就是这样的“纸”,仅此而已。

有很多开发人员,他们从不画东西,甚至没有评论(!),他们只写程序......太糟糕了!

LP 可以帮助您创建良好的文档(不是以正式的方式 - 对函数的描述、它的 args 以及它返回的内容,并确保这是众所周知的函数签名,那么为什么需要这样的文档??),但它有助于用语义,图片,描述真实动作编写真实的文档......

许多动机 :) 并且有时最好只使用反向 LP(例如 Doxygen),有时 - 真正的 LP,取决于许多因素。

于 2013-01-24T06:40:57.053 回答
0

文学编程基于三个简单的语句:

  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 行代码编写一个函数,并且理解整个事情没有问题。如果您作为开发人员必须保持这一点,那么上帝会帮助您。

这就是文学编程背后的原因。代码需要维护,无论是修复错误还是添加功能。如果它不能被其他人理解,那么稍后,它会以一种有效的方式被替换。这个世界上有很多“只写”代码。文学编程使其更易于阅读和理解,这使其更有可能长期保存和使用。

我们真的有时间不断重新发明轮子吗?

于 2015-01-16T15:48:34.113 回答