全部博文(465)
分类: IT业界
2011-08-10 17:52:19
设计,从何而来?是需求。是重构。
设计原则是系统设计的灵魂,而设计模式是系统开发的模板,灵活自如的应用才是设计以不变应万变的准则。例如,实现一个用户注册的方法,首先会想到:
//初次设计
public void Register(string name, Int32 age)
{
}
在一定的需求条件下,这个方法已经能够经受系统的考验,安全而平稳地向数据库中不断插入新的用户信息。然而,当需求发生变化时,你可能不得不对此做出调整,而我们就将这种调整称为重构。但是重构远不是扩充,而是设计。例如,现在的注册项发生了变化,还需要同时注册性别、电话,没有设计的调整,就被实现为:
//需求变更
public void Register(string name, Int32 age, bool isMale, Int32 phone)
{
}
通过重载方式,一定程度上解决了这一问题,然而这种不能称为重构的调整,至少存在以下的弊端:
· 有新增的注册信息时,还要通过不断地重载Register方法来实现更多信息的扩展。
· 方法Register的参数列表实在太长了,这不是优雅的代码实现。
· 需要修改系统中相关的方法调用来适应新的重载方法。
僵化的调整失去了设计的灵活性,没有思考的程序只能使程序的扩展和维护变得不可收拾,其实对于上述问题,只需要进行简单的重构,就可轻松避免上述3个弊端,实现更加柔性的系统。例如,简单重构如下:
public class UserInfo
{
public string Name { get; set; }
public Int32 Age { get; set; }
public bool Gender { get; set; }
}
通过将用户信息封装为一个类,实现更加简单的参数列表,同时其带来的好处还远不止避免了上述3个缺陷,而且能带来对用户信息的封装,实现更可靠的信息隐藏和暴露:
· 可以通过字段和属性封装,实现对于成员的只读、可读可写权限的控制。.NET 3.0的自动属性为属性封装实现了更为优雅的语法游戏,这些特性让C#成为更具有吸引力的高级语言(详见13.2节“赏析C# 3.0”):
//定义可读可写属性
public string Mobile { get; set; }
//定义只读属性
public string Password { get; private set; }
· 实现一定的逻辑封装,例如对于电子邮件,可以检查其合法性:
private string email;
public string Email
{
get { return email; }
set
{
string strReg = @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
if (Regex.IsMatch(value, strReg))
{
email = value;
}
else
{
throw new InvalidCastException("Invalid Email Address.");
}
}
}
那么,设计是如何实现和建立的呢?答案就是面向对象。正如上述演化过程一样,其中应用了面向对象中的封装要素,完成了更加柔性的设计。在1.3节“封装的秘密”中,我们就对封装展开了详细的探讨,基于实例的应用和对.NET实现本质的分析,能够更加强化对于面向对象基本要素的理解。
这些面向对象的思想和应用,来自于实践,完善于重构。
本文节选自《你必须知道的.NET(第2版)》一书
图书详细信息:http://blog.chinaunix.net/space.php?uid=13164110&do=blog&id=2149571