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;
            }
        }
    }

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

  • 相关阅读:
    初学C#线程
    初学C#线程二
    JQuery Ajax
    算法测试
    个人报告
    202120221课程设计第三周进展
    socket测试3
    202120221课程设计任务理解与分工
    嵌入式基础
    202120221课程设计第四周进展
  • 原文地址:https://www.cnblogs.com/hmloo/p/6872337.html
Copyright © 2011-2022 走看看