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

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

  • 相关阅读:
    《数据库系统概论》 -- 3.2. 视图
    Uncaught SecurityError: Failed to execute 'replaceState' on 'History': A history state object with
    在node.js中使用mongose模块
    在centos7上作用mongodb
    Error: listen EADDRINUSE
    telnet: connect to address xxxxxxx: No route to host
    express-generator安装时出错,最后用VPS解决
    centos7中 npm install express 时Error: Cannot find module 'express'错误
    ubuntu1404服务器版中设置root用户
    python爬虫(1)
  • 原文地址:https://www.cnblogs.com/hmloo/p/6872337.html
Copyright © 2011-2022 走看看