zoukankan      html  css  js  c++  java
  • 重构指南

    多态(polymorphism)是面向对象的重要特性,简单可理解为:一个接口,多种实现。

    当你的代码中存在通过不同的类型执行不同的操作,包含大量if else或者switch语句时,就可以考虑进行重构,将方法封装到类中,并通过多态进行调用。

    代码重构前:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using LosTechies.DaysOfRefactoring.SampleCode.BreakMethod.After;
    
    namespace LosTechies.DaysOfRefactoring.SampleCode.ReplaceWithPolymorphism.Before
    {
        public abstract class Customer
        {
        }
    
        public class Employee : Customer
        {
        }
    
        public class NonEmployee : Customer
        {
        }
    
        public class OrderProcessor
        {
            public decimal ProcessOrder(Customer customer, IEnumerable<Product> products)
            {
                // do some processing of order
                decimal orderTotal = products.Sum(p => p.Price);
    
                Type customerType = customer.GetType();
                if (customerType == typeof(Employee))
                {
                    orderTotal -= orderTotal * 0.15m;
                }
                else if (customerType == typeof(NonEmployee))
                {
                    orderTotal -= orderTotal * 0.05m;
                }
    
                return orderTotal;
            }
        }
    }

    代码重构后:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using LosTechies.DaysOfRefactoring.SampleCode.BreakMethod.After;
    
    namespace LosTechies.DaysOfRefactoring.SampleCode.ReplaceWithPolymorphism.After
    {
        public abstract class Customer
        {
            public abstract decimal DiscountPercentage { get; }
        }
    
        public class Employee : Customer
        {
            public override decimal DiscountPercentage
            {
                get { return 0.15m; }
            }
        }
    
        public class NonEmployee : Customer
        {
            public override decimal DiscountPercentage
            {
                get { return 0.05m; }
            }
        }
    
        public class OrderProcessor
        {
            public decimal ProcessOrder(Customer customer, IEnumerable<Product> products)
            {
                // do some processing of order
                decimal orderTotal = products.Sum(p => p.Price);
    
                orderTotal -= orderTotal * customer.DiscountPercentage;
    
                return orderTotal;
            }
        }
    }

    重构后的代码,将变化点封装在了子类中,代码的可读性和可扩展性大大提高。

  • 相关阅读:
    云之家溢多利cloud审批提示"已绑定云之家,不能重复绑定"
    移动报表测试表单插件
    返回数据
    CRM发布菜单
    下推启动条件修改无效
    谷歌浏览器路径
    移动控件前端设置
    GridView中的数据导出为Excel【转】,和以前的有变化
    Ajax.net 错误 Could not load type 'Microsoft.Web.Extensions.Design.Dll'解决方法.
    WCF运行错误:“此集合已经包含方案 http 的地址”的解决办法
  • 原文地址:https://www.cnblogs.com/hmloo/p/6872337.html
Copyright © 2011-2022 走看看