IV.开发
环境已经搭建好,开发包也解压了,并且配置了构建脚本。接下来要做的一件事就是:
阅读设计文档。
设计文档-你最好的朋友
/doc 目录包含完成提交所需的全部信息。
.zuml /.zargo 在doc 目录下,应该有一份UML 文档。它包含了组件中所有类和接口的
定义。它将定义组件的所有、包括异常行为。
.pdf /.rtf 在doc 目录下,应该有一份组件说明书和需求说明书。组件说明书是UML 文
档的更具可读性的版本。它包含组件常规设计,所需的标准和算法。它非常简明的定义了异
常类和其它所需的信息。你应该用不着需求说明书。它定义了组件的需求,而所有这些需求
应该已经满足。
.gif /.png 这些文档都是由UML 文档生成的,可以不去管它们。其中所有信息都可以通
过UML 文档轻松得到。
开发流程
正如第一节所述,你在开发过程中的角色就是实现已经创建并通过审查的设计。你应该
严格遵循设计文档中给出的公共API。未经项目经理和/或设计者许可,你不得擅自修改组
件的公共API:包括增加或删除public 类、方法和接口。
这并不是说设计会毫无瑕疵;恰恰相反,所有的设计都有改进的空间。然而,对设计的
不同意见要在设计中修正,而不是开发。在开发实行的过程修正设计方案是不合适的,除非
其存在致命缺陷。TopCoder 会对设计的任何改动进行细致审核。
如果你对下个修订版有任何的改进意见和见解,请在论坛上指出。开发过程中遇到的问
题也请立即在论坛上提出来。设计上的任何冲突和问题越早明确,就能越早解决。如果可能,
可以阅读一下设计论坛中的相关讨论,可能这个问题已经提出并被解决了。再强调一次,如
果你发现任何没有解决的问题,请在论坛上提出来!
上面所说的一切,都是为了鼓励你们尽可能的做出改进。如果你能把public 类的行为分
解成私有辅助类,那就去做!如果你能提出一个更加有效的算法,这太棒了!设计中你不能
改变的只有公共API 及从用户角度来说组件的行为。对于一个组件,一般来说,你不可以
改变“是什么”,但是有一定程度上改进“怎样做”的自由。
创新
不同的设计允许不同程度的开发创新。其一方面是设计本身复杂度的原因,另一方面是
设计者的方法问题。或许有的设计方案对组件描述的如此彻底,以至于组件编码变成了将组
件说明书中的伪码翻译成合适的程序设计语言。或许有的设计方案仅仅给出了公共API 的
定义,而将实现细节留给了开发人员。大多数设计方案则是介于这两者之间。
方法体的具体实现一直是程序开发者表现他们手腕的地方。对某些设计方案,添加
private 或packageprivate
的方法、构造函数,甚至设计文档中没有明确说明的类都是可行的,
甚至是必要的。如果你真要这么做,请确保这些改动是必要而且适当的,因为这些地方可能
会引起评审团额外的注意。开发人员所添加的内容(和组件中的其他元素一样)应有最小作
用域,并且予以与其用途一致的最严格的访问控制权限。对于一个任务,确保采用最恰当的
对象或者基本数据类型。
生成站位程序(Stubs)
具体开发的第一步是生成站位程序。站位程序是可编译的代码框架。其中你可以找到函
数体;然而,这仅仅是一个站位程序。这些站位程序刻画了组件的全部API,但并没有实现
其内部逻辑。Poseidon 社区版可以生成Java 站位程序。更贵一些的Poseidon 也可以生成C#
代码。如果没有这些版本的软件,你就需要手工转换这些文件。当然,你也可以从项目经理
那里索要这些站位程序。
你获得的这些站位程序很可能无法成功编译,需要你对它们稍加整理。
站位程序的另一个问题是关联部分。UML 文档里面的一些关系(例如聚合、组合)可
能会被不适当的转化成了代码。程序开发人员负责维护API 文档(UML 文档和组件说明书)
和可编译代码的一致性。
工程结构
工程的源代码应该放在/src 目录下。你的工程应具以下结构( 所给示例是在
/proj/tc/tutorial_gen/目录下):
路径描述
conf/ 包含组件必需的配置文件。
docs/ 包含工程的所有文档。
lib/ 包含所有本地库文件。
src/ 所有的源代码都放在此目录下(包括测试代码)。
Java
组件代码放在/src/java/main/目录下。你需要根据包名来组织你的源代码。例如,如果组
件是com.topcoder.util.tutorial , 那么源代码路径应该是
/src/java/main/com/topcoder/util/tutorial/。下面是典型的Java 的路径:
C#
组件代码放在/src/csharp/main/目录下。你需要根据包名来组织你的源代码。例如,你的
组件是TopCoder.Util.Tutorial.dll , 你的源代码路径就是
/src/csharp/main/TopCoder/Util/Tutorial/。下面是典型C#路径。尽管C#的namespace 不要求
目录和包名完全一致,但是根据namespace 来安排的源文件是TopCoder 的惯例。
构建你的工程
生成并整理好站位程序后,你应该可以通过构建脚本来构建你的组件了。你只需从命令
行里运行构建工具即可。
以下是[N]Ant 的常用构建目标:
路径描述
test_files/ 所有测试中用到的不可编译文件。
Java
组件代码放在/src/java/main/目录下。你需要根据包名来组织你的源代码。例如,如果组
件是com.topcoder.util.tutorial , 那么源代码路径应该是
/src/java/main/com/topcoder/util/tutorial/。下面是典型的Java 的路径:
路径描述
lib/tcs/spell_check/1.0/spell_check.jar 这是一个Tutorial Generator 所依靠的组件的例子。你
的组件可能不依赖于任一组件,也可能依赖于很多
组件。
src/java/main/ 组件代码放在此目录下。
src/java/main/com/topcoder/util/tutorial/ 这是一个站位程序目录的例子。在你的工程里,这
个路径会有所不同。
C#
组件代码放在/src/csharp/main/目录下。你需要根据包名来组织你的源代码。例如,你的
组件是TopCoder.Util.Tutorial.dll , 你的源代码路径就是
/src/csharp/main/TopCoder/Util/Tutorial/。下面是典型C#路径。尽管C#的namespace 不要求
目录和包名完全一致,但是根据namespace 来安排的源文件是TopCoder 的惯例。
路径描述
lib/TopCoder.Util.SpellCheck.dll 这是一个Tutorial Generator 所依靠的组件的例子。你
的组件可能不依赖于任一组件,也可能依赖于很多组
件。
src/csharp/main/ 组件代码放在此目录下。
src/csharp/main/TopCoder/Util/Tutorial/ 这是一个站位程序目录的例子。在你的工程里,这个
路径会有所不同。
构建你的工程
生成并整理好站位程序后,你应该可以通过构建脚本来构建你的组件了。你只需从命令
行里运行构建工具即可。
以下是[N]Ant 的常用构建目标:
目标名描述
compile 把工程编译成功能完全的二进制单元(假设你的代码是正确的)。
compile_tests 编译测试代码,依赖于compile 的成功执行。
要执行构建目标,你只需到切换到构建脚本所在的目录(应该是工程的根目录),并执
行ant 或nant 。确保你已经配置好[N]Ant,否则,这一步将失败。
NAnt 的构建示例
Ant 的构建示例
你的组件站位程序应该总能完全干净的构建。如果它们不能成功编译,可能是API 的
问题,也可能是库文件的配置问题。在编写代码和测试前就修正这些问题会简单的多,如果
可能,你也应该这样。
可以休息一会了
到这里,你已经为工程的具体开发做好了准备。有关程序开发技术和策略方面的具体问
题已经超出了这份文档的范畴。在接下来的几节中,我们将介绍有关文档、单元测试和开发
过程中的一些常见问题。
V.文档
文档对一个组件的可用性,可维护性至关重要。如果在写的同时就对代码添加文档,你
或许根本就不会感觉到写文档的负担。评审团会评估文档质量。并且,文档越好,评审团就
越容易看懂和评估你的作品,得分也就越高。
API 文档
你需要对从UML 文档自动生成的API 文档进行修改,而不是把它当作最终版本。在Java
中,API 是通过Javadoc 来注释的,C#中则是通过XML 文档来注释。所有的类、接口、方
法和变量都必须具备文档。以下是分别是Java 和C#的文档例子。
Java
当键入如下内容,很多Java IDE(如Eclipse,IDEA 等)就可以自动生成API 文档。
目标名描述
compile_targets (仅适用于Java)使用配置的JRE1.3 编译你的组件。通常,你需要进行此
操作才可以通过screening。组件说明书的第二节会指明你是否需要此步骤。
test 执行测试,依赖于compile_tests.的成功执行。结束后,测试结果存放在/log
目录下。
clean 清空/build 目录,删除所有的编译代码和中间文件。
dev_submission 将工程打包,以便通过Project Submit and Review 上传。
要执行构建目标,你只需到切换到构建脚本所在的目录(应该是工程的根目录),并执
行ant 或nant 。确保你已经配置好[N]Ant,否则,这一步将失败。
NAnt 的构建示例
Ant 的构建示例
你的组件站位程序应该总能完全干净的构建。如果它们不能成功编译,可能是API 的
问题,也可能是库文件的配置问题。在编写代码和测试前就修正这些问题会简单的多,如果
可能,你也应该这样。
可以休息一会了
到这里,你已经为工程的具体开发做好了准备。有关程序开发技术和策略方面的具体问
题已经超出了这份文档的范畴。在接下来的几节中,我们将介绍有关文档、单元测试和开发
过程中的一些常见问题。