面向对象编程

Posted by Young Ken on 2017-09-29

面向对象思想

为什么要面向对象?

面向对象编程思想在20世纪60年代产生,直到20世纪80年代才得到关注。第一个面向对象的语言是Simula 67语言,在1967年5月20日发布,已经有对象,类,继承的概念。然而面向对象被关注的是Smalltalk(被公认为历史上第二个面向对象的程序设计语言)语言。

语言和思维

我们使用语言直接影响我们观察世界的方式,这不仅仅适合自然语言,也适合人造语言,计算机语言。

爱斯基摩人和雪

有两种关于语言的论述,Linguistic relativity(语言相关论)Linguistic determinism(语言决定论)

不同语言在结构上的差异(语言学特征)是伴随着非语言学的认知上的差异的,也就是说语言是对认知过程有所影响的。一个栗子就是彩虹的颜色啦。一个人认为彩虹有几个颜色,事实上是由他的母语有那些基本颜色的词汇决定的。

而后者其实差不多意思,只是表述更加绝(ba)对(dao)得多得多——语言(的结构)极大程度上地影响着,乃至决定了一个人的世界观。举个栗子,根据这个理论,因纽特人(爱斯基摩人)对于雪的认识就要比我们高到不知道哪里去,因为人家对于不同状态的雪都有全然不同的名字,人家的世界观里落雪、融雪、结冰的雪、风吹起来的飞雪都是完全不一样的东西。换而言之,因为不同的词汇,决定我们和住冰窟的他们不同的世界观(至少对于雪这个事物截然不同的认识)。

Universalism(语言普遍论)派就表示都是胡说八道,人类的认知是共同的,根本就没有什么独属于某一语言或者某一文化的概念,而概念在认知时是先行于语言的,因而语言和文化对认知过程就没啥关系了。还是用雪做栗子好了,虽然我们对不同状态的雪没有专属的名词,但不代表我们无法认知到不同形态的雪,我们还是可以加一个定语来具体描述一下不同的雪。

https://www.zhihu.com/question/27797363

丘奇猜想和沃夫假设

丘奇猜想:任何一种具有明确步骤的计算都可以通过图灵机来实现。

沃夫假设:存在这样一种情况,某些情况用一种语言表达,却不能用另一种语言表达。

这样计算机能运行世界上有明确步骤的所有流程。

软件正常的设计流程

了解需求

我们从产品经理那里了解需求。

抽象

抽象是指对一个过程或者一件制品的某些细节有目的的隐藏,以便把其他方面、细节或者结构表达的更加清楚。

我们的大脑有有意识的隐藏了一些细节,这样能把问题集中在主要的特征上。

信息隐藏是指在抽象的表现开发过程中有目的的忽略细节。

编码

此次省略一万字

面向对象设计原则

为什么要学习面向对象设计原则?

单一职责原则(Single Responsibility Principle) SRP

单一职责就是一个类负责一项职责.就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。

通俗点说就是一个类就干一类事情。

这个链接很重要 : http://www.jdon.com/designpatterns/the-single-responsibility-principle.html(不展开说)

开闭原则(Open Closed Principle) OCP

软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。

是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应爱修改原有代码来实现变化。

里氏替换原则(Liskov Substitution Principle) LSP

派生类(子类)对象能够替换其基类(超类)对象被使用。

任何基类可以出现的地方,子类也可以出现。

判断继承关系(is-A)是一个,这个是噩梦的开始。

接口隔离原则

其一是不应该强行要求客户端依赖于它们不用的接口;其二是类之间的依赖应该建立在最小的接口上面。

简单点说,客户端需要什么功能,就提供什么接口,对于客户端不需要的接口不应该强行要求其依赖;类之间的依赖应该建立在最小的接口上面,这里最小的粒度取决于单一职责原则的划分。

依赖倒置原则

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。

核心思想就是面向接口编程