了解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. 用两个stack实现一个队列

    class Queue { stack<int> input, output; public: void push(int x) { input.push(x); } void pop(v ...

  2. 现在很火的数据科学到底是什么?你对做DATA SCIENTIST感兴趣吗?

    转自– Warald (Email: iamxiaoning@gmail.com) 博客: http://www.1point3acres.com,微博:http://www.weibo.com/wa ...

  3. Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录

    Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录 这里先简单的贴下常用的方法: File.separator //当前系统文件分隔符 File.pathSeparator // ...

  4. tensorflow图像基本处理

    tensorflow库提供的专门的图片处理库,以下只是部分示例,更多函数请参照源码'\tensorflow_api\v1\image__init__.py' 加载图像 方式1: 使用tf.gfile. ...

  5. SpringMVC和Freemarker整合,带自定义标签的使用方法

    SpringMVC和Freemarker整合,带自定义标签的使用方法. [参考来源:http://www.360doc.com/content/14/1225/14/1007797_435663342 ...

  6. sublime python运行插件

    Tools->New plugin 粘贴下面代码,在插件目录新建文件夹,保存 import sublime, sublime_plugin import os class ExampleComm ...

  7. UVA11401 Triangle Counting

    题意 输入\(n\),输出有多少种方法可以从\(1,2,3,\dots,n\)中选出3个不同的整数,使得以他们为三边长可以组成三角形. \(n \leq 10^6\) 分析 参照刘汝佳的题解. 按最大 ...

  8. 从数据库导出数据到excel之List<map>导出

    说明:很多时候取出来的数据是封装为List<Map<String,Object>>,可以直接导出excel表格 项目说明就在 “上一篇” 直接上代码(数据层和业务层不用说了,查 ...

  9. caddy server 了解

    Caddy 是一个Go写的服务器软件,官方的宣传语“The HTTP/2 web server with automatic HTTPS”以及“Serve The Web Like It's 2016 ...

  10. Python 函数 -getattr()

    getattr(object, name[, default]) getatt() 函数用于返回一个对象属性值.object 对象.name 字符串,对象属性.object 默认返回值,如果不提供该参 ...