软件设计精要与模式--笔记1

研究生二年级了,本人专业硕士,二年半就要毕业,至今也做过了两三个小项目,但是感觉
只是本科生毕业设计的简单的量的加成而已,并没有质的改变。一年来可谓变化颇多,闲话
少叙还是直接进入正题。虽然计算机科学和传统的科学都属于自然科学,但是传统的科学如
物理,规则、定律是客观存在的,苹果砸到了牛顿的头上,经过思索,发现了万有引力定律。
而计算机科学则不一样,一开始只是一张白纸,一代代的计算机科学家们通过构思,创立了
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接口时,

具体实现就不一样,调用者也就可以根据需要进行调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值