diff options
Diffstat (limited to 'parnas-a-rational-design-process.rst')
-rw-r--r-- | parnas-a-rational-design-process.rst | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/parnas-a-rational-design-process.rst b/parnas-a-rational-design-process.rst index 411fab6..9987879 100644 --- a/parnas-a-rational-design-process.rst +++ b/parnas-a-rational-design-process.rst @@ -383,7 +383,10 @@ Page 10 我们需求文档的核心可以被表述为表格形式的一组数学函数。每个函数都将单个输出的值指定为与应用程序相关的外部状态变量的函数。 以这种方式生成的完整文档的一个例子,我们将在本文[9]中给出并在[8]中讨论。 -B.设计并记录模块结构 +.. _B: + +B. 设计并记录模块结构 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 除非产品很小,小到能由单个程序员来做,否则我们必须想一想如何将工作分解为任务,即模块。 此阶段应生成的文档为 **模块指南 (Module Guide)** 。 模块指南定义各模块的职责, 把我们的设计决策 (design decision) 封装在该模块。 模块里可以有子模块,也可以单独作为一个工作任务。 @@ -400,43 +403,51 @@ Page 11 C. 设计并记录模块接口 -高效快速的软件生产需要使程序员能独立工作。 模块指南定义了模块职责,但没有给出足够的信息使得每个人能去独立实现模块。 为此,每个模块必须指定精确的接口。 每个模块都必须有 **模块接口规范 (Module Interface Specification)** ; 规范必须正式,并提供每个模块的黑箱图片 (black box picture)。 规范由资深设计师撰写, 并由接口实现者与接口使用者一起评审。 一个模块的接口规范只需包含足够使其他模块的程序员使用该模块功能的信息, 而不需要其他信息。 接口实现者也需要 **模块接口规范** 。· +高效快速的软件生产需要使程序员能独立工作。 模块指南定义了模块职责,但没有给出足够的信息使得每个人能去独立实现模块。 为此,每个模块必须指定精确的接口。 每个模块都必须有 **模块接口规范 (Module Interface Specification)** ; 规范必须正式,并提供每个模块的黑箱图片 (black box picture)。 规范由资深设计师撰写, 并由接口实现者与接口使用者一起评审。 一个模块的接口规范只需包含足够使其他模块的程序员使用该模块功能的信息, 而不需要其他信息。 接口实现者也需要 **模块接口规范** 。· 我们写的文件由两者使用。 Page 12 ------------------------------------------------------------------------------ -何可人 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +( 何可人 OK ) + + +虽然,每人负责写一个文件, 但这些文件实际上是在模块实现者、模块使用者, 对模块设计感兴趣的人(如审稿人)商议过程中产生的。 这些规范文件的主要内容有: + +- 被访程序: 可被其它模块中的程序调用的程序列表。 + +- 被访程序的参数。 + +- 被访程序对彼此的影响。 + +- 时间约束与精度约束 (如果需要)。 + +- 不希望发生的事件 (undesired events) 的定义(禁止发生的事) + +许多方面,模块规范类似需求文件。 但是,模块规范所使用的符号与文档结构更适合描述软件与软件的接口。 已发表的例子和解释有 [11],[2],[i],[5]。 + -我们生产的文件由两者使用。 -虽然,每一此类文件都由一个人专门负责,但它们实际上是由那些负责实现这些模块的人,使用这些模块的人以及对这个模块的设计感兴趣的其他人,例如:评审,谈判产生的。这些规范的主要内容有: -- 一系列可被其他模块用程序(被称为“访问程序”)调用的的程序。 -- 这些访问程序的参数。 -- 这些访问程序对彼此的影响。 -- 必要时的时序约束和精度限制。 -- 不期望事件的定义(禁止发生的事) -在许多方面,这个模块的规格类似于要求文件。但是,符号和组织的使用更适合于我们在这个过程中所关注的软件到软件的接口。 -已发表的例子和解释包括[Ii],[2],[i],[5]。 +D. 设计并记录模块内部结构 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -D. 设计并记录模块的内部结构 +一旦指定了模块接口, 实现可以作为独立任务去执行。 但是,开始编码之前, 我们想在模块设计文档中记录主要的设计决策。 这个文档允许我们编码前对设计有效的评审, 并向未来的维护程序员解释代码背后的意图。 -一旦指定了模块接口,其实现可以作为独立任务被执行,但评论除外。但是,在我们开始编码之前,我们希望在模块设计文档中记录主要的设计决策。这个文档旨在开始编码前对设计进行有效的检验,并向未来的维护程序员解释代码背后的意图。 -在某些情况下,模块只是被简单地分成一个个子模块,而设计文档被当制作是另一个模块指南。在这种情况下,该模块的设计过程应在上面的步骤B处重新开始。而在其他情况下,我们首先应描述其内部数据结构; +在某些情况下, 模块只是被简单地分成几个子模块, 设计文件是另一个模块指南。 在这种情况下,该模块的设计过程在上面的步骤 B_ 处继续。 Page 13 ------------------------------------------------------------------------------- -袁世家 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +( 袁世家 ) -在另一些情况中,我们从描述内部数据结构开始;还有一些情况是,数据结构被子模块使用(和隐藏)。对于每一个访问函数,我们引用一种函数或者描述数据结构上的影响的LD关系。对于每一个模块所返回给使用者的数值,我们都提供了另一种数学函数,这个抽象函数将数据结构的值和其返回值一一对应。对于每一个不确定的事件,我们描述了怎样去检查它。最后,我们还提供了一种证明方法,这种使用此类性质来编程的观点可以满足模型的规格。 + +在另一些情况下,我们从描述内部数据结构开始;还有一些情况是,数据结构被子模块使用(和隐藏)。对于每一个访问函数,我们引用一种函数或者描述数据结构上的影响的LD关系。对于每一个模块所返回给使用者的数值,我们都提供了另一种数学函数,这个抽象函数将数据结构的值和其返回值一一对应。对于每一个不确定的事件,我们描述了怎样去检查它。最后,我们还提供了一种证明方法,这种使用此类性质来编程的观点可以满足模型的规格。 我们继续分解子模块,直到每个工作任务小到我们能够忽略它,并且当程序员离开该工程后可以继续工作。 如果我们不能编写一个可读的高级语言,例如,如果没有可用的编译器,我们使用伪代码作为文档的一部分。我们发现由另外某个人写伪代码而不是最终的程序员写代码,并且让两个程序员负责两种代码的连贯性是很有用的。 -E 设计并且记录使用层次结构 +E. 设计并且记录使用层次结构 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 一旦我们知道所有的模型和它们的许可程序,就可以设计使用的层次结构。他被方便地记录为二进制矩阵,当且仅当位置(a,b)的入口为真,程序A的正确性取决于系统中是否存在正确的程序B。使用层级结构定义了可以由删除整个程序并且没有重写任何程序获得的子集。这对于分阶段递交,故障弱化系统,和程序集合的发展很重要。 |