`
caoafu
  • 浏览: 13025 次
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多
<<代码大全2>>中的关于类质量的观点也值得推荐:
硬性规定:
1.类层次不宜超过三层.
2.类成员数量不宜超过7个,如果全是简单数据类型最多9个,有其它类的话限制为5个,否则需要分解成更小的类.
3.避免创建万能类
4.消除不必要的成员.
5.消除无关精要的类.
6.避免用动词命名类.

抽象:
1.类是否有一个中心目的.
2.类的命名是否表现了其中心目的.
3.类的接口是否展现了一致的抽象.
4.类的接口是否让人明白了知道该如何使用它.
5.类的接口是否足够抽象,使使用者不必顾虑它是如何进行服务的.
6.类提供的服务是否足够完整,能让其它类无须动用其内部数据.
7.是否已经尽量分解.
8.在修改类是是否维持了接口的完整性.

封装:
1.是否把类成员的可访问性降至最小.
2.是否避免暴露类中的数据成员.
3.类是否已经尽可能的对其它类隐藏了实现细节.
4.类是否不依赖其它类,它是松耦合的吗?



1.  将公共操作和域放置在超类

      显然这是继承最基本的目的,减少编码量,减少业务关注面。让子类更多关注自己的业务实现,而公共的由共同的超类去操心。


2.  不要使用受保护的域

       很多程序员其实都很喜欢“受保护的”(protected)这种作用域,特别是应用在域上,因为在这种作用域的作用下子类可以轻松的直接访问超类中相应的 域,可能也觉得这是理所当然的事情,因为既然在子类中继承了这个域而不能直接使用它还需要使用super关键字来调用超类方法去访问往往显得很别扭和难 看。但是protected机制会带来很严重的安全问题,第一,因为子类集合是无限制的,任何人都可以由一个类派生出另外一个子类,并编写代码直接访问 protected的实例域,从而破坏封装性;第二,在Java中同一个包中的所有类都可以访问protected域,而不管它是否为这个类的子类。

      所以推荐在尽可能的情况下把域设置为私有,不允许外部直接访问甚至修改。但其实很多初学者,包括一些编程老手都没办法理解和接受这种做法。我个人认为如果OO失去了封装性就好比失去了灵魂的空壳,没有了什么意义,反而变成累赘而已。


3.  使用继承实现is-a关系

      如果抛开所谓的设计思想来看,实现继承最基本的目的就是节省代码量,并且很容易就做到。但这样往往很多人会滥用继承,纯粹为了节约代码而节约代码,而没有顾及超类与子类的关系导致在实现其他相关问题的时候带来很多麻烦,反而会多写很多代码,捡了芝麻丢了西瓜。

      继承应该要遵循is-a关系,要判断是否遵循了is-a关系也有个很简单的办法,就是你念出这么一句话:“子类”是个“超类”,看是否合理。例如有一个雇员(Employee)类继承与人(Person),这个时候就有这样的关系:雇员是个人,显然是正确的。


4.  除非所有继承的方法都有意义,否则不要继承

      当子类和超类之间遵循了is-a关系,但子类从超类继承来的某些方法对于子类是没有意义的,甚至是实现错误功能的,这个时候应该取消继承关系,因为这相当的危险。或者可以选择重新审视你的设计。


5.  在覆盖方法的时候,不要改变预期的行为

       结合上面4中的观点,有些人可能会说这个很简单,把意义不同的方法在子类中重写,或者干脆什么也不做,也或者抛出一个异常不久解决了,so easy!其实这样也是违背OO思想的,应该尽量保持覆盖方法的预期行为,只可能因为各自的业务含义而改变实现方式,但是语义和行为是要保证的,就好像超 类有个方法名字叫add是用来做加法的,但是你一定要极端的在子类中重写了它,里面的代码偷偷实现了一个减法,这种做法的危险我想很容易理解。为什么说是 偷偷的,因为可能只有你知道这里是做了减法,或者说几个星期后你自己都认为这个方法实现的是一个加法运算!


6.  使用多态,而非类型信息

      很多时候需要判断当前对象的类型来执行相应不同的方法,看下面的示例代码:

1 if(x is of type 1)
2   action1(x);
3 else if(x is of type 2)
4   action2(x);

      这个时候应该去考虑action1和action2是不是表示同一个概念,如果是就应该使用多态性来处理。这个时候应该定义一个方法放置在这两个类的超类或者接口中,然后就可以调用

1 x.action();

      让语言提供的多态性自己去找应该调用那个类的方法来实现。是不是像极了某种模式:)


7.  不要过多的使用反射

       个人觉得Java拥有了反射机制简直就是太强大了,在运行时能够查看甚至修改、调用域和方法极大的提高了程序实现的灵活性和技巧性。以至于我甚至有一段时 间把Java当作JavaScript来玩(爱死JavaScript的灵活性但同样具有那么优秀的OO)。看看现在大多数流行不流行的开发框架都是基于 Java这种强大的能力来实现的,它让大家可以编写更加通用的程序,也是为什么它在系统程序(包括一些框架、工具甚至服务器等)中使用这么广泛并都作为核 心技术;但是在编写应用程序的过程中应该减少反射的使用,因为反射其实是很脆弱的,编译器很难帮助大家发现程序中的错误,任何错误都到了运行时才被发现, 并导致一些莫名其妙的异常。说起莫名其妙其实不是说反射功能不够健壮或有问题,而是出现错误后很难跟踪和排查,给开发和维护带来很大困难。

      还有一点也很重要,反射比直接调用慢,这个要时刻记住。所以应该用接口来实现回调之类的功能而不是反射。




      其实这些只是继承技巧的冰山一角而已,每个人在设计过程中都会总结出自己的经验。

      总的来说我们应该用理论来指导实践,而在实践中总结出理论!
分享到:
评论

相关推荐

    OO设计原则 -- OO设计的 DIP依赖倒置原则

    ### OO设计原则 -- OO设计的 DIP依赖倒置原则 #### 概述 在软件工程领域,特别是面向对象设计中,依赖倒置原则(Dependency Inversion Principle, DIP)是六大设计原则之一,由著名软件架构师Robert C. Martin提出...

    OO设计原则总结

    ### OO设计原则总结 #### 什么是设计原则? 设计原则是一系列指导软件开发的基本准则,遵循这些原则可以帮助开发者构建出更加灵活、易于维护和扩展的软件系统。这些原则旨在解决常见的软件设计问题,如耦合度高、...

    OO设计原则-里氏替换原则

    ### OO设计原则——里氏替换原则详解 #### 一、引言 面向对象设计原则(Object-Oriented Design Principles)是一套指导软件开发者如何更好地设计类、接口等面向对象元素的原则集合,旨在提高代码的可复用性、可...

    OO设计原则总结.doc

    ### OO设计原则精要解析 #### 封装变化:Encapsulate what varies 在软件设计中,变化是不可避免的。封装变化原则强调将系统中易变的部分与不变的部分分离,通过封装变动点,使得系统其他部分不受其影响,从而保持...

    OO设计五个原则.pdf

    《OO设计五个原则》深入探讨了面向对象设计(Object-Oriented Design,简称OO设计)中的五大核心原则,这些原则是软件工程领域公认的基石,旨在提高软件系统的稳定性、可维护性和可扩展性。本文将详细解析这五大原则...

    KWIC oo设计java源码

    "KWIC oo设计java源码" 这个标题表明我们要讨论的是一个使用面向对象(OO)设计原则来解决“关键词上下文”(KEY WORD IN CONTEXT,简称KWIC)问题的Java源代码项目。KWIC是一种文本处理技术,常用于信息检索、文本...

    通用分页实现及其OO设计探讨(2)

    本话题将深入探讨“通用分页实现及其OO设计”,结合给定的“Paginaction.jsp”文件,我们可以进一步了解在Java Web开发中如何有效地实现分页功能。 首先,我们需要理解分页的基本概念。分页是将大量数据分割成多个...

    OO设计根本的指导原则

    ### OO设计根本的指导原则 面向对象(Object-Oriented,简称OO)设计是软件工程领域内一种重要的设计理念,它通过模拟现实世界中的对象及其相互作用来构建软件系统。为了确保设计的质量,遵循一系列的设计原则至关...

    学习OO设计概念和Java中的MDI应用程序开发的项目_Java_下载.zip

    在这个项目“学习OO设计概念和Java中的MDI应用程序开发”中,我们将深入探讨面向对象(Object-Oriented, OO)设计的基本原则以及如何在Java环境中实现多文档界面(Multiple Document Interface, MDI)应用程序。...

    OO设计和伪状态模式实现的控制台五子棋游戏

    在本项目中,"OO设计和伪状态模式实现的控制台五子棋游戏"是一个用C#编程语言实现的控制台应用程序,旨在教授面向对象编程(Object-Oriented Programming, OOP)和设计模式,特别是状态模式的应用。下面将详细阐述...

    Ruby-Pundit通过OO设计和纯Ruby类可伸缩的授权系统

    总的来说,Ruby-Pundit通过引入清晰的OO设计模式,使得授权逻辑变得整洁且易于测试。它的灵活性和可扩展性使得开发者可以根据项目需求自定义权限规则,同时保持代码的整洁性和可维护性。在Ruby开发中,尤其是涉及到...

    面向对象编程,OO设计的五大原则

    OOP的核心在于其设计理念和原则,这些原则帮助开发者构建更加灵活、可扩展、易于维护的系统。在本文中,我们将详细探讨OOP设计中的五大原则:单一职责原则(Single Responsibility Principle,简称 SRP)、开放封闭...

    java oo 设计原则

    Java面向对象设计原则是软件开发中的基石,它们指导着我们编写出高质量、可维护和可扩展的代码。这些原则包括单一职责原则(SRP)、不要重复代码原则(DRY)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)以及...

    OO设计模式.ppt

    设计模式很好的教材,从面向对象的角度很好的阐述了怎么去做设计模式

    设计模式——可复用的OO软件

    设计模式——可复用的OO软件

    oo设计过程.chm

    简介明了的介绍面向对象设计方法 包括:入门.验证分析.用例简介、规划.应用的用例..

    实战OO的pdf自留备份

    这是OO设计的第一步,旨在确保软件解决方案紧密贴合用户需求。 "用例建模"是另一个核心主题,它强调从用户的角度出发定义系统功能,通过用例来描述系统应如何响应特定的用户行为。用例建模有助于识别系统的边界、...

    浅谈java中OO的概念和设计原则(必看)

    OO设计的5大原则包括单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、接口隔离原则。 * 单一职责原则:一个类应该仅有一个引起它变化的原因。 * 开放封闭原则:软件实体(类、模块、函数等等)应该可以...

Global site tag (gtag.js) - Google Analytics