研究生二年级了,本人专业硕士,二年半就要毕业,至今也做过了两三个小项目,但是感觉
只是本科生毕业设计的简单的量的加成而已,并没有质的改变。一年来可谓变化颇多,闲话
少叙还是直接进入正题。虽然计算机科学和传统的科学都属于自然科学,但是传统的科学如
物理,规则、定律是客观存在的,苹果砸到了牛顿的头上,经过思索,发现了万有引力定律。
而计算机科学则不一样,一开始只是一张白纸,一代代的计算机科学家们通过构思,创立了
Computer Science这门特殊的科学。当然,道路不是一帆风顺,总有失败之后的总结,我看
的这本书《软件设计精要和模式》,就是一次次的总结。
几方面的原因,我开始学习软件设计,以为后面学习代码重构打下基础。
一:面向对象的核心要素
封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)
1.封装
封装就是合理的隐藏和公开。
In computer science, information hiding is the principle of segregation of the
design decisions in a computer program that are most likely to change, thus
protecting other parts of the program from extensive modification if the design
decision is changed. The protection involves providing a stable interface which
protects the remainder of the program from the implementation (the details that
are most likely to change).
这是维基百科的解释,简单点说就是将最可能发生变化的隐藏起来,公开对象调用者需要
的接口。
例:员工(Employee)的年龄(Age)。显然Age应该作为属性,而不是作为字段直接暴露给
调用者。
setter来对age的操作,但是调用者不必要关心细节。
因为年龄这个字段的特殊性(每年+1),那么是不是可以考虑用另外一个不变的字段来替代
--Birthday。
Table Employee
Column Birthday
对应的前台,则是让用户输入自己的出生年月,这就是为什么好多网站注册的时候,不让
用户输入age,而是让用户输入Birthday的原因了。看看QQ的注册
再看一个例子:
则需要修改EmailService里面的具体实现。
只是本科生毕业设计的简单的量的加成而已,并没有质的改变。一年来可谓变化颇多,闲话
少叙还是直接进入正题。虽然计算机科学和传统的科学都属于自然科学,但是传统的科学如
物理,规则、定律是客观存在的,苹果砸到了牛顿的头上,经过思索,发现了万有引力定律。
而计算机科学则不一样,一开始只是一张白纸,一代代的计算机科学家们通过构思,创立了
Computer Science这门特殊的科学。当然,道路不是一帆风顺,总有失败之后的总结,我看
的这本书《软件设计精要和模式》,就是一次次的总结。
几方面的原因,我开始学习软件设计,以为后面学习代码重构打下基础。
一:面向对象的核心要素
封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)
1.封装
封装就是合理的隐藏和公开。
In computer science, information hiding is the principle of segregation of the
design decisions in a computer program that are most likely to change, thus
protecting other parts of the program from extensive modification if the design
decision is changed. The protection involves providing a stable interface which
protects the remainder of the program from the implementation (the details that
are most likely to change).
这是维基百科的解释,简单点说就是将最可能发生变化的隐藏起来,公开对象调用者需要
的接口。
例:员工(Employee)的年龄(Age)。显然Age应该作为属性,而不是作为字段直接暴露给
调用者。
public class Emplyee
{
private int age;
public int Age
{
get;
set
{
if(value < 18 || value > 60)
{
throw new NotSupportedException("Age is not correct.");
}
age = value;
}
}
}
这样就实现了对age字段的封装,提供的接口则是Age的属性,当然,实际还是通过getter和setter来对age的操作,但是调用者不必要关心细节。
因为年龄这个字段的特殊性(每年+1),那么是不是可以考虑用另外一个不变的字段来替代
--Birthday。
public class Employee
{
public DateTime Birthday;
{
get;
set;
}
public int Age
{
get
{
return DateTime.Now.Year - Birthday.Year;
}
}
}
那我们可以现象数据库的表的设计Table Employee
Column Birthday
对应的前台,则是让用户输入自己的出生年月,这就是为什么好多网站注册的时候,不让
用户输入age,而是让用户输入Birthday的原因了。看看QQ的注册
public static class EmailService
{
public static void Send(Email emali)
{//code here}
public static void Receive(EmailAddress emailAddress)
{//code here}
}
看看这个工作类设计的如何呢?那我们知道邮件的收发协议有可能发生变化,当变化时,我们则需要修改EmailService里面的具体实现。
(UML会在后面的笔记中介绍)
通过封装变化即将EmailService进行抽象,抽象为接口,不同的收发协议EmailService实现IEmailService接口时,
具体实现就不一样,调用者也就可以根据需要进行调用。