zoukankan      html  css  js  c++  java
  • 步步为营 .NET 代码重构学习笔记 九

    一、Duplicate Observed Data(复制[被监视数据])

    动机(Motivation)

    将该笔数据拷贝到一个domain object中。建立一个Observer模式,用以对domain object 和GUI object内的重复数据进行同步控制(sync)。

    示例

    步步为营 .NET 设计模式学习笔记 十二、Observer (观察者模式)

    二、Change Unidirectional Association to Bidirectional(将单向关联改为双向)

    动机(Motivation)

    添加一个反指针,并使修改函数(modifiers)能够同时更新两条连接。

    示例

    01 public class Order
    02 {
    03     private Customer _customer;
    04  
    05     public Customer NewCustomer
    06     {
    07         get { return _customer; }
    08         set { _customer = value; }
    09     }
    10 }
    11  
    12 public class Customer
    13 {
    14 }

    改为

    01 public class Order
    02  {
    03      public List<Customer> CustomerList = new List<Customer>();
    04  
    05      public void AddCustomer(Customer arg)
    06      {
    07          arg.orderlist.Add(this);
    08          CustomerList.Add(arg);
    09      }
    10  
    11      public void RemoveCustomer(Customer arg)
    12      {
    13          arg.orderlist.Remove(this);
    14          CustomerList.Remove(arg);
    15      }
    16  }
    17  
    18  public class Customer
    19  {
    20      public List<Order> orderlist = new List<Order>();
    21      public void AddOrder(Order arg)
    22      {
    23          arg.CustomerList.Add(this);
    24          orderlist.Add(arg);
    25      }
    26      public void RemoveOrder(Order arg)
    27      {
    28          arg.CustomerList.Remove(this);
    29          orderlist.Remove(arg);
    30      }
    31  }

    三、Change Bidirectional Association to Unidirectional(将双向改为单向)

    动机(Motivation)

    两个classes之间有双向关联,但其中一个class如今不再需要另一个class的特性。

    示例

    01 public class Order
    02     {
    03         public List<Customer> CustomerList = new List<Customer>();
    04  
    05         public void AddCustomer(Customer arg)
    06         {
    07             arg.orderlist.Add(this);
    08             CustomerList.Add(arg);
    09         }
    10  
    11         public void RemoveCustomer(Customer arg)
    12         {
    13             arg.orderlist.Remove(this);
    14             CustomerList.Remove(arg);
    15         }
    16     }
    17  
    18     public class Customer
    19     {
    20         public List<Order> orderlist = new List<Order>();
    21         public void AddOrder(Order arg)
    22         {
    23             arg.CustomerList.Add(this);
    24             orderlist.Add(arg);
    25         }
    26         public void RemoveOrder(Order arg)
    27         {
    28             arg.CustomerList.Remove(this);
    29             orderlist.Remove(arg);
    30         }
    31     }

    改为

    01 public class Order
    02 {
    03     private Customer _customer;
    04  
    05     public Customer NewCustomer
    06     {
    07         get { return _customer; }
    08         set { _customer = value; }
    09     }
    10 }
    11  
    12 public class Customer
    13 {
    14 }

    四、Replace Magic Number with Symbolic Constant(以符号常量/字面常量取侙魔法数)

    动机(Motivation)

    创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。

    示例

    1 public double PotentialEnergy(double mass, double height)
    2 {
    3     return mass * 9.51 * height;
    4 }

    改为

    1 private double GRAVITATIONAL_CONSTANT = 9.51;
    2 public double PotentialEnergy(double mass, double height)
    3 {
    4     return mass * GRAVITATIONAL_CONSTANT * height;
    5 }

    五、Encapsulate Field(封装值域)

    动机(Motivation)

    将它声明为private,并提供相应的访问函数(accessors)

    示例

    1 public string _name;

    改为

    1 private  string _name;
    2  
    3 public string Name
    4 {
    5     get { return _name; }
    6     set { _name = value; }
    7 }

    六、Replace Type Code with Class(以类取代型别码)

    动机(Motivation)

    以一个新的class替换该数值型别码(type code)

    示例

    01 public class Person
    02 {
    03     public  int O = 0;
    04     public  int A = 1;
    05     public  int B = 2;
    06     public  int AB = 3;
    07  
    08     private int _bloodGroup;
    09  
    10     public Person(int bloodGroup)
    11     {
    12         _bloodGroup = bloodGroup;
    13     }
    14     public int NewBloodGroup
    15     {
    16         get { return _bloodGroup; }
    17         set { _bloodGroup = value; }
    18     }
    19 }

    改为

    01 public class Person
    02    {
    03        public int O = BloodGroup.O.Code;
    04        public int A = BloodGroup.A.Code;
    05        public int B = BloodGroup.B.Code;
    06        public int AB = BloodGroup.AB.Code;
    07  
    08  
    09        private int _bloodGroup;
    10  
    11        public Person(int bloodGroup)
    12        {
    13            _bloodGroup = bloodGroup;
    14        }
    15  
    16        public int NewBloodGroup
    17        {
    18            get { return _bloodGroup; }
    19            set { _bloodGroup = value; }
    20        }
    21    }
    22  
    23    public class BloodGroup
    24    {
    25        public static BloodGroup O = new BloodGroup(0);
    26        public static BloodGroup A = new BloodGroup(1);
    27        public static BloodGroup B = new BloodGroup(2);
    28        public static BloodGroup AB = new BloodGroup(3);
    29  
    30        private int _code;
    31  
    32        private BloodGroup(int code)
    33        {
    34            _code = code;
    35        }
    36  
    37        public int Code
    38        {
    39            get { return _code; }
    40            set { _code = value; }
    41        }
    42  
    43    }
  • 相关阅读:
    Log4Net 全方位跟踪程序运行
    ASP.NET MVC 3和Razor中的@helper 语法
    C# 4.0四大新特性代码示例与解读
    程序员必读
    重学算法(1)--遍历二叉树
    重学算法-目录
    Epplus使用技巧
    JQuery 获取URL中传递的参数
    Epplus 使用案例
    .net调用存储过程详解(转载)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2063963.html
Copyright © 2011-2022 走看看