UNIX编程艺术之“模块性”

     本章主要讨论模块划分、接口设计,提出了几个很重要的概念,包括紧凑性、正交性、自顶向下和自底向上的设计、SPOT原则、分层、插件化。下面就这几个概念,谈下我的理解,并在最后给出项目中模块设计的基本原则。

 

    1. 紧凑性

    紧凑性最优化的体现是,使用者无需手册和文档,即可放心的使用,而不用担心额外的影响,这便要求接口简洁、清晰,模块功能集中无冗余,体现了接口设计中“高内聚”的思想。

 

    2.正交性

    正交性主要的关注点是功能单一、无冗余,即不做“顺带”的事情,同时对一个模块的修改只影响这个模块,不会影响其它模块,这里也体现了软件设计中“低耦合”的思想。符合正交性原则的接口,对调用者而言接口统一,即使代码优化或重构,对上层调用者而言是透明的。正交性也体现了设计模式中“外观”的思想。

 

    3.自顶向下和自底向上

    自顶向下和自底向下是软件设计中常用的两个原则,二者的适用场景不同。

    自底向上适用于对系统下层设备、数据等的封装,给上层调用者提供统一的接口,比如一个系统需要操作数据,而数据可能存储在文件中也可能存储在数据库上,这时,自底向上基于数据的封装只需要提供给上层读写接口即可。

    自顶向下适用于对系统业务逻辑的分解,在对业务逻辑分析时,习惯的做法是把功能进行细分,划分出各个模块,而模块中的逻辑再进行细分加以实现。

 

    4.分层

    在软件或系统设计时,通常分为三层,数据层、逻辑层、应用层。数据层实现对数据的操作接口,通常使用自底向上进行封装;逻辑层实现对数据层逻辑操作的进一步封装,把通用的业务逻辑进行抽象封装从而避免代码多次重写;应用层实现经常进行调整的业务逻辑,应用层通过操作逻辑层的接口,可以快速实现客户需求,而无须过多关心底层实现的正确性,因为逻辑层的代码是相比稳定的。

    应用层和逻辑层的界限并不是很清晰,因为都是业务逻辑的实现,区别的原则就是同一段逻辑代码是否会多次被不同的调用者使用,如果是的话就应该考虑抽象出来放到逻辑层。因此应用层的实现是不稳定的,而逻辑层是相对稳定的。

 

    5.SPOT原则

    SPOT原则的核心就是,一个模块只干一件事,而且同一件事只出现在一个模块中。切忌同一份代码在多处出现,以及不要进行代码拷贝,这样,如果一个模块的功能有调整的话,只修改一处就可以。这个原则是保证系统和项目长期稳定的关键。

 

    6.插件

    插件指动态链接库,一种好的软件思想是提供给客户统一的入口,以及要求客户实现统一的接口,框架只需要动态加载链接库,调用接口即可。

 

    统过本章的学习,我总结在项目中,功能分解和封装的几个要点:

    接口设计保证高内聚、低耦合,提供统一、可扩展的视图。

    相同功能保证只有一份代码,且一个模块只负现一个功能,不写异常或冗余的逻辑。

    采用三层结构,数据、逻辑、业务分离。   

 

    关于三层结构,我再举例说明一下,比如一个网站,需要支持用户注册,而网站有时为了营销或推广的需要,在用户注册的时候,可能赠送用户一些虚拟的物品等做为刺激,同时,网站为了控制用户地增长,会制定一些策略对用户注册功能进行限制。

    基于以上功能,先考虑从顶向下设计,对应用功能进行细化,可以分解成几个子功能,包括:创建用户资料、判断用户注册资格以及赠送用户物品三个功能点。

    考虑从底向上设计,首先实现的功能点是“创建用户资料”,数据单元就是用户表,因此,我们需要对用户表进行封装,也就是实现“数据层”。数据层提供的接口就是增、删、查、改;再考虑逻辑层,对于用户注册而言,创建新用户的逻辑是相对稳定不变的,因此,逻辑层需要实现“创建用户”的接口,可能还需要实现“注销用户”的接口;依次可以实现对用户资格判断和赠送接口的封装。

    最后考虑应用层的实现,统过上面的分解,已经实现了逻辑层的接口,因此应用层实现便的十分简单,伪代码如下:

   

     if(RegNotLimited())

     {

           if (SUCC == CreateUser())

           {

                 SendGift();

           }

     }

 

    应用层的实现十分简单,同时,如果赠送活动改变策略,或者停止赠送,只需要修改SendGift接口即可;类似的,如果注册限制策略改变,也只需要修改RegNotLimited接口即可;同时,如果其它模块需要创建用户,只需要调用CreateUser接口即可,无需重新开发创建 用户的接口,也不需要进行代码拷贝。

    由此可见,采用这种分层和封装结构,代码的可维护性和灵活度高了很多,因此在项目设计和实现中,要时刻提醒自己,遵循上面的原则,实现稳定、灵活、可扩展性强及可维护的系统。

你可能感兴趣的:(设计模式,编程,优化,unix,存储,扩展)