低耦合与高内聚——面向对象设计原则初探

来源:互联网 发布:java定时任务管理模块 编辑:程序博客网 时间:2024/05/29 17:03

#_00

最近在学习JAVA和android开发,对OO的设计原则有了更直观的了解。

#_01

面向对象编程的核心原则之一就是Anything is Object万物皆对象,但是简单的将属性和方法封装成类并非就是OO的本意。在AiO背后隐藏的是OO的设计模式或者说是所有OO语言的共同点:低耦合和高内聚的对象。

#_02

低耦合,是指不同的类之间应尽量独立,使得代码的复用和扩展更为容易。高内聚,是指一个类实现的功能要尽量单一,但单一并不意味着应实现尽可能少的方法,而是指所有方法都围绕一个单一的功能展开。举例来说,一个名为MobilePhone的类,具有PhoneNumber电话号码属性和ContactInfo联系人属性,可以实现phone()打电话方法和message()发短信方法,它的子类SmartPhone可以增加一个installApp()安装应用的方法,这些都不违背低耦合和高内聚原则,但MobilePhone类和它的子类应尽量避免实现无关的功能,比如playMusic()方法。如果一个具体的类比如iPhone类想要实现playMusic()方法,它应该声明一个iPod接口,该接口内封装了playMusic()方法。所以,低耦合和高内聚的设计原则并不影响程序功能的实现,相反它利于软件架构设计,将不同的功能进行分割,并交由不同的对象实现。

#_03

还以iPhone类举例,试想如果iPhone的开发者Apple将所有的功能封装在了iPhone类内部,如果另一个开发者Google想要开发一个基于iPhone地理位置的导航应用,它将不得不自己写一个方法findLocationByGoogle()来获取iPhone的位置,但如果iPhone关于地理位置的功能实现来自一个独立的类LocationKit类,那么Google只需要在它的类内部实例化这个LocationKit类并调用findLocation()方法就可以获取当前的位置。#这是一个关于耦合性的例子

#_04

接着上边的例子,当Apple打算更新它的iPhone类,为iPhone增加handleAppleWatch()方法,它将不得不打开iPhone类的全部源代码,在合适的地方插入代码。或者它重写一个AppleWatchKit类,将handleAppleWatch()方法写入。这样调用这个新的方法只需要在iPhone类内部实例化这个AppleWatchKit类就可以了。也许有的人会觉得这样的差别并不大,但AppleWatch要实现的功能也许很多,iPhone可以将所有的请求通过handleAppleWatch()委托给AppleWatchKit去处理,一个专注于AppleWatch的团队因而得以集中精力开发和维护AppleWatchKit这个类。#这是一个关于内聚性的例子

#_05

在刚接触低耦合与高内聚的概念时,我曾错误的理解了耦合与内聚的含义,认为低耦合和高内聚就意味着应该尽可能将所有功能封装在一个类中,显然这有违OO的精神,这样的一个OO类,在事实上等同于面向过程的设计。

事实上,低耦合和高内聚的理想情况是,为每一个功能封装一个独立的类,然后在一个类似于App Store的地方,实例化所需要的类,完成要实现的功能。正如你所看到的,Apple并不曾开发所有的软件,而是打造了一个App Store并创造了无限可能。所以OO的精华也在于,低耦合和高内聚的设计原则为OO语言的扩展性带来了无限的可能性,使得大型软件的开发不再令人望而生畏。并日益降低了软件开发和维护的成本,并在一定程度上改善了我们所生活的这个世界。

0 0
原创粉丝点击