很多开发者,在面对设计/架构的时候,经常会遇到想学却无从下手,学了又用不上的烦恼。学习设计不仅仅是学习设计模式。在设计的时候,我们需要底层思想的支持。这里的底层思想其实是设计原则,而设计原则是基于真实背景从面向对象编程中衍生出来的一套规则。解决开发中的痛点。好的架构需要反复思考和设计。一、面向对象什么是面向对象?先看基本定义:面向对象是一种以类为代码基本单位,通过对象来访问类的风格,具有封装、继承、多态、抽象四大特点。使它更智能的构建块。表示语言Java。1、四大特性(有人说是三个,不要纠结)(1)封装封装也叫信息隐藏。通过暴露一个有限的访问接口,类授权外部只能通过类提供的方法(或函数)访问内部信息或数据。用户信息隐藏在里面,真正需要访问时,通过唯一暴露的入口进行访问。这个过程就是封装。合理使用封装可以减少模块之间的依赖(松耦合)。(2)继承“继承”是面向对象的第二个特征,反映了类之间的“is-a”关系。当两个类通过继承关联绑定时,子类自动拥有父类的属性和行为。提高复用性,解决模板代码问题,提高开发效率,解决错写、漏写带来的问题。(3)多态性用一句话概括“多态性”:一个对象有多种形式。合理使用多态可以写出易于扩展的代码,基于接口而不是编程的核心原则和开闭(Functions),不必知道这些函数是如何实现的。Java中的表达方式是接口和抽象类(5)接口和抽象类的区别接口更侧重于功能的设计,可以将具体的实现与调用者隔离开来。一般来说,接口的设计应该按照接口隔离的原则,粒度越细越好。好的抽象类更侧重于提高复用性,在原有基础上预留扩展点,方便开发者灵活实现差异化:接口可以降低模块之间的耦合,抽象类可以提高复用性。相同点:都具有很好的扩展性,都符合开闭原则。2.出生背景说到面向对象,就一定离不开面向过程。毕竟是从面向过程衍生出来的,吸收了它的大部分优点,解决了它的痛点。那么什么是面向过程呢?基本定义如下:分析解决问题所需的步骤,然后用函数一步步实现这些步骤。使用的时候可以一个一个调用,更加注重功能的设计。面向对象语言C在编程前需要根据四大特性对功能进行建模和设计,可以提高代码的安全性、可重用性、可扩展性,并使其更易于维护。既然面向对象语言这么智能,为什么面向过程语言还没有被淘汰呢?其实面向对象语言的智能是针对我们开发人员的。为了让我们写出易于维护的代码,我们会在设计中多做一步,虽然它更接近于开发者。但它离机器很远。毕竟机器只知道0和1,C语言规则简单,容易形成机器码,所以执行效率高,这也是它没有被淘汰的原因。2.六大设计原则是一切设计的基石。设计原则是从面向对象的思想中衍生出来的一些规则,用于解决实际开发中的一些痛点。本领域最重要的知识,所以请务必掌握(1)单体设计原理单体原理简单易懂。它指的是一个函数或一个类或一个模块。职责越单一,复用性越强,同时也可以间接降低耦合。性别。(2)开闭原则用一句话概括开闭原则:对扩展开放,对修改关闭。它充分诠释了抽象和多态的特征,是大多数行为设计模式的基础。它分布在各大框架中,是最重要的设计原则。光是这条原则就能让你的设计能力提高40%%(3)得墨忒尔定律的基本概念:不应该有直接依赖的模块不应该有依赖。有依赖的模块之间,尽量只依赖必要的接口。迪米特定律很好理解,也很实用。和单体的设计原则很相似,前者符合松耦合,后者符合高内聚。(4)接口隔离原则的基本概念:接口的调用者不应该依赖于它不需要的接口。乍一看,很像得墨忒尔定律。接口隔离的原理和得墨忒尔定律的目的很相似,都是可以减少模块之间的依赖。而接口隔离更侧重于设计单一接口,提高复用性,间接减少模块间依赖,而迪米特定律直接减少模块间依赖。(5)里氏代换原则的基本概念:在设计子类时,需要遵守父类的行为约定。父类定义了函数的行为契约,子类可以改变函数的内部实现逻辑,但不能改变函数原有的行为契约。Liskov替换非常简单易懂。使用继承时,允许重写父类的方法,但不改变其功能。比如自定义View,必须在子类的onMeasure中调用setMeasureaDimission()方法(或者直接用super),否则会影响父类方法的功能(会抛出异常),同时也违反了Liskov替换原则。(6)依赖倒置原理InversionofControl:提到DependencyInversion,就不得不提到InversionofControl。一句话:程序员会把复杂程序操作的控制权交给一个成熟的框架,程序员->成熟的框架进行倒置,框架应该暴露程序员实现的扩展点。什么是依赖倒置?高层模块(用户)不应该依赖低层模块(用户),它们都依赖同一个抽象,抽象不依赖于具体的实现细节,具体的实现细节依赖于抽象。其实核心点是基于接口而不是实现编程。高层模块(业务层)不依赖底层模块(SQLiteDao/RoomDao),而是依赖抽象(IDao)。可见依赖倒置也是开闭原则的延伸。不同的是,依赖倒置更侧重于指导框架的设计。框架层应该尽量把更多的细节隐藏在里面,对外只暴露抽象(抽象类/接口)。指导框架设计的核心是控制反转。
