三颗纽扣

世界上最宽广的是海洋,比海洋更宽广的是天空,比天空更宽广的是人的胸怀

导航

并非文学化编程,在VS环境下的折中方案

前些天由于搜索一个小工具,结果搜到了自己若干年前在 GoogleCode 上创建一个项目 leo4net,当时这个项目创建不久后就不记得是什么原因搁下了,后来就再没继续过,渐渐的也就遗忘了。事隔多年,从克先生提出文学化编程的概念,到现在已经将近20年了,上 Google 搜搜,这个名词仍然是个新鲜玩意,被提及的地方寥寥无几。然而再回想当时要做这个项目的初衷,即解决设计、文档、代码这几者之间相互配合同步的关系,这个问题似乎目前依然没有找到较好的解决办法,而且文学化编程的概念,目前似乎还是解决这个问题最有效的答案之一。所以看来,还是要把这个项目继续完成下去。

完全用CWEB或者LEO来写代码貌似一个疯狂的举动,特别对于像DOTNET或者JAVA已经存在着如此强大的IDE的情况下,再退回到按下句点没有任何反应的年代是不可接受的。然而文学化编程的本质绝不是要我们退回到记事本年代,或者仅仅是一个大纲式书写环境,应该说文学化编程揭示了设计、文档、代码之间的这样几个小秘密:

  • 设计的过程通常是自顶向下的,代码的过程其实通常也是这样
  • 代码的编译结构和代码的阅读结构是不一样的,将三个有着良好注释的源代码拼接在一起,并不能得到一个文档
  • 除了文字性描述之外,一些代码片段本身最能说明设计,也最适合用作文档
  • 要描述一个设计通常需要多个主题,任何一个主题,仅仅从一个方面描述了整个设计的一部分,这些主题直接通常会有很多内容是重叠的

而实际上,要将设计、文档、代码这几件事情整合起来,也并非完全需要从零做起

  • 源代码本身就是结构性的,因此通过有明确语义的路径描述符来定位到代码中的片段,是一件很容易的事情
  • 采用JavaDoc 或者 DotNet XML 注释文档标准,代码中的注释文档也是结构化的。对于喜欢简洁风格的人来说(例如说我),采用结构化文本(ReStructText或者WikiStyleText)书写的注释文档同样是结构化的
  • IDE能够很好的处理注释文档中的相互引用,甚至在重构的时候能够同时对这些引用进行重构

因此,我们并非要使用一个CWEB或者LEO这样的外部工具来进行文学化编程,确切的说,作为程序员,与其将开发过程转变为 文学化写作->混出生成代码->编译,倒不如反过来,编写大纲文档、写代码、写注释文档、混入生成文档在这样几件事情之间来回切换,最终在代码一步步完善的过程中,注释文档一步步丰富,大纲一步步完善,最终的文档也就一步步丰满了

  • 这样的开发过程中要做的事情,和目前程序员普遍进行的开发工作并没有太大的区别,更容易适应
  • 差不多所有的事情都可以在IDE内完成,不需要脱离IDE环境,使用起来容易
  • 可以利用IDE提供的智能提示、自动补全、重构等特性,大大的提高写作的效率和乐趣
  • 可以和IDE更紧密的集成,在文档更新或代码更新时实时的保持文档和代码的同步和一致

基于这样的考虑,在VS下实现文学化编程并非克努斯最初所提出的文学化编程,借鉴了一些概念,姑且称为”非文学化编程“。假象的工作过程应该是这样的:

  • 除通常的源代码文件以外,在工程中可存在一个或多个Leo文件,Leo文件通常用来描述设计思路,并最终用来生成设计文档
  • Leo文件在主要内容是对源代码中的一些注释文档、代码片段等的引用,当然也可以包含一些将这些片段串接起来的文字信息。这种引用是语义明确的,例如 include MyClass.MyMethod # summary
  • 在适当的时机,例如文件保存、或者主动发起的情况下,Leo中引用的源代码片段内容被复制嵌入到Leo文件中,例如上例中MyMethod 方法的注释文档中的 summary 章节内容被嵌入到 include …. 这一行之后
  • 在开发过程中,随着源代码的更新,Leo文件内容也同步更新保持跟源代码一致(混入)
  • 在开发过程中的一些阶段,需要修改或补充设计思路时,程序员可直接编辑Leo文件,补充一些章节、修改一些章节或删除一些章节,这些修改也能被同步到源代码中(混出)
  • 最后,在开发完成以后,一个文档生成工具能够根据Leo文件的内容生成相应的HTML或者Word格式的设计文档。其实通常情况下,Leo文件本身已经具备有良好的可读性,除了不能嵌入图片等多媒体内容外,用作设计文档也基本足够了。

要实现这样的需求,应该是一件并不算困难的事情:

  • 可能需要一个代码解析器,例如 csharp 语法解析,但我们并不是要做一个编译器,因此并不需要复杂的解析规则,解析器的主要目标是要识别源代码中的注释文档、类、类成员的声明这样一些基本元素就足够了,这太简单了,SharpDeveloper中就包含有这样一个现成的东东
  • 最好有一个IDE的插件,这样在IDE中可以主动对Leo文件进行一些混入、混出、重构等操作,在DevCore 框架下做一个VS插件,也不是很难的事情
  • 对于喜欢Wiki风格的人,需要一个Wiki的解析器,正好前几天完善了前几年的一个项目 wikidoc4net
  • 如果想预览Leo文件的输出结果,也有现成的CR_Documentor,现在还有它的一个支持wiki语法的hack版本。

posted on 2012-03-20 17:32  三颗纽扣  阅读(349)  评论(0编辑  收藏  举报