首页 > 编程语言 >《重构-改善既有代码设计案例》案例之C#版(4)

《重构-改善既有代码设计案例》案例之C#版(4)

时间:2023-03-10 16:55:05浏览次数:34  
标签:重构 perf C# StatementData 案例 statementData result public string

书接上文...

这把要干个大的了,大神要把计算阶段与格式化阶段完全分离....为什么呢,因为目前这个结果是文本字符串,如果将来要新增一个需求,输出html格式的结果。那就只用新增格式化html的结果就行了。计算阶段的代码直接用就行了

这种分离的手法,叫做拆分阶段

那怎么做呢?

思路是:引入了中间数据,把代码分成2个部分,一部分计算详单所需的数据生成中间数据。一部分把中间数据渲染成想要的结果 比如文本或html

 至于手法,我太笨。。直接照抄了

要开始拆分阶段,大神先对组成第二阶段的代码引用提炼方法。这部分代码就是打印详单的代码。其实也就是statement的内容。大神把他提炼出来放在和statement同一层,新建了一个StatementData类,这个类目前没有任何内容。随着重构的过程慢慢添加

StatementData.cs

1     public class StatementData
2     {
3         public StatementData()
4         {
5         }
6     }
View Code

目前Statement及新提炼的方法如下(勘误:总金额不用再除100了)

 1         public string Statement()
 2         {
 3             StatementData statementData = new StatementData();
 4             return RenderPlainText(statementData);
 5         }
 6 
 7         private string RenderPlainText(StatementData statementData)
 8         {
 9             string result = $"Statement for {_invoice.Customer} \n";
10             foreach (var perf in _invoice.performances)
11             {
12                 result += $"{PlayFor(perf).name}: {Usd(AmountFor(perf))}({perf.audience}seats)\n";
13             }
14 
15             result += $"Amount owed is {Usd(TotalAmount() / 100)}\n";
16             result += $"You earned {TotalVolumeCredits()} credits \n";
17             return result;
18         }
View Code

 观察一下RenderPlainText,这个方法其实用到了customer,performances,以及调用了AmountFor(perf),TotalAmount(),TotalVolumeCredits()方法.

 所以StatementData需要填充这些内容

 1     public class StatementData
 2     {
 3         public string Customer;
 4         public List<Performance> Performances =new List<Performance>();
 5         public int TotalAmount;
 6         public int TotalVolumeCredits;
 7 
 8         public StatementData()
 9         {
10         }
11     }
View Code

你是不是发现了AmountFor(perf)这个没解决啊。确实,每一个Performance的金额不好搞。所以我想到的方法是,给Performane类一个Amount属性,然后用一个方法给每个Performance的Amount赋值。如下

Performance.cs

1     public class Performance
2     {
3         public string playID;
4 
5         public int audience;
6 
7         public int amount;
8 
9     }
View Code
1         private void EnrichStatementData(StatementData statementData)
2         {
3             foreach (var perf in statementData.Performances)
4             {
5                 perf.amount = AmountFor(perf);
6             }
7             statementData.TotalAmount = TotalAmount();
8             statementData.TotalVolumeCredits = TotalVolumeCredits();
9         }
View Code

这时候RenderPlainText是不是完全和计算无关了(其实PlayFor(perf)也可以去掉,给Performance类一个加一个Play字段,然后在EnrichStatementData方法里给他赋值)

 1         private string RenderPlainText(StatementData statementData)
 2         {
 3             string result = $"Statement for {statementData.Customer} \n";
 4             foreach (var perf in statementData.Performances)
 5             {
 6                 result += $"{perf.play.name}: {Usd(perf.amount)}({perf.audience}seats)\n";
 7             }
 8 
 9             result += $"Amount owed is {Usd(statementData.TotalAmount)}\n";
10             result += $"You earned {statementData.TotalVolumeCredits} credits \n";
11             return result;
12         }
View Code

现在的Statement如下

1         public string Statement()
2         {
3             StatementData statementData = new StatementData();
4             statementData.Customer = _invoice.Customer;
5             statementData.Performances = _invoice.performances;
6             EnrichStatementData(statementData);
7             return RenderPlainText(statementData);
8         }
View Code

对此可以继续提炼方法

 1         public string Statement()
 2         {
 3             StatementData statementData = CreateStatementData();
 4             return RenderPlainText(statementData);
 5         }
 6 
 7         private StatementData CreateStatementData()
 8         {
 9             StatementData statementData = new StatementData();
10             statementData.Customer = _invoice.Customer;
11             statementData.Performances = _invoice.performances;
12             EnrichStatementData(statementData);
13             return statementData;
14         }
View Code

这时候完成新增输出html格式的需求就十分简单了

 1         public string HtmlStatement()
 2         {
 3             StatementData statementData = CreateStatementData();
 4             return RenderHtml(statementData);
 5         }
 6 
 7         private string RenderHtml(StatementData statementData)
 8         {
 9             string result = $"<h1>Statement for {statementData.Customer} </h1>\n";
10             result += "<table>\n";
11             result += "<tr><th>play</th><th>seats</th><th>cost</th></tr>\n";
12             foreach (var perf in statementData.Performances)
13             {
14                 result += $"<tr><td>{PlayFor(perf).name}</td><td>{perf.audience}</td><td>{perf.amount}</td></tr>";
15             }
16 
17             result += "</table>\n";
18             result += $"<p>Amount owed is <em>{Usd(statementData.TotalAmount)}</em></p>\n";
19             result += $"<p>You earned <em>{statementData.TotalVolumeCredits}</em> credits </p>\n";
20             return result;
21         }
View Code

效果如下

 

标签:重构,perf,C#,StatementData,案例,statementData,result,public,string
From: https://www.cnblogs.com/flylittlebaby/p/17203472.html

相关文章

  • Games101-Cp1-Transformation
    最近为了求职重新开始把图形学相关的内容重新系统的学习,先把Games101的内容入门,然后把虎书相关的内容补充。Transformation矩阵变换可以对不同坐标系之间进行转换,在这个......
  • 如何通过C++ 将数据写入 Excel 工作表
    直观的界面、出色的计算功能和图表工具,使Excel成为最流行的个人计算机数据处理软件。在独立的数据包含的信息量太少,而过多的数据又难以理清头绪时,制作成表格是数据管理的最......
  • vue react框架
      Vue、React框架的价值(共同点)组件化数据视图分离,数据驱动视图——这是核心!只关注业务数据,而不用再关心DOM变化  vdom并不快,js操作DOM才是最快的但“数据......
  • 关于c#泛类型参数T的约束
    c#支持泛式编程,在我们定义泛型类时,可以加入泛类型参数T的约束。为什么需要参数约束呢,官方是这么说的:如果要检查泛型列表中的某个项以确定它是否有效,或者将它与其他某个项......
  • 类型参数的约束(C# 编程指南)
    类型参数的约束(C#编程指南)VisualStudio2005 其他版本 38(共55)对本文的评价是有帮助 - 评价此主题  在定义泛型类时,可以对客户端代码能够在实例......
  • SQLAlchemy
    SQLAlchemy是Python著名的ORM工具包。通过ORM,开发者可以用面向对象的方式来操作数据库,不再需要编写SQL语句。本篇不解释为什么要使用ORM,主要讲解SQLAlchemy的用......
  • CCF 2017-12
    一:试题编号:2017-12-1试题名称:最小差值时间限制:1.0s内存限制:256.0MB问题描述:问题描述 给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。输入格式......
  • 不支持设置运行目录主机thinkphp伪静态使用方法.htaccess
    不支持设置运行目录主机thinkphp伪静态使用方法.htaccess资源宝分享:​​www.httple.net​​<IfModulemod_rewrite.c>RewriteEngineonRewriteBase/RewriteCond%{REQUEST_......
  • 【WebRtc】获取媒体设备信息
    加载设备信息页面加载完设备信息页面Code/***加载当前设备的音视频信息*/initInnerLocalDevice(){letthat=this;//判断是否支......
  • sockutil
    //commsocket.h#ifndef__COMMSOCKET__H#define__COMMSOCKET__H#ifdef__cplusplusextern‘C‘{#endif#defineERR_EXIT(m)do{perror(m);......