[设计原则] 以人为本

     在《 什么是软件设计 》一文中指出,软件设计应当是一个创造模型的过程。那软件世界中的模型其原型源于何处呢?来源于现实世界!这与“以人为本”设计原则又有什么关系呢?
     设计出来的软件除了达到其所应知足的需求外,其很重要的另外一个功能是它能向他人传达设计者的设计意图,毕竟一个设计不可能永远地由一我的去维护。在绝大多数的情形下须要多人合做,而合做不可避免地须要涉及沟通。沟通的形式有多种,好比写文档、口授等等,但最好的设计应当是设计自身是“自说明”的。那如何让设计能更好地“自说明”呢?人们在现实生活中积累了大量的生活经验,而大量的生活经验为沟通带来了及大的效率。好比,一说到刀,涉众就能当即明白刀是什么,而不须要解释为“一般是一种由铁作成的用于切割其它东西的工具”。既然生活经验对于沟通效率是如此的重要,那设计时 在软件世界所创造的模型就应当迎合人们的生活经验,这就是以人为本! 若是在软件世界里将刀设计成了是一种用于拧螺丝的工具,那多少显得有点“不厚道”,由于它与人们的生活常识彻底不符。取而代之,将其设计成螺丝刀就能很好地体现“以人为本”。
     《数据结构》这类书籍所传授的内容更多地立足于软件世界,能够说数据结构是软件世界的基石。这些基石对于软件开发工程师之间的沟通仍是颇有效的,但却不够生动。 软件世界内的设计应当更多地反映现实世界,只有这样才更加的生动、更容易让人理解,由于经过这样设计出来的软件能让用户知其一后根据经验推测出二,而进一步软件的设计又能迎合用户的推测,这显然将大大地提升被设计软件的“自说明”能力。 接下来以一个在VxWorks操做系统上采用MMU保护任务内存池的设计为例,来帮助读者进一步理解“以人为本”这一设计原则。
     如今假设在一个运行VxWorks操做系统的嵌入式设备上存在多个任务,且全部的任务是共享系统内存的方式运行的,也就是说对于任务A专有的内容池,若是任务B也想去访问那也是能够的,其上并不存在象Windows桌面系统那的进程保护机制(其实它也是用MMU实现的)。经过采用MMU进行内存池的保护将有助于发现程序由于未初始化指针等因素所形成的内存访问错误的根源。如何经过恰当地运用MMU来保护和任务的内存池呢?在探讨设计以前,须要了解被设计模块的用例(use case)。
     图1示例了三个任务和三个内存池,在每个内存池中也标识了其能够被哪一个(些)任务读写。从图中能够看出任务C不能访问图中列出的三个内存池。当任务A处于活动状态时(注意每一时刻只能有一个任务是处于活动状态的),内存池1和2应当可被读写,而内存池3应当是不能被读写的;同理,当任务B处于活动状态时,内存池2和3变为可被读写且内存池1不可被读写;最后,当任务C处于活动状态时,三个内存池都不可被读写。
图1
     那如何经过设计来展现前面讲到的用例呢?显然,每个任务都须要必定的数据结构来表达它对每个内存池的访问权限,生活中存在这种相似的例子吗?想一想不少大型的公司都有员工牌,且不少情形下员工牌是与门禁系统联系在一块儿的,每一个人能进入公司哪些办公区或实验室,都是经过员工牌来进行权限管理的。若是将员工牌的这种现实模型搬到软件世界中去,是否是能取得很好的“自说明”效果呢?这就是做者设计内存池保护模块时,所采用的设计思想。
     图2是引入了员工牌的概念后的示意图,其中的mbadge是“memory badge”的简写,badge有“徽章”的意思,而运用到公司内部就是指员工牌了(摩托罗拉内部就称员工牌为badge的)。有了mbadge的概念之后,很天然地会问这类问题 —— 好比,任务A对于每个内存池的访问权限是记录在哪儿的呢?想信,不用解释读者也会想到应当是记录在mbadge中的。这里与现实世界可能有一点点不一样,现实世界的数据信息有多是记录在中央数据库中的,但这里因为没有数据库因此将存取权限记录在每一个任务的mbadge上,仍是很直观的。从图中也很容易想到,因为任务C没有mbadge,所以它不具备对三个内存池进行读写的权限。
图2
     有了mbadge的概念之后,也很容易向用户(多是其它的程序员)解释,若是要使用内存池保护这一功能,第一步须要作的是让任务拥有一个mbadge(固然,这可能须要经过调用相应的函数去得到),接着对mbadge设置所对应的任务处于活动状态时所能读写的内存池。并且,这些解释显得是那么的天然和易懂。接下来并不打算对内存池的具体实现是如何作的进行进一步的阐述,由于对于理解“以人为本”设计原则来讲,具体的实现细节并不重要。
     以人为本的设计原则集中体现于在软件世界中构造与现实类似的模型,或者说重点在于创造概念。当概念有了之后,后面怎么设计就有了很好的方向性,由于现实世界就是一个参照,也不容易作出一个什么都不象的设计来。概念的存在才能让软件具备生命,而不仅是一堆死板的数据结构和代码。另外,也由于有了模型或概念,如何给数据结构或函数命名也会更加的容易。某种程度上,“以人为本”的设计原则与《 好命名胜于任何注释 》这一设计原则是分不开的。
相关文章
相关标签/搜索