软件工程基础
软件工程:
应用系统的,规范的,可量化的方法来开发,运行和维护软件,即将工程应用到软件。
对1中各种方法的研究。
关键是子类扩展父类的时候,只能增加字段和方法,而不能增加约束。
长和宽必须相等是对父类中两个字段的约束,而在子类无法扩展这种约束,这算是目前oo语言的局限性。期待下一代oo语言解决。
“能够施行于base class对象上的每件事情,也可以施行于derived class对象身上”
这个就是“里氏替换原则”。
1 | class Rectangle{ |
https://www.jianshu.com/p/eeefa13d6dbe
耦合度举例说明
内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。1
2
3
4
5
6
7
8
9class A{
public int data_a;
}
class B{
public fun(){
A a = new A();
a.data_a = 5;
}
}
这里B直接修改了A的data_a,所有是“内容耦合”;
公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class C{
int static data_x;
int static data_y;
}
class A{
public void fun(){
C.data_x = 5;
}
}
class B{
public void fun(){
C.data_x = 6;
}
}
A和B都可以操作data_x,说以A和B是“公共耦合”
外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。1
2
3
4
5
6
7
8
9
10
11int static data_x;
class A{
public void fun(){
data_x = 5;
}
}
class B{
public void fun(){
data_x = 6;
}
}
A和B都访问data_x,所以A和B是外部耦合。
控制耦合。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class A{
private B mB;
private int m_a= 4;
public void update(){
m_a= mB.get();
}
}
class B{
A mA;
int m_b;
public void fun(){
data_x = 6;
}
public void set(int b){
this.m_b =b;
mA.update();
}
}
当B.set()运行时,A的m_a也会从新设计,说以A和B是“控制耦合”
标记耦合。若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class B{
stiac void fun(int a){
}
}
class C{
static void fun(int a){
}
}
class A{
int m_a = 5;
void fun(){
B.fun(m_a );
C.fun(m_a );
}
}
A向B和C传递了共同的参数m_a ,所有B和C是标记耦合
数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。1
2
3
4
5
6
7
8
9class A{
void fun(int a);
}
class B{
void fun(A a){
int b;
a.fun(b);
}
}
模块A和B通过参数传递数据,所有A和B是“数据耦合”
非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class A{
int fun(){
}
}
class B{
void fun(int a){
}
}
class Client{
void main(){
A a = new A();
B b = new B();
int i_a = a.fun();
b.fun(i_a);
}
}
A和B没有直接连接,他们的调动是通过Client来完成,说以A和B是“非直接耦合”
多项式加法1
2
3
4
5
6
7
8
9
10
11
12
13
14//定义节点类
class Node{
public int coef;//系数
public int exp;//指数
public Node next=null;//下个节点
public Node(){
coef=0;
exp=0;
}
public Node(int coef,int exp){
this.coef=coef;
this.exp=exp;
}
}
1 | //多项式类 |
栈(stack)
1).定义:插入和删除只能在表的一端进行的线性表.
又称后进先出(LIFO--Last In First Out)
例子:饭店里的一堆碟子
队列(queue)
1) 定义:插入在一端进行,删除在另一端进行的线性
表.又称先进先出(FIFO:First In First Out)
递归的概念
若一个对象部分地包含它自己或用它自己给自己定义,则称这个对象是递归的。
若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。1
2
3
4long factorial(long n)
{ if(n==0)return 1;//递归终结条件
else return n*factorial(n-1);//n问题化为n-1问题
}