了解Java或C#等面向对象编程语言的的程序员比较熟悉类和对象以及OOP。

一谈起OOP,就会想起教科书式的OOP概念:封装、继承、多态。粗浅的解释封装就是对数据进行隐藏;继承就是子类继承父类(class)或接口(interface)的方法和属性,并实现代码复用;多态就是重载和重写。这样的解释仍仅仅只是面向对象的基本特征,很浅显,根本无法让人知道如何去思考和设计面向对象编程。

面向对象理解

在做面向对象编程时,我们首先应该理解面向对象。 
下面是我个人对面向对象的浅薄理解,由于自己做编程也没多久,对OOP理解有限,对设计模式更是一窍不通。

  • 抽象的理解:抽象是从众多物质中抽取共同的、本质的特征,抽象是一种概念(比如public interface或抽象基类),抽象的过程是一个比较的过程,有比较才能抽象出共有特征和本质;抽象的过程也是一个裁剪的过程,剪掉非本质的特征。从不同的角度去对事物进行抽象,能够衍生出不同的接口,这些看待或比较事物的角度也可以称作接口。
  • 一切事物都是对象,把事物的外观抽象为对象属性,事物的隐私看作为对象字段,事物的外部行为抽象为对象的公共方法,事物的内部行为看作为对象的私有方法。属性和公共方法称为接口,字段和私有方法称为本源。
  • 一切private成员或者接口和基类对象作为方法参数都实现了数据的隐藏,把接口和基类作方法参数同样实现了多态性,private成员是对象的内部行为和形态,private成员是对象的本源,private成员无法被继承。
  • 一切public成员都是接口,这里的接口就不仅仅是interface,它是一种标准和规则(比如定义的public属性),是对象表现的外部行为和形态,是对象和对象之间的通信和交互的纽带。
  • 类继承的意义不仅仅是代码复用,更大的意义是类扩展,类扩展表现为方法的重载以及子类中有的方法和属性而父类中没有的方法和属性。在一定程度上,类扩展也可以看做是一种多态,这不仅仅表现在子类重写父类的方法,还表现在子类比父类具有更多的特性,子类是父类的变体,表现出和父类相似但比父类更丰富的形态。
  • 方法的重载表现在“殊途同归”,对象做同样的事情,事情的结果相同(返回值类型),但是实现的途径不同(参数列表或方法体不同)。方法的重写表现在“青出于蓝而胜于蓝”,子类覆盖父类的方法并进行扩展,如果不是这样,重写就没有太大的意义。
  • 面向对象(OO)和面向过程(OP):面向过程是基于流程的设计和分析,一个问题的解决或功能的实现需要按照先后顺序很步骤,每个步骤可以是一个函数;而面向对象是基于抽象的设计和分析,从问题和功能中抽象出类和接口,把方法原子化,类单一化。面向对象语言中一切事物都是对象,在面向过程中,方法称之为函数或过程,面向对象中方法是对象的表现行为,面向对象是对面向过程的封装。

面向对象的原则

头五项原则是关于类设计的,它们是:

另外的六项是关于包的设计原则。在本文中,包是指一个二进制的可发布文件,比如.jar文件、或dll文件,而不是Java包或是C++的命名空间(译注3)。

头三项包原则是关于包内聚性的,它们会告诉我们该把什么划分到包中:

最后的三项原则是关于包之间的耦合性原则的,并且论述了评价系统中包结构优良与否的评判标准。

虽然一些大师们总结了这些原则,但是原则只是一种标准,我们应该效仿标准,而不是依赖标准,在实际的软件设计中,如何能方便快捷的实现需求和客户目标才是关键,过度遵循原则会使简单的问题复杂化,给自己和团队带来不少麻烦。

浅谈OPP的更多相关文章

  1. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  3. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  4. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  5. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  6. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  7. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  8. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

随机推荐

  1. three.js入门系列之材质

    一.基础网孔材料 MeshBasicMaterial 图示(光源是(0,1,0)处的点光源): 二.深度网孔材料 MeshDepthMaterial (由于只是改了材料名,代码将不重复贴出) 在这里, ...

  2. Android 你可能忽略的提高敲代码效率的方式

    Android 你可能忽略的提高敲代码效率的方式

  3. Vim技能修炼教程(3) - 语法高亮进阶

    语法高亮进阶 首先我们复习一下上节学到的三个命令: * syntax match用于定义正则表达式和规则的对应 * highlight default定义配色方案 * highlight link将正 ...

  4. vue-one_demo_music

    简单的音乐盒子 利用计算属性(监听数据),解决上一首,下一首,点击切换 <!DOCTYPE html> <html lang="en"> <head& ...

  5. grub2 设置Windows为默认启动系统

    1. 首先找到Windows的菜单menuentry.<blockquote># cat /boot/grub2/grub.cfg | grep Windows 结果: menuentry ...

  6. HDU1800 hash+去前导0

    注意一:卡map的时间,但是好好写+运气还是可以卡过,哇...求人品爆发 注意二:去前导0,毕竟‘0’也有ASCII码 #include<cstdio> #include<cstdl ...

  7. Loj 538 递推数列

    Loj 538 递推数列 出题人:这题提高难度吧.于是放在了%你赛的 \(D1T2\) . 递推式为 \(a_i=k*a_{i-1}+a_{i-2}\) , 注意到 \(k\in \mathbb{N_ ...

  8. Appium+python(1)简单的介绍环境搭建

    环境搭建其实并不难,只不过安装的东西有点多,要加的环境变量有点多. 链接:https://pan.baidu.com/s/1nwLhNIT 密码:56wn 这个压缩包里要用的都有了,只需要下载,然后安 ...

  9. 【java基础】java中String的注意点

    [java的内存模型] 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两种类型内存:堆和非堆,堆内存(Hea ...

  10. git忽略已经提交的文件【转载】

    有时候我们添加.gitignore文件之前已经提交过了文件..gitignore只能忽略那些原来没有被track的文件(自添加以后,从未 add 及 commit 过的文件),如果某些文件已经被纳入了 ...