1. 说明
前边我们讲完了自定义View的知识后,那么从这节课开始就开始我们的系统架构部分的知识,首先第一节课我们先看下面向对象六大基本原则。
在系统架构部分,我们采用的是 理论+实践(重点),其实我们所有的人都是可以过的很好的,一定要做到学习是不能停的,并且在搭架构的时候,一定要利他。一定要为对方考虑,要让对方用的很方便,人家用你框架的时候不要修改很多。
2. 要点
假设你项目中的代码已经写完了,这个时候如果需求更改了,你需要去修改代码才能达到现有的需求,如果你需要修改的代码特别多,那么就证明你的代码是有问题的。
3. 面向对象六大基本原则
3.1 单一职责原则:Single Responsibility Principle
就一个类而言,应该有且仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数、数据的封装。
举个例子:
如果你网络请求用的是封装的OKHttp,那么在封装的这个网络请求的类中就只去单纯的去写你请求网络的代码,其余的像缓存、加载图片之类的就不要在这个类中写了,一定要尽量的保证你每一个类中功能单一,就只是去处理一个逻辑或者不要处理太多的逻辑,总之不要把所有的代码写到一堆,一定要保证代码清晰。
就比如自己 出行项目一开始在MainActivity中,把所有的逻辑全部写到了MainActivity中,只是通过显示与隐藏来处理逻辑,这样的做法肯定是不可取的,一定要记住,MainActivity是一个程序的主Activity,在MainActivity中不要处理过多的逻辑,除非一些必须要写的代码就写到里边,否则在MainActivity中一定要尽量少的去处理逻辑,在一开始一定要根据项目的需求,有些功能是需要写到一起的,有些是需要分开的,不能写在一起,在前期一定要保证每个类的职责是什么、作用是什么、并且要确保每个类中的逻辑代码不要太多。
3.2 开闭原则:Open Close Principle
软件中的对象(类、模块、函数)对于扩展是开放的,对于修改是关闭的。
当需求变化时,应该通过扩展的方式实现变化,而不是通过修改已有的代码来实现。
比如你现在的项目已经做了一版需求了,代码也已经写好了,这个时候之前的需求可能有一些变动,需要修改代码,这个时候就要求你来修改之前的代码来重新实现新需求的功能。根据开闭原则来讲,你在写第一版本需求代码时,就应该把各个模块、各个部分代码都分开写,千万不要把各种逻辑、各种判断、各种跳转都写到同一个类中,这样看起来代码特别乱,逻辑也不清晰,别人看你的代码时也会比较乱,不知道从哪里看起。
所以就要求我们:在一开始写代码时,就理清思路,分析好逻辑,把该抽取的工具类、方法都抽取出来,每一个类中就写属于该类中的逻辑,属于其他类中的逻辑就不要写在这个类中,这样其他人看代码时也会觉得思路特别清新,代码逻辑非常简单。
举个例子:
比如说首页:首页一般就不要做过多的一些逻辑,就去展示一些需要展示的、必须展示的一些页面跳转与显示就行,或者是里边做一些全局之类的东西,尽量不要在首页中写过多的逻辑,首页可以作为全局的一个引擎,关于逻辑代码就尽量与首页分开,写到对应的类中就行。
3.3 里氏替换原则 Liskov Substitution Principle
只要父类能出现的地方子类就能出现,主要体现就是继承父类和实现接口
这个就要求我们在写代码时候,尽量多用继承和实现。
但是这里需要注意:
继承使用原则:父类一般都是写一些特定的方法:比如说跳转页面、管理多个Activity、抽取initView()、initData()、initListener()、弹出toast等,一般都是写这些东西,比如其他的一些可以抽取成工具类,然后在使用的时候去调用就行。
3.4 依赖倒置原则 Dependence Inversion Priniciple
3.5 接口隔离原则 Interface Segregation Priniciple
意思就是不要在一个接口中定义好多个方法,而应该是尽量让每一个接口中的方法尽可能的少,最好是一两个、两三个,这样客户一眼看到接口中就知道自己的方法,目的是解耦,从而使代码容易重构,其实就是接口拆分、单接口的意思。
比如说这个是接口拆分之前的代码:
public interface Callback {
void onForgetPassword();
void onInputCompleted(CharSequence password);
void onPasswordCorrectly();
void onCancel();
}
我们要做的就是,把接口拆分,都尽量的拆成单个接口:
public interface Callback1 {
void onForgetPassword();
}
public interface Callback2 {
void onInputCompleted(CharSequence password);
}
public interface Callback {
void onPasswordCorrectly();
}
public interface Callback {
void onCancel();
}
就是这样,把接口中的多个方法拆成这样的,尽量让一个接口中就一两个方法,这样用户看的话一眼就看到这个方法是干什么的,这样接口隔离原则就是解耦,是代码容易重构,原则就是接口拆分成单接口即可。
3.6 迪米特原则(最少知识原则) Law of Demeter Priniciple
一个对象应该对其他对象有最少的了解。
意思就是每个类中只写和自己有关的逻辑代码,和你没有关系的代码你就不要写到自己的类中。
4. app的缓存问题
这里app的缓存问题,主要分为热缓存和冷缓存,即就是常用缓存和不常用缓存。
常用缓存:指的是app最经常点击的地方,举个例子,比如头条的首页,这个时候我们可以把首页数据缓存起来:
1>: 首先先把最常用、最经常点击的模块缓存到内存中,因为从内存中取数据速度最快;
2>: 然后把偶尔看的数据缓存到本地,比如硬盘、数据库中;
3>: 最后把一些不太常用的数据缓存到硬盘中,比如个人信息页面数据
这样的话,我们经常看的模块从内存中获取数据的速度很很快,而我们不经常看的个人信息的数据直接从SP中去取也是可以的。