`
花的世界
  • 浏览: 9217 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

面向对象思想很宽泛

OOA 
阅读更多
从我们最初接触面向对象思想的时候,我想我们接触到的第一个概念应该就是“类”,我们一直在讨论诸如如何设计类、如何实现类等高深的问题,但是我们有没有思索过到底什么叫做“类”,类的本质是什么?。按照大多数的面向对象的书籍中的介绍来看,类就是一个数据结构,封装了数据和操作,对于这样的答案,我估计大家都不会满意。
    那到底什么是类呢?在讨论这个问题之前,我们先探讨一下类的由来。“类”在英语对应的单词是“Class”,如果大家翻一翻英语词典就可以查到“Class”的原意是指“种类、把...分类(或分等级)”。Class的概念最早应该是从分类学来的,意思是把对象进行归类(说的可能有些不太准确,欢迎那位高人指正),例如生物学上会根据某一个标准将生物分为动物和植物两大类,然后再根据其它的一些标准将动物又分为鱼类、爬行动物类、两栖动物类等不同的种类,如下图所示:

    说到这里,可能大家会欢呼:原来面向对象的类就是分类,太好了!我最擅长这个了!别高兴的太早,谁知道面向对象的分类标准是什么吗?是生物学的标准,还是能不能爬树的标准?不同的标准,导致分类的结果完全不同,如下图所示:

    假设现在需要要写一个弹涂鱼的类(又名虾虎鱼,英文名为Goby,一种可以爬上陆地并且会上树的鱼类,据说味道极其鲜美,有海上人参之说) ,怎么写?是不是太容易了,看下面的代码,分分钟就搞定了:
1 '鱼
2 Public Class Fish
3
4 End Class
5
6 '可爬树的鱼
7 Public Class ClimbableFish
8     Inherits Fish
9
10 End Class
11
12 '弹涂鱼
13 Public Class Goby
14     Inherits ClimbableFish
15
16 End Class
    打完收功,貌似很完美的解决问题,但是这个时候又添加了一个分类标准,能吃的鱼和不能吃的鱼(鲨鱼能吃,俺吃过,味道不咋地,在这里假设鲨鱼不能吃),又该怎么办,Stupid,再写一个“EatableFish”类不就得了,让可爱的弹涂鱼从可以吃的鱼派生,我最喜欢能吃的鱼了!且慢!动手之前我想搞清楚一个问题:EatableFish从那个类派生?从ClimbableFish类派生?难道可以吃的鱼都是会爬树的鱼?从Fish派生,那么是不是说会爬树的鱼都不能吃?这个时候是不是该咒骂微软为什么不在.NET中支持多重继承?算了,还是转投Java阵营算了。旁边的一位兄弟弱弱的来了一句:好像Java也不支持多重继承吧。怎么办?难道我们就没有办法解决这个问题了吗?
    貌似用分类学的搞法搞不定面向对象的类耶,我们错了吗?但是很多教科书上面就是这么说的类的继承是“Is A”(是一个)的关系呀,弹涂鱼是“Is A”能吃的鱼、弹涂鱼“Is A”能爬树的鱼,念起来蛮通顺的嘛。错了!我们都被教科书给误导了!面向对象关注什么?关注的是对象的行为,面向对象是使用行为来对对象进行分类的!在面向对象中派生类为什么能够替换基类(替换原则),不是因为派生类是一个基类,而是因为派生类具有与基类一致的行为,在派生类与基类的行为不一致的情况下派生类仍然是一个基类(如果有人敢否认这个,大家说怎么办?旁边有人喊道:砍死他!),但是这个时候派生类消减了基类的行为,违背了替换原则,这也是恶心设计的由来。所以说,对于面向对象而言我们要关注“Act As”,用“Act As”的标准来对对象进行归类,至于什么“Is A”之类的伪标准统统扔到它姥姥家去。
    旁边有人不干了:你跟我说说属性是什么动作!对呀,属性是个什么动作呢?那么请有如此疑问的朋友仔细的考虑一下,是不是可以将属性考虑为GetXXX和SetXXX的两个方法,至于说字段怎么怎么地的某些兄弟俺就不多说了,回去自个好好想想吧,有些东西是属于开发平台为我们做了很多的工作,只不过我们不知道而已。
   好,问题到这里已经有些眉目了,我们该讨论如何使用“Act As”来对对象进行分类了。
   高手出招了,代码如下:
1 //可爱的小鱼接口
2 public interface IFish
3 {
4 }
5
6 //可爱的爬树接口
7 public interface IClimbable
8 {
9 }
10
11 //可以吃接口
12 public interface IEatable
13 {
14 }
15
16 //弹涂鱼出场了
17 //我要扮演鱼
18 //我要扮演爬树高手
19 //我要扮演可以吃的美味,貌似没有人愿意扮演这个
20 public class Goby : IFish, IClimbable, IEatable
21 {
22 }
    高手!请问我需要怎样表演才能扮演成一条鱼呢?高手愕然。
    看来我们的高手还是没有摆脱“Is A”的荼毒呀!我们不要鱼!我们要的是行为!行为由什么决定的呢?由要用你这个类的地方期望要的行为来决定的,例如我需要一个能够提供游泳行为的对象,你就可以抽象"ISwimable"这个动作(这个单词可能不对),然后寻求实现这个动作的对象就可以了(接口倒置原则)。
    有些朋友可能会有一些疑问,既然是动作,那么动作之间怎么会有继承呢(接口的继承)?
1 //我是一个数据提供源
2 public interface IDataSource : IDisposable
3 {
4 }
5
    仔细想想,这个是继承吗?是“Is A”吗?不是!不知道大家玩过拳皇或者其它的格斗游戏没有,要知道分别连续按键是可以组合出一个大招的,在某些情况下,对象的使用者或者理论一点的说法消费者,需要是对象同时提供上述的两种行为,不过分吧。软件设计的时候往往就是这个地方出问题,如果没有分清楚的话,很有可能把本应该拆分的动作当作一套组合拳给打了(接口隔离原则),这也是混乱的开始,重构的原因。
分享到:
OOA
评论

相关推荐

    面向对象分析与设计-需求开发

    面向对象方法论的核心思想是以对象为核心,通过对对象的行为、属性以及相互之间的交互来进行软件的分析和设计。面向对象分析与设计主要包括以下几个阶段: 1. **需求获取**:了解和收集用户的需求。 2. **分析**:...

    面向对象的设计原则详解

    面向对象设计原则是软件开发中的核心指导思想,它们旨在提高代码的可维护性、可扩展性和可重用性。在面向对象设计(OOD)中,遵循这些原则可以帮助我们构建更加稳定、灵活的系统。以下是对这些原则的详细解释: 1. ...

    面向对象设计原则

    面向对象设计原则是软件开发中的一种重要指导思想,它们旨在提高代码的灵活性、可维护性和可扩展性。这些原则是经过长期实践总结出的最佳实践,适用于各种面向对象编程语言。以下将详细介绍其中的一些核心原则: 1....

    面向对象设计/编程的四大法则

    面向对象设计和编程的四大法则,是软件开发中面向对象思想的重要指导原则,旨在提高代码的灵活性、可维护性和可扩展性。以下是这四个法则的详细解释: 1. 优先使用组合(对象组合)而非继承(类继承) 组合是通过...

    编程思想.docx

    本文将详细阐述四种主要的编程思想:面向过程(POP)、面向对象(OOP)、面向切面(AOP)以及面向服务(SOA),并深入探讨面向对象编程的三大特性以及设计原则。 首先,面向过程编程(POP)是最早出现的编程范式,...

    PHP面向对象五大原则之接口隔离原则(ISP)详解

    面向对象编程中,接口隔离原则(ISP)是五大设计原则之一,它建议不应该强迫客户端依赖于它们不用的接口。在PHP中实现ISP,可以避免不必要的依赖,提高代码的可维护性和灵活性。下面详细说明接口隔离原则的概念、...

    软件工程思想

    书中介绍了结构化设计和面向对象设计的思想,这两种设计方法分别代表了传统和现代编程的典型范式。结构化设计强调模块化和自顶向下的分解,有助于提高代码的可读性和可维护性;而面向对象设计则更注重数据和行为的...

    软件工程与软件架构风格.pptx

    **面向对象编程的基本思想** 面向对象编程(Object-Oriented Programming, OOP)是一种软件开发方法,其核心思想是将现实世界的事物抽象成对象,通过对象之间的交互来完成任务。面向对象编程的主要特征包括封装、...

    Essential C++中文版.pdf

    书中包含了原作者对C++的深刻理解和丰富的教学经验,Lippman通过这本书向读者传达了C++语言的基本概念和面向对象编程(OOP)的核心思想。 本书的翻译者侯捷在译序中提到,Lippman的《C++ Primer》因其详尽和全面而...

    C++心得参考

    4. **面向对象的广义理解**:面向对象不仅是C++的特色,也是现代软件工程的重要组成部分,应从更宽泛的角度理解其价值。 #### 六、总结与反思 1. **持续改进**:每次遇到难题,都是一次自我提升的机会。分析错误,...

    兰州大学java实验7

    1. 熟练运用Java面向对象编程思想。 2. 掌握异常处理机制,理解何时以及如何使用try-catch-finally结构。 3. 熟悉文件I/O操作,包括文件的读写、复制等操作。 实验内容: 在这个实验中,你可能会被要求设计一个程序...

    C_面试题大全pdf.pdf

    - C#从C++中吸取了面向对象的思想和模板编程的支持。 - 从Java中吸取了自动内存管理和平台无关性的优点。 #### 4. C#对内存直接操作的能力 - **能力**: - C#默认不允许直接操作内存,但可以通过unsafe关键字...

    软件工程试题及答案.doc

    4. 面向对象的分析方法:主要建立对象模型、动态模型和功能模型。选项D正确表示了这三类模型,而其他选项的组合不正确。 5. E-R模型:在数据库设计中,E-R模型包含实体、联系和属性三个基本成分。选项C给出了正确的...

    On-Lisp-中文完整版

    Common Lisp在学术界和工业界都有一定的应用,因其强大的表达能力、丰富多样的数据类型以及面向对象的编程特性而受到好评。 在学习《On Lisp》之前,读者应该已经对Lisp有所了解,至少熟悉其基本语法和编程风格。该...

    软件设计原则.pptx

    这些设计原则在Java等面向对象编程语言中尤其重要,因为它们是构建可扩展和可维护软件的基础。在实际项目中,例如生鲜供应链解决方案,我们可以通过合理应用这些原则来设计更高效、更灵活的架构。例如,当需要增加新...

    阿里巴巴Java编程规范.pdf

    面向对象编程(OOP)是Java开发的核心思想之一,阿里巴巴Java编程规范对此有明确的要求: 1. **封装**:保护数据的私有性,通过提供公共的getter和setter方法来访问属性。 2. **继承**:合理使用继承,避免过度继承,...

    PHP依赖倒置(Dependency Injection)代码实例

    依赖倒置原则是面向对象设计(SOLID)原则之一,其核心思想是高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。该原则通过减少模块之间的耦合,以提高系统的可维护性和可...

Global site tag (gtag.js) - Google Analytics