• 设计由何而来



    设计由何而来

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

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

    //初次设计

        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

  • 相关阅读:
    5 float f = 3.4,是否正确
    4 String是基本数据类型吗
    3 访问修饰符public,private,protected以及不写(默认)时的区别
    1 请谈谈面向对象的三大特征?
    接口和抽象类有什么区别
    2 Java中 == 和 equals 和 hashCode 的区别
    java中重载(overload)与重写(override)的区别
    servlet中请求转发(forword)和重定向(redirect)的区别
    团队-项目名称五子棋-团队一阶段互评
    团队-项目名称五子棋-开发环境搭建过程
  • 原文地址:https://www.cnblogs.com/broadview/p/2133947.html
Copyright © 2020-2023  润新知