00 – 面对对象编程 Object Oriented Programming

将每一个物品,动作,事件,程序都看作对象。并且把一个程序模块化。许多编程语言都可以实现面对对象的编程,但Java是公认的最适配这种编程方式的语言之一。Java编程中,最重要的一点就是不同的class,以及不同method的调用。而这些调用的顺序和次序则是有着不少讲究。在进行下一步记录之前我将解释一个后面会用到的名词:将每一个物品,动作,事件,程序都看作对象。并且把一个程序模块化。许多编程语言都可以实现面对对象的编程,但Java是公认的最适配这种编程方式的语言之一。Java编程中,最重要的一点就是不同的class,以及不同method的调用。而这些调用的顺序和次序则是有着不少讲究。在进行下一步记录之前我将解释一个后面会用到的名词:Actor。

在本篇文章中,Actor指于实现某个功能相关的某一部分程序

— 用生活中举例,对于招聘人才这一个举动,整个hr部门都需要为之付出,因此整个hr部门此时算作一个Actor —

在进行制作某些项目时,我们一般会遵守以下的编程原则:

原则1:SOLID

这是一个面对对象编程所使用的系列规范。SOLID原则由 Robert C. Martin 提出,并且最终成为公认的编程标准。

S: Single responsibility,每一个Actor只负责一个功能/职责。

比如一整个文件中的代码都负责实现用户能做的事。至于“一个功能”,是在每一个程序编写的时候确定的

O: Open – closed,代码不会限制添加内容时的工作,也不会被随意改变。

无论一个功能如何被编写,它的输入输出都不会受影响。添加内容时也不需要更改已有功能的实现方法

L:Liskov 替换原则,子类(child class)都是长类(parent class)。

当我们将长类(parent class)的元素用子类(child class)元素替换,程序不会报错

I:Interface 接口简洁化,以最高效的方式编写interface。

每一个interface有且只有相关class中重复功能的函数

D:Dependency,程序的核心层次不会依赖外部层次 (层次的划分参见原则2)。

先编写被依赖的部分,再编写依赖它的部分,依赖永远是单向的

原则2:干净结构 Clean Architecture

干净架构只是各种编程框架的一种,在面向对象编程中较为实用。它是由Robert C. Martin所提出的提高软件开发生产力的一种著名架构。

遵循 “干净结构” 原则的程序包含如下四个层次,同一个层次的 Actors 的地位是相同的。低层的部分会依赖高层的程序,而核心层的程序不会依赖外层程序。下面是一个干净架构的代码层次,由核心到外围进行排列:

Entity

程序的核心层。它一般是类的形式,每一个entity包含所有程序运行中所需要调用的某方面信息。例如:假设我们要为一个学校编写一个管理程序,那每一个学生,老师或员工都是一个Entity,在entity中,我们存储单个目标的信息,比如一个类型为学生的变量A中,可以存储学生A的名字,班级等等。在entity中,我们有条理地存放各种独立实体的信息,以及对应的,entity中只有读取函数或/及仅在实体内部进行改变的函数(i.e. 获取或用来改变某个信息的工具函数)。

Use Case

程序的次核心层,仅依赖于Entity。它负责所有修改entity信息的功能,且负责整个程序的底层运行。就像在人体中,当我们想抬起手臂,需要肱二头肌,肱三头肌,三角肌前束共同的发力。此时你的神经系统就是 UseCase,控制二头肌,三头肌,三角肌前束这三个 Entity 进行收缩的动作。Use Case 部分负责拆解次外围层程序所发出的指令,并把具体操作执行在每一个entity上。同时,Use Case也负责储存所有entity。

GateWays / Presenters / Controllers

这一层仍属于你的软件内部,它是整个程序的总指挥官。它负责告诉电脑你的软件在做什么,以及让电脑告诉你的程序你想做什么。

GateWay 接口:

接口负责软件与外界的联系。像我们平常,很多应用都有分享给微信好友的功能。这就是通过调用微信发送信息的接口来实现的。同样,数据库,外部存储文件这些不属于程序本身的部分都需要通过接口来调用。这样的话,无论第三方软件如何编写,都不会过多影响到我们主程序的运行。读取/存储的功能一般也由接口实现。总的来说,接口负责将外部数据导入程序内存,以及将程序内存中的数据送给第三方的文件或程序。

Presenter 展示器:

展示器不同于真正的UI,它只负责把程序内部的各种数据,信息结合成我们希望人们看到的内容。比如当程序中一个类型为Student的变量,名叫A,他的英语final分数是99分,在程序中我们可能会把这些信息通过不同local variable来表示,而presenter负责将它门合并成同一句话,比如:“学生A的英语final成绩为99分。” 不过这些信息更多都以str形式储存,保证无论UI的css,xml或者php怎么改,输出的内容都是一致的。

Controller 控制器:

控制器相当于人的大脑。当我们想要做某一个动作,大脑将会分析那个动作所需要依靠的各个器官和肌肉,从而通过神经调用人体各部位进行协同工作。比如,当我们想要吃一碗饭,我们的大脑会需要让手臂拿起碗筷,并让面部张嘴咀嚼等等。在程序中,控制器Controller会负责程序某一部分功能需要各部分协同工作时的工作分配。注意,controller不同于Use Case。Use case是程序的一个组件的工作分配机制,而Controller负责各个组件的合作,即Controller负责控制不同Use Case,而每一个Use Case负责控制各自部门的 Entities。

UI/Database / Devices / Web / External Interfaces

最外层则是第三方软件支持的功能。我们应尽可能让我们的软件不依赖第三方支持(第三方软件更新、更换后我们不更改核心程序程序仍可以工作)

UI:

UI是User Interface的简称。这是用户与程序进行互动的主要方式之一。程序会在UI上显示用户所可以进行的操作以及需要的信息,而用户可以通过UI操作程序完成特定的指令。UI作为架构的最外一层是为了保证程序的核心功能不会因为UI的更新而需要做出任何更改。UI等最外层的部分则会依赖于程序的控制器,对各部分的控制器发出指令。

Database:

常说的数据库等数据存储工具。存储用户信息等等。常用的数据库有MySQL,SQLite等等。一般与gateway结合,以完成软件的读取/写入功能。

Device:

各种设备的简称。你的手机,其他服务器,任何你能想到的设备都算。

Web:

网页,网络等等。 你可以通过Web Page将内容呈现在网页上。

External Interface:

外部接口代表着外部的链接。就像插座一样。编写外部接口以方便其他工具/软件/程序与你的进行互动。

Scroll to Top