写在前面
本文凭笔者个人理解列出了一些OO多线程之前可能需要掌握的基本知识,其中面向对象方法论一不小心写长了,导致很多干货不方便找,所以在这里先列出:
类别 | url |
---|---|
设计模式介绍 | 设计模式-全解析, 设计模式-简单教程 |
思维导图 | Mind Map |
刷题网站 | LeetCode, codility, NowCoder |
好项目 | TheAlgorithmsInJava, JavaGuide |
作图 | ProcessOn, Visio |
怎么设计架构?
设计模式
软件工程经过十几年的发展,对实际工程中普遍问题的实践方式已经有了一套较为完善成熟的理论体系。思考组合这些设计模式有助于代码架构的设计。
参考资料
面向对象设计方法论
运用面向对象的思想设计工程相对于某些其他编程范式(元编程,函数式编程等)而言是相对简单的,但对于编程初学者而言如何运用这一工具也是有一定难度的,这里给出一些学习运用面向对象思想的方法。
- 实践
面向对象有不少概念,这些概念可能需要在代码实践中才能有更好的理解,在反复试错后才能收获更好的实践方法。 - 具体问题导向
但如果你在运用这些概念时感到十分的无力,也许可以尝试将这种无力感落实到具体的问题上,比如提出类似 “怎么从‘图’的角度理解‘接口’这一概念?” 这样的问题,尝试把抽象的概念画成“图”来理解(图可以是流程图,结构图,复合函数图等)。 - 参考方法论
这里给出一套简单的问题导向面向对象设计方法论。- 明确问题域
拿到一份需求时需要逐步明确需求需要解决哪些问题。在UML中相当于构建Use Case。 - 归纳问题域中的实体
实体一般指客观存在的不可区分的事和物。这里的实体指在解决问题的过程中可能会遇到的事物。
以电梯问题为例:电梯、电梯运动部件、电梯向上运动、电梯向下运动、电梯停止、电梯调度器、电梯控制按钮、电梯指示部件、楼层、乘客、乘客按下按钮、乘客上电梯、行为诡异的乘客、 行为诡异的乘客在最高层尝试找到向上的按钮按下 等就是解决问题中可能遇到的实体。这里可以尝试简单用Mind Map 一方面列出了所有的实体,另一方面也在一定程度上表示了实体之间的依赖关系,为后续步骤做准备。 - 画出实体之间的联系图
实体之间一般存在一定的联系,比如电梯和电梯向上运动是存在联系的。在问题域内,尝试画出实体之间的关系。进一步,尝试将这些联系做一个简单的归纳,归纳的方法有很多种,比较常见的是UML类图的关系分类法。
或者使用简单的“继承,属于,执行和使用”关系分类法:- 一个实体可能是另一个实体的具体的某个一子类别(继承),如:行为诡异的乘客是乘客的一种子类别;
- 一个实体可能属于另一个实体(属于),如:电梯调度器是属于电梯的一部分;
- 一个实体可以执行另一个实体(执行),如:电梯和电梯向上运动;
- 一个实体在执行另一个实体的过程中可能使用到另一个实体(使用),如:电梯在向上的过程中会用到电梯运动部件。
- 类的构建
这里以“继承,属于,执行和使用”关系分类法画出的关系图为基础给出一些常见的归纳方法:- 实体有事有物,一般而言被物体执行的事可以归纳为该物的方法属性,并将该物归纳为一个类。
- 与多个实体有“属于”关系的实体可以归纳为类。
- 只与一个实体(A)有联系的实体(a)可以归纳为另一个实体(A)的属性。
- 优化准备
- 在本项目范围内,将类以继承关系组织在一起,将形成一个森林,找出深度较深,枝叶较多的树,合理安排属性,如:找出有共同属性(a)的节点所构成的尽量大的子树,消去子节点的属性(a),保留父节点的属性(a),等等。
注意:尽可能保持子类自身构成简单,合理使用父类静态方法,有助于提高代码的运行效率 - 对于“使用”的关系,可以规范“使用”的规则:对于对不同实体的同一使用,可以规范设计出接口,简化代码构建复杂度;关于“使用”的设计要注意不要过度耦合,尝试规定“使用”的需求方的集体需求的接口后构造“使用”的供给方的具体实现,或者泛化设计“使用”的供给方的通用接口构造“使用”的需求方对这一接口的使用。简言之,固定一方实现另一方,不要再实现另一方的过程中返回修改已实现一方的接口定义,这样往往会使代码变得耦合,不通用。
- 尽量使用Java规范好的模式构造代码,JVM解释器会针对规范的代码使用进行有针对性的优化,具体做法包括并不限于尽量使用接口和继承等构建法。
- 在本项目范围内,将类以继承关系组织在一起,将形成一个森林,找出深度较深,枝叶较多的树,合理安排属性,如:找出有共同属性(a)的节点所构成的尽量大的子树,消去子节点的属性(a),保留父节点的属性(a),等等。
- 明确问题域
怎么写出具体的代码?
这是一个与实践密切相关的问题,囿于精力,这里不做太多整理归纳,仅列出几点要点以供参考。
前车之鉴
- 刷题网站:LeetCode, codility, NowCoder.
- Java官方库:string, list, vector
- 好的实现(强烈推荐看一看):TheAlgorithmsInJava, JavaGuide
- 同学的代码: Neo
尽量使用Java官方库
JVM会有针对性优化。
关键节点分析
分析代码在运行流程中被执行最多的关键节点,保持关键节点部分代码逻辑尽量精简,把代码运行流转发出去。
Index索引思想
这是大数据时代常用的处理问题的模式:key to value
。在Java中的很多代码实现逻辑可以用HashMap<string, Object>
的数据结构来辅助加速。比如swtich-case
的逻辑可以使用HashMap<string, MethodObject>
来实现,通过string
的key
来查找得到处理具体问题的MethodObject
,传入相关参数,进入问题处理逻辑,完成代码执行流的分发。
多线程锁机制
待续