利用流水线改进代码中的if处理流程

简介:

本文用到的编程语言为C#,具体思路不限制编程语言。

 

刚才正在浏览http://ruby-china.org/topics/7384的时候,看到5楼的回复,突然有一种想法,不知道优劣,请大家帮忙评判一下,或者给出一些更好的实现方案。

 

我们先来上一段代码,就是常见的一种代码。

 
  1. Order getOrder(string orderNo) 
  2.  
  3.     order = repo.getOrder(orderNo); 
  4.  
  5.     if(order.condition1) 
  6.     { 
  7.      ... 
  8.     } 
  9.  
  10.     if(order.condition2) 
  11.     { 
  12.     ... 
  13.     } 
  14.  
  15.     if(order.condition3) 
  16.     { 
  17.     ... 
  18.     } 
  19.    
  20.     .   
  21.     . 
  22.     . 
  23.  

上面是一段伪代码,实现的就是一个根据订单号,获取订单,然后根据订单的一些条件进行一些处理。

order是获取出来的订单,condition1、condition2、condition3是一些条件。随着业务的复杂,condition3后面还可能更多的condition,就需要添加更多的if,进行更多的判断,然后这个方法越来越长,越来越难以读懂,越来越难以维护,越来越。。。

 

我想是不是可以换个角度,不是订单来判断条件,然后执行一些代码。而是订单进入一个处理流程,然后处理流程中有很多的闸门,每个闸门代表一个特征条件处理器,然后由这个处理器来判断流经自己的订单是否符合条件,符合就处理,不符合就掠过。

 

这样有几个好处:

  1. 上面代码中的获取订单方法,不会越来越长,这样阅读起来就很好理解,在后面进行维护的时候,就很容易来做了。
  2. 添加一个新的条件处理分支也很容易,只要把这种条件处理看做是一个闸门,在处理流水线中加入新闸门就可以了,其他的都不需要变化。
  3. 调整原来的条件处理,也只需要修改闸门内部的处理代码即可,不用担心是否影响其他处理分支。
  4. 分支独立之后,还可以针对每个分支做单元测试。

 

其实扩展开来想,这个流程不仅可以处理订单,任何针对一个对象进行流程化处理的场景,都可以套用上面的代码结构,都可以得到上面的好处。

 

我画了一个示意图。

图 1.1 对象处理流水线 

 

 

放出一段示例代码。

 

 
  1. public interface IRepo 
  2.    { 
  3.        string getOrder(string orderNo); 
  4.    } 
  5.    public class Repo : IRepo 
  6.    { 
  7.  
  8.        public string getOrder(string orderNo) 
  9.        { 
  10.            return string.Empty; 
  11.        } 
  12.    } 
  13.  
  14.    public class Client 
  15.    { 
  16.  
  17.  
  18.        public void getOrder(string orderNo) 
  19.        { 
  20.            var order = new Repo().getOrder(orderNo); 
  21.            var pipeline = new Pipeline(); 
  22.            var handle1 = new condition1_Handle(); 
  23.            var handle2 = new condition2_Handle(); 
  24.            pipeline.add_order(order); 
  25.            pipeline.add_handle(handle1); 
  26.            pipeline.add_handle(handle2); 
  27.            pipeline.processOrder(); 
  28.        } 
  29.    } 
  30.    class Pipeline 
  31.    { 
  32.        private List<IHandle> _handles; 
  33.        private string _order; 
  34.        public Pipeline() 
  35.        { _handles = new List<IHandle>(); } 
  36.        internal void add_order(string order) 
  37.        { 
  38.            this._order = order; 
  39.        } 
  40.  
  41.        internal void add_handle(IHandle handle1) 
  42.        { 
  43.            _handles.Add(handle1); 
  44.        } 
  45.  
  46.        internal void processOrder() 
  47.        { 
  48.            foreach (var h in _handles) 
  49.            { 
  50.                h.process(_order); 
  51.            } 
  52.        } 
  53.    } 
  54.    public interface IHandle 
  55.    { 
  56.        void process(string order); 
  57.    } 
  58.    public class condition1_Handle : IHandle 
  59.    { 
  60.        public  void process(string _order) 
  61.        { 
  62.            throw new NotImplementedException(); 
  63.        } 
  64.    } 
  65.    public class condition2_Handle : IHandle 
  66.    { 
  67.        public void process(string _order) 
  68.        { 
  69.            throw new NotImplementedException(); 
  70.        } 
  71.    } 

 

感觉有点像是策略模式,但是感觉又不太像。

上面的代码还有优化的空间,大家有没有更好的方案呢,欢迎大家一起讨论!

 

稍加改进,引入泛型,就可以支持任意类型的对象处理。

 

 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace ConsoleClient.Pipeline 
  7.     public interface IRepo 
  8.     { 
  9.         Purchase getOrder(string orderNo); 
  10.         Product getProduct(int id); 
  11.  
  12.     } 
  13.     public class Repo : IRepo 
  14.     { 
  15.  
  16.         public Purchase getOrder(string orderNo) 
  17.         { 
  18.             return new Purchase(); 
  19.         } 
  20.  
  21.         public Product getProduct(int id) 
  22.         { 
  23.             return new Product(); 
  24.         } 
  25.     } 
  26.  
  27.     public class Client 
  28.     { 
  29.  
  30.  
  31.         public Purchase getOrder(string orderNo) 
  32.         { 
  33.             var order = new Repo().getOrder(orderNo); 
  34.             var pipeline = new Pipeline<Purchase>(); 
  35.             var handle1 = new condition1_orderHandle(); 
  36.             var handle2 = new condition2_orderHandle(); 
  37.             pipeline.add_order(order); 
  38.             pipeline.add_handle(handle1); 
  39.             pipeline.add_handle(handle2); 
  40.             pipeline.processOrder(); 
  41.  
  42.             return order; 
  43.         } 
  44.  
  45.  
  46.         public Product getProduct(int id) 
  47.         { 
  48.             var product = new Repo().getProduct(id); 
  49.             var pipeline = new Pipeline<Product>(); 
  50.             var handle1 = new condition1_productHandle(); 
  51.             var handle2 = new condition2_productHandle(); 
  52.             pipeline.add_order(product); 
  53.             pipeline.add_handle(handle1); 
  54.             pipeline.add_handle(handle2); 
  55.             pipeline.processOrder(); 
  56.  
  57.             return product; 
  58.         } 
  59.     } 
  60.     public class Pipeline<T> 
  61.     { 
  62.         private List<IHandle<T>> _handles; 
  63.         private T _order; 
  64.         public Pipeline() 
  65.         { _handles = new List<IHandle<T>>(); } 
  66.         public void add_order(T order) 
  67.         { 
  68.             this._order = order; 
  69.         } 
  70.  
  71.         public void add_handle(IHandle<T> handle1) 
  72.         { 
  73.             _handles.Add(handle1); 
  74.         } 
  75.  
  76.         public void processOrder() 
  77.         { 
  78.             foreach (var h in _handles) 
  79.             { 
  80.                 h.process(_order); 
  81.             } 
  82.         } 
  83.     } 
  84.  
  85.     public class Purchase 
  86.     { 
  87.  
  88.         public bool IsPay { getset; } 
  89.  
  90.     } 
  91.     public class Product 
  92.     { 
  93.         public bool IsExpired { getset; } 
  94.     } 
  95.     public interface IHandle<T> 
  96.     { 
  97.         void process(T order); 
  98.     } 
  99.     public class condition1_orderHandle : IHandle<Purchase> 
  100.     { 
  101.  
  102.         public void process(Purchase order) 
  103.         { 
  104.             if (order.IsPay == false ) 
  105.             { 
  106.                 Console.WriteLine("you don't pay money"); 
  107.             } 
  108.         } 
  109.     } 
  110.     public class condition2_orderHandle : IHandle<Purchase> 
  111.     { 
  112.         public void process(Purchase order) 
  113.         { 
  114.  
  115.         } 
  116.     } 
  117.  
  118.     public class condition1_productHandle : IHandle<Product> 
  119.     { 
  120.         public void process(Product product) 
  121.         { 
  122.  
  123.         } 
  124.     } 
  125.     public class condition2_productHandle : IHandle<Product> 
  126.     { 
  127.         public void process(Product product) 
  128.         { 
  129.  
  130.         } 
  131.     } 

 




本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1081790,如需转载请自行联系原作者

目录
相关文章
|
4天前
|
Java Linux Go
流水线 YAML 高级用法来了!大幅降低重复代码、灵活编排多任务
云效 Flow 流水线 YAML 引入了 template 语法,支持使用模板语言来动态渲染流水线 YAML,满足多个相同或类似逻辑的 Job 批量配置场景,满足多 Job 按需动态生成场景,帮助降低流水线 YAML 重复代码,灵活编排多任务。
|
4天前
|
监控 数据可视化 测试技术
云效流水线 Flow 评测:助力企业高效完成 CICD 全流程
云效流水线 Flow 评测显示其在CI/CD领域表现出色,尤其适合新人上手。具备直观的可视化编辑和Yaml化选项,丰富的文档教程,以及全面的功能,如多代码源支持、自动化测试、稳定部署及阿里云服务集成。此外,Flow性能稳定,监控功能强,且高度可扩展,支持插件和API集成。相比其他工具,Flow在成本、功能和性能上有竞争优势,特别适合与阿里云生态结合的团队。作为一款易用且性价比高的工具,Flow值得推荐给各类企业。
233 11
|
4天前
|
人工智能 安全 Devops
让研发规范管得住 - 我们为什么在流水线之上又做了研发流程?
研发规范的目标,是为了解决或降低出现软件危机的风险。但传统流水线受限于工具的定位,无法解决研发规范的落地问题,需要在更高的层面来解决。阿里云云效团队经过内部启发后推出的新产品:云效应用交付平台 AppStack 给出了解决方案,快来使用体验吧!
78409 5
|
4天前
|
Java 测试技术 持续交付
云效产品使用常见问题之通过流水线构建的java代码,在docker文件里拿到失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4天前
|
敏捷开发 测试技术 持续交付
云效产品使用常见问题之流水线webhook触发指定代码源分支如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4天前
|
缓存 图形学 异构计算
【Shader渲染流水线流程】
【Shader渲染流水线流程】
|
9月前
|
算法
【信号去噪和正交采样】流水线过程的一部分,用于对L波段次级雷达中接收的信号进行降噪(Matlab代码实现)
【信号去噪和正交采样】流水线过程的一部分,用于对L波段次级雷达中接收的信号进行降噪(Matlab代码实现)
|
10月前
|
jenkins 持续交付
Jenkins配置仅合并代码后触发流水线
Jenkins配置仅合并代码后触发流水线
167 0
|
运维 Devops 测试技术
Devops 如何使用 Codeup 和流水线构建发布流程
Devops 如何使用 Codeup 和流水线构建发布流程,让发布更顺畅
849 0
Devops 如何使用 Codeup 和流水线构建发布流程
|
jenkins Shell 持续交付
jenkins流水线+SonarQube集成检查代码
jenkins流水线+SonarQube集成检查代码
jenkins流水线+SonarQube集成检查代码

热门文章

最新文章