面向对象设计需要注意的问题

1.面向对象技术

    思维方式决定解决问题的方式,传统软件开发采用自顶向下的思想指导程序设计,即将目标划分为若干子目标,子目标再进一步划分下去,直到目标能被编程实现为止。面向对象技术给软件设计领域带来极大的变化,它利用软件对象来进行程序开发,所谓对象是包含数据和对数据操作的代码实体,或者说是在传统的数据结构中加入一些被称为成员函数的过程,因而赋予对象以动作。而在程序设计中,对象具有与现实世界的某种对应关系,我们正是利用这种关系对问题进行分解。

    从程序语言角度来看,在一个对象中代码和(或)数据可以是这个对象私有的,不能被对象外的部分直接访问。因而对象提供了一种高级保护以防止程序被无关部分错误修改或错误地使用了对象的私有部分。当从对象外部试图直接对受保护的内部数据进行修改时,将被程序拒绝,只有通过对象所提供的对外服务函数才能够对其内部数据进行必要的加工,从而保证了数据加工的合法性。从这一意义上讲,把这种代码和数据的联系称为"封装"。换句话说,封装是将对象封闭保护起来,是将内部细节隐蔽起来的能力。

    2.面向对象设计要点

    下面是根据我个人的设计经验,总结的在面向对象设计时需要注意的问题。

    (1)为实际工作设计:软件是一种工具,一种实现目标的方法,所以我们的软件设计一定要建立在软件需求基础上,根据需求确定软件的工作范围,再根据确定的工作范围来进行软件设计,另外,我们不要迷失在各种技术的诱惑之中,不能为了尝试某些新技术而试图解决实际不存在的问题,这样会使软件设计处于一片混乱之中。

    (2)理解要实现的东西:我们应该在建立模型上花大量的时间,偶尔写一些源代码来验证设计过程中所遇到的问题,这样做可以使我们的设计方案更加可行。如果我们不了解我们的软件设计要实现什么目标,这个设计注定是失败的。

    (3)需求的重要性:留出时间努力去充分收集相关信息和分析软件用户的需求。让用户参与到这个过程中,但不要盲目接受用户或客户提出的功能需求。保证在开发过程中引入一种有效的方法去收集、组织、验证支撑工作的信息,要学习问题领域的描述语言和掌握相关工作的流程。如果没有需求,就不要动手做任何事情,成功的软件取决于时间、预算和是否满足用户的需求,如果不能确切地知道用户需要的是什么,那么所做的软件必定是失败的。

    (4)在现有任务中应用多个模型:当收集需求的时候,应该考虑使用用例模型、用户界面模型和领域级的类模型。当设计软件时,应该考虑制作类模型、顺序图、状态图、协作图和最终的软件实际物理模型。仅仅使用一个模型而实现的软件要么不能满足用户的需求,要么很难扩展。

    (5)用例的重要性:在一个软件系统中,用例可大可小,但它必须是对一个具体的用户目标实现的完整描述。通过用例图把系统和外界的交互描述出来,以便来鉴别和划分系统功能。

    (6)文档的重要性:拥有准确的技术文档不仅对于整个开发小组非常有益,而且也能让客户从中受益。由于软件开发在某种程度上要依赖技术文档来进行说明,因此文档必须十分准确可靠。在编写文档时,要明确该文档的目的和对象,同时,要保证文档之间的前后一致性。

    (7)证明软件的设计在实践中是可行的:在设计的时候应先建立一个技术模型,或者称为"点到点"的原型,用此来证明我们的设计是可行的。如果软件的设计方案是不可行的,在编码时采用任何策略都是毫无用处的。

    (8)应用已知的模式:一般来说,应该避免重新设计已经成熟的并被广泛使用的设计方法或者设计模式。

    (9)类的内聚性:一个类应该有且仅有一个职责。所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因引起该类变化,其实就是耦合了多个互不相关的职责,降低这个类的内聚性。

    (10)充分考虑软件的可移植性:当使用了某个操作系统的特性,或者利用某个数据库专用语言写了存储过程,这个软件和特定产品的结合度就已经很高了。所以,为了增强软件的可移植性,应该把这些特有的实现细节封装在一个类中,这样,当它们改变的时候,只需要更改那个类的代码就可以了。

    (11)建立对象数据辞典:为了便于内部重用和共享,应该建立电子化的对象数据辞典,以便对对象进行统一归类管理。

    (12)对接口编程:对接口编程是面向对象设计的第一个基本原则。它的含义是:对于所有完成相同功能的组件,应该抽象出一个接口,它们都实现该接口。具体到编程语言,可以是接口(Java语言),或者是抽象类(C++语言),所有完成相同功能的组件都实现该接口,或者从该抽象类继承。外部代码只应该和该接口通讯,这样,当需要用其它组件完成任务时,只需要替换该接口的实现,而代码的其它部分不需要改变。接口实际上就是一种抽象,所谓抽象就是一个固定的行为,但是对于这个行为可以由很多不同的具体实现方法。这样,用一个抽象的概念就可以代替那些容易变化的数量众多的具体概念,结果就是:系统新需求的增加,仅仅会引起具体的概念的增加,而不会影响它所依赖的抽象概念的改变。当现有的组件不能满足要求时,可以创建新的组件,实现该接口,或者,直接对现有的组件进行扩展,由子类去完成扩展的功能。

    (13)类层次的最高层是抽象类:在许多情况下,提供一个抽象类有利于做特性化扩展,抽象类的层次越高,代码就越有弹性,越容易适应变化。

    (14)优先使用对象组和,而不是类继承:继承和组合各有优缺点,类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。但是,由于继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。而且,父类至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。由于组合要求对象具有良好定义的接口,而且,对象只能通过接口访问,所以组合并不破坏封装性,只要类型一致,运行时刻还可以用一个对象来替代另一个对象。所以,综上所述,优先使用对象组合有助于保持每个类被封装,并且具有更多的灵活性。

    (15)增加参数的可读性:有大量参数需要传递的方法,通常很难阅读,所以可以将所有参数封装到一个对象中来完成对象的传递,这有利于增加程序的可读性,也有利于错误跟踪。

    (16)尽量减少对变量的直接访问:对数据的封装原则应该规范化,不要把一个类的属性暴露给其它类,而是应该通过访问方法去保护他们,这有利于避免产生波纹效应,如果某个属性的名字改变,只需要修改它的访问方法,而不是修改所有相关的代码。

    总之,在设计过程中,我们应该充分考虑该设计方案的可维护性,可扩展性,当系统需要发生变动时,我们能够通过修改最少的代码以满足新的需求。通常情况下,无论需求如何变化,其核心的要点是不会变化的,所以我们在做系统设计时要充分抓住需求的核心要点,这样我们的系统设计模型才能尽可能地适应后期不同的需求更改。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10899103/viewspace-604864/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10899103/viewspace-604864/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值