设计由何而来


设计由何而来

设计,从何而来?是需求。是重构。

设计原则是系统设计的灵魂,而设计模式是系统开发的模板,灵活自如的应用才是设计以不变应万变的准则。例如,实现一个用户注册的方法,首先会想到:

//初次设计

    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://www.cnblogs.com/broadview/archive/2011/08/09/2132689.html

posted @ 2011-08-10 17:53  博文视点(北京)官方博客  阅读(157)  评论(0编辑  收藏  举报