说的好像提bug一样
2333
说的好像提bug一样
2333
矩阵乘法特点
--------------------------
矩阵M
单位矩阵 M1
M x M1 = M
=============
矩阵 A, B, C;
(AB)C = A(BC);
=============
矩阵 A, B;
标量 K;
(KA)B = K(AB) = A(KB)
=============
矩阵A, B;
三维向量叉乘
--------------------------
Vector3D a,b;
数值:|a x b| = |a| |b| Sinθ
方向:坐标系不同,判断不同
意义:判断三角面片
|a x b| = (a.y b.z - a.z b.y, a.z b.x - a.x b.z, a.x b.y - a.y b.x);
矩阵与向量
--------------------------
列向量:n x 1 矩阵
行向量:1 x n 矩阵
注意⚠️:向量与矩阵进行运算时,需要注意是行向量还是列向量
三维向量点乘
--------------------------
Vector3D a(x_1,y_1,z_1),b(x_1,y_1,z_1);
a · b = x_1 x_2 + y_1 y_2 + z_1 z_2;
a · b = |a| |b| Cosθ = √(x_1^2 y_1^2 z_1^2) √(x_2^2 y_2^2 z_2^2) Cosθ;
θ = arcCos(ab);
a·b > 0 向量夹角为锐角;
a·b = 0 向量夹角为直角;
a·b < 0 向量夹角为钝角;
三维向量基本运算
--------------------------
Vector3D a(x,y,z);
|a| = √(x^2 + y^2 + z^2);
λa = (λx_1, λy_1, λz_1);
二维坐标系旋转和平移
--------------------------
原坐标系o,点p(x,y),与x轴夹角θ
目标坐标系 o',点(x',y'), o - o' = (a,b)
p' = (xCosθ + ySinθ + a, yCosθ - xSinθ + b)
向量计算必须在同一坐标系
二维坐标系平移
--------------------------
已知坐标系o和一在其上的点p(x,y),和另一坐标系o',用p'(x',y')来表示点p在o'上点坐标。
o' - o = (a,b);
x' = x + a;
y' = y + b;
二维单位向量
--------------------------
单位向量是指模等于1的向量
零向量是任意方向的向量
二维向量叉乘
--------------------------
叉乘 = 向量积 = 外积 = 叉积 => 向量
Vector2D a, b, c;
模长:|c| = |a · b| = |a| |b| Sinθ //θ为 a 与 b的夹角
方向:c 方向垂直于a, b所在的平面 (右手定则来确定方向)
二维向量点乘
--------------------------
Vector2D a,b;
a · b = x_1 x_2 + y_1 y_2 = 标量(数值)
==================
Vector2D a,b;
c^2 = a^2 + b^2 - 2 |a| |b| Cosθ
===================
Vector2D a, b;
a·b > 0 向量夹角为锐角
a·b = 0 向量夹角为直角
a·b < 0 向量夹角为钝角
二维坐标系旋转
--------------------------
已知 x,y 旋转坐标系得到 x',y'
x' = xCosθ + ySinθ;
y' = yCosθ - xSinθ;
θ 为正:逆时针旋转
θ 为负:顺时针旋转
五、接口隔离原则
1. 定义
2.分析
3.实例
下图展示了一个拥有多个客户类的系统,在系统中定义了一个巨大的接口(胖接口)AbstractService来服务所有的客户类。如图所示:
图一
图二
图(一)和图(二)分析:
图(一)为什么到图(二)哪?因为这样做既满足了接口隔离原则,又满足了单一原则,何乐而不为呢,但是也带来了很多的不便,类增多了。
总结:类应该完全依赖相应的专门的接口
---------------------
六、合成复用原则
1.定义
尽量使用对象组合,而不是继承来达到复用的目的。
2.分析
3. 实例
某教学管理系统部分数据库访问类设计如图所示:
图一
图二
图(一)和图(二)分析:
图(一)为什么到图(二)哪?因为如果需要更换数据库连接方式,如原来采用JDBC连接数据库,现在采用数据库连接池连接,则需要修改DBUtil类源代码。如果StudentDAO采用JDBC连接,但是TeacherDAO采用连接池连接,则需要增加一个新的DBUtil类,并修改StudentDAO或TeacherDAO的源代码,使之继承新的数据库连接类,这将违背开闭原则,系统扩展性较差。
总结:类中应用,尽量使用对象组合而不是用继承来达到复用的目的。
---------------------
七、迪米特法则
1. 定义
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
2. 分析
3. 实例
某系统界面类(如Form1、Form2等类)与数据访问类(如DAO1、DAO2等类)之间的调用关系较为复杂。如图所示:
图一
图二
图(一)和图(二)分析:
图(一)为什么到图(二)哪?因为这样就可以降低类的耦合性,是类中功能更加单一,相当于外观模式。
总结:一个软件实体应当尽可能少的与其他实体发生相互作用
---------------------
综述:以上就是其中程序员必备的七大面向对象设计原则,原则犹如国家的法规,这就是面向对象的准则,要使我们的编程更加灵活,封装性更好,复用性更高,易于维护我们需要我们的这些原则建设我们规范我们的程序。这样我们编写的才是高质量的程序。我们每个人都这样去做,我们的编程水平一定会进步一大截!
里氏代换原则
1. 定义
2.分析
3. 实例
某系统需要实现对重要数据(如用户密码)的加密处理,在数据操作类(DataOperator)中需要调用加密类中定义的加密算法,系统提供了两个不同的加密类,CipherA和CipherB,它们实现不同的加密方法,在DataOperator中可以选择其中的一个实现加密操作。如图所示:
图一
图二
图(一)和图(二)分析:
图(一)为什到图(二)哪?因为如果需要更换一个加密算法类或者增加并使用一个新的加密算法类,如将CipherA改为CipherB,则需要修改客户类Client和数据操作类DataOperator的源代码,违背了开闭原则。现使用里氏代换原则对其进行重构,使得系统可以灵活扩展,符合开闭原则。
总结:子类型必须能够替换掉它们的父类型。
---------------------
单一职责原则
1. 定义
2. 分析
3. 实例
某基于Java的C/S系统的“登录功能”通过如下登录类(Login)实现:
图一
图二
图一和图二有什么区别哪?
图(一)功能太过于集成,严重违反类的单一原则。
依赖倒转原则
1.依赖倒转原则定义
2. 依赖倒转原则分析
3. 依赖倒转原则实例
某系统提供一个数据转换模块,可以将来自不同数据源的数据转换成多种格式,如可以转换来自数据库的数据(DatabaseSource)、也可以转换来自文本文件的数据(TextSource),转换后的格式可以是XML文件(XMLTransformer)、也可以是XLS文件(XLSTransformer
图一
图二
图(一)和图(二)分析:
图(一)为什么要到图(二)哪?因为该系统可能需要增加新的数据源或者新的文件格式,每增加一个新的类型的数据源或者新的类型的文件格式,客户类MainClass都需要修改源代码,以便使用新的类,但违背了开闭原则。现使用依赖倒转原则对其进行重构。
总结:高层模块不应该依赖底层模块,两个都应该依赖与抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
开闭原则
1. 开闭原则定义 :一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
2. 开闭原则分析:
(1)开闭原则由Bertrand Meyer于1988年提出,它是面向对象设计中最重要的原则之一。
(2)在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
(3)抽象化是开闭原则的关键。
(4)开闭原则还可以通过一个更加具体的“对可变性封装原则”来描述,对可变性封装原则(Principle of Encapsulation of Variation,EVP)要求找到系统的可变因素并将其封装起来。
3. 开闭原则实例:
某图形界面系统提供了各种不同形状的按钮,客户端代码可针对这些按钮进行编程,用户可能会改变需求要求使用不同的按钮,原始设计方案如图所示:
现对该系统进行重构,使之满足开闭原则的要求。
对比分析
图(1):客户端的一个方法直接调用加法类,但是我想添加一个减法类,你就会发现添加减法类就得改变加法类中代码(用switch语句实现),这就违背了“开闭原则”,于是我们就应该重新重构。
图(2):在这个图中我们添加了一个运算类的父类,这样我们再添加减法类的时候就不用修改客户端类。
开闭原则总结:面对需求,对程序的改动是通过增加新代码进行的,而不是改变原来的代码。
面向对象设计中常见的设计原则:
上述原则的作用:让自己设计实现出来的软件系统更加稳定,容易维护,并具有一致性
Slot0 右手
Slot1 左手
Slot0ItemID 1 步枪
Slot0ItemID 4 弓箭
Slot0ItemID 1
Slot0ItemID 1
Slot0ItemID 1
不完善的地方:有两处
1.数据库操作那里
2.
不明白的地方:eventdata
这样得话,会不会10个客户端同时要更新10个客户端信息。执行100次。 n个执行n*n次 数据的发送