关于面向对象编程的一点思考

标签: 面向对象 编程 思考 | 发表时间:2015-05-17 16:21 | 作者:liao_jian
出处:http://blog.csdn.net

面向对象编程的 对象有两种,第一种是 现实世界中的对象在软件中的表示(暗含了类间的一部分关系,如包含等),另一种是 为了表示现实世界中对象之间相互作用而虚构起来的类(暗含了类间的另一部分关系,如协作等)。面向对象的思维有 两种突出表现形式,第一种是 专注于对象本身的活动,尽量让对象本身的活动限制在自身,当然那些本来就需要其他对象协助的工作是决不能让一个类自身完全负责的,这种表现形式得到的是高内聚、低内聚性;第二种表现形式是 面向契约编程,在第一种表现形式中还要求不能只关注于某个具体类本身的活动,需要的是进行抽象,把那些公共的东西都抽离出来,放到上一层类中作为契约,而让后继的类实现这些契约,或加入一些更加具体的契约让其后继的类实现,解决一般性的问题总是比解决某个具体问题更容易。面向契约编程中,许多动作都在高层完成,可以避免为许多低层类做同样的操作。理解了面向契约编程后,不管是JAVA中的接口、C++中的虚基类或模板,使用的原则都是一样的,最重要(但也最难)的事情就是建立合适的契约(抽象的本质)。
面向对象的方式在 短期内是看不到好处的,甚至还会使实现功能的时间变长(实际中许多项目有的时候实现功能是优先级最高的事情),这是因为各个类自成一体,需要维护他们之间的交互,另外为了维护契约,需要做大量与功能无关的工作,并且如果事先没有做好抽象,契约建立得不合适,后面往往面临着改动契约,改动契约的伤害是巨大的,这意味着依赖于这些契约的实际操作很可能需要变化。另一方面,就算是在高层对对象进行操作,但是每一个操作的实际步骤还是需要一行代码一行代码地敲出来。基于这两方面的考虑,所以面向对象的编程方式短期内不会得到好处。但是从长远的角度来看呢,假设契约建立是合适的,许多可以共享的功能都已经以合适的类实现,那么复用就会变得容易很多,可以直接复用或写一个外覆类或Adapter之类的东西就够了,应对新添加的特殊情况也容易许多,写一个针对这种特殊情况的子类就好了,修改很小,编译变得更快。
面向对象编程的方式是一把双刃剑, 好的抽象可以节省工程的整体时间,不好的抽象会更加浪费工程的时间。还有就是基于契约的编程方式意味着按规矩办事,所以到了后期有的操作不得不在很别扭的方式下实现,比如,本来有一个可以直接利用的类,但是为了符合契约,却不得不多写一个外覆类或Adapter等。好的抽象来源于好的需求分析, 好的需求分析不是具体而完备的,而是对高层的,具有重大影响的那些需求的全面分析。 好的需求分析只能经验中得来——从自己的经验和别人的——除此之外别无他法

作者:liao_jian 发表于2015/5/17 8:21:56 原文链接
阅读:48 评论:0 查看评论

相关 [面向对象 编程 思考] 推荐:

关于面向对象编程的一点思考

- - CSDN博客推荐文章
面向对象编程的 对象有两种,第一种是 现实世界中的对象在软件中的表示(暗含了类间的一部分关系,如包含等),另一种是 为了表示现实世界中对象之间相互作用而虚构起来的类(暗含了类间的另一部分关系,如协作等). 面向契约编程中,许多动作都在高层完成,可以避免为许多低层类做同样的操作. 理解了面向契约编程后,不管是JAVA中的接口、C++中的虚基类或模板,使用的原则都是一样的,最重要(但也最难)的事情就是建立合适的契约(抽象的本质).

拥抱原型面向对象编程

- - 博客 - 伯乐在线
来源: IBM DeveloperWorks. 简介: JavaScript 是最低级的 Web 编程接口,随处可见. 随着 Web 日益成为日常生活的一部分,JavaScript 也开始变得备受关注. JavaScript 是一个经常遭到误解的语言,被认为是一种玩具语言或者一种 “不成熟的 Java™ 语言”.

如此理解面向对象编程

- - 酷壳 - CoolShell.cn
从Rob Pike 的 Google+上的一个推看到了一篇叫《 Understanding Object Oriented Programming》的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评论. 先看这篇教程是怎么来讲述OOP的. 它先给了下面这个问题,这个问题需要输出一段关于操作系统的文字:假设Unix很不错,Windows很差.

面向对象的 JavaScript 编程及其 Scope 处理

- zhibin - IBM developerWorks 中国 : Web development : Articles,Tutorials
在面向对象的 JavaScript 编程中,我们常常会将一些数据结构和操作封装成对象以达到继承和重用的目的. 然而层层封装和继承再加上 JavaScript 中特殊关键字 this 的使用,使得 JavaScript 当前运行 Context 看起来非常的混乱. 很多 developer 为了获取运行时正确的 Context,常常不得已将 function 或者 Object 声明在全局 Global Context 中.

面向对象编程的五大原则

- - 非技术 - ITeye博客
       高层的实现不应该依赖底层,(父类可以替换掉任何子类),具体说就是我们要针对接口抽象来编程,不要针对实现来编程,这样程序才能解耦. 一、“开-闭”原则(Open-Closed Principle,OCP). 1.1 “开-闭”原则的定义及优点. 1)定义:一个软件实体应当对扩展开放,对修改关闭( Software entities should be open for extension,but closed for modification.).

卡内基梅隆大学CS新生不再学习面向对象编程

- sdyy1990 - Solidot
卡内基梅隆大学教授Robert Harper在博客上称,该校计算机科学系从大一新生课程中删除了面向对象编程. 他说,面向对象编程从入门课程中完全取消了,因为O-O的性质是反模块化和反并行的,不适合进入现代计算机科学教学课程.

面向对象的Shell脚本

- jejer - 酷壳 - CoolShell.cn
还记得以前那个用算素数的正则表达式吗. 编程这个世界太有趣了,总是能看到一些即别出心裁的东西. 你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中. 不要以为这不可能,这不,我在网上又看到了一个把Shell脚本整成面向对象的东西. Shell本来是不支持的,需要自己做点东西,能搞出这个事事的人真的是hacker啊.

前端开发之面向对象

- - 新浪UED
Javascript 面向对象. 实例讲解 (PADMAIL项目UI组件设计与实现). 【一】 面向对象的基本概念. 面向对象的英文全称叫做Object Oriented,简称OO. OO其实包括OOA(Object Oriented. Analysis,面向对象分析)、OOD(Object Oriented Design,面向对象设计)和OOP(Object.

关于Java并发编程的总结和思考

- - ImportNew
并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机)分开. 这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同工作). 做过Java Web开发的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用单实例多线程的工作模式,Servlet容器为你处理了并发问题.

Android内存泄漏思考 - 编程学习网

- -
Android内存泄漏是一个经常要遇到的问题,程序在内存泄漏的时候很容易导致OOM的发生. 那么如何查找内存泄漏和避免内存泄漏就是需要知晓的一个问题,首先我们需要知道一些基础知识. 强引用: 强引用是Java中最普通的引用,随意创建一个对象然后在其他的地方引用一下,就是强引用,强引用的对象Java宁愿OOM也不会回收他.