结构化编程的三重境界:见山还是山:朴素又正确的逻辑

简介:

在上述的隔夜退房的逻辑代码中,我们用了五个嵌套,其中有五个计算,但实际上只有3种不同的计算,在这样的模式下,我们值得思考,是不是代码过于冗余了。

 

现在我们把隔夜代码改为如下

 
  1. //隔夜退房  
  2. if (outdate.Hour <= 11 || outdate.Hour == 12 && IsZeroTime(outdate))    //12点整之前(含12点整)  
  3. {  
  4.     days += 0;                                                //当天不计算房费  
  5. }  
  6. else 
  7. {                                                        //下午18点整之前(含18点整之前)  
  8.     if (outdate.Hour <= 17 || outdate.Hour == 18 && IsZeroTime(outdate))      
  9.     {  
  10.         days += 0.5;                                        //加收半天房费  
  11.     }  
  12.     else                                                    //下午18点整之后  
  13.     {  
  14.         days++;                                            //加收一天房费  
  15.     }  
  16. }  

不必惊讶,你仔细看看,以上的代码就完成了我们原先冗余的隔夜退房逻辑,而这样的逻辑和我们原先描述的退房业务逻辑正好在语义上完全符合。

通过正确的结构化编程,我们可以消除原先复杂冗余的代码,让程序更加清晰可靠。

 

下面添加了对日期合法性(入住日期不能大于退房日期)的判断,但系统的整体也没有比我们原先冗余逻辑要复杂。

 
  1. static void Main(string[] args)  
  2. {  
  3.  
  4.     DateTime indate = new DateTime(2008, 10, 5, 19, 12, 0);        //入住时间  
  5.     DateTime outdate = new DateTime(2008, 10, 5, 19, 13, 0);        //退房时间  
  6.  
  7.     double days = (outdate.Date - indate.Date).Days;            //计算入住了几天  
  8.  
  9.     if (days < 0)                                        //日期错误  
  10.     {  
  11.         days = 0;  
  12.     }  
  13.     else 
  14.     {  
  15.         if (days == 0)                                    //同天退房  
  16.         {  
  17.             days += (outdate - indate).TotalHours <= 12 ? 0.5 : 1;  
  18.         }  
  19.         else                                            //隔夜退房  
  20.         {                                                //12点整之前(含12点整)  
  21.             if (outdate.Hour <= 11 || outdate.Hour == 12 && IsZeroTime(outdate))          
  22.             {  
  23.                 days += 0;                                //当天不计算房费  
  24.             }  
  25.             else 
  26.             {                                            //下午18点整之前(含18点整之前)  
  27.                 if (outdate.Hour <= 17 || outdate.Hour == 18 && IsZeroTime(outdate))      
  28.                 {  
  29.                     days += 0.5;                            //加收半天房费  
  30.                 }  
  31.                 else//下午18点整之后  
  32.                 {  
  33.                     days++;                                //加收一天房费  
  34.                 }  
  35.             }  
  36.         }  
  37.     }  
  38.     System.Console.WriteLine("你的入住结算信息/n入住时间{0}/n退房时间{1}/n一共入住了{2}天", indate, outdate, days);  
  39. }  

上述代码中的

days += (outdate - indate).TotalHours <= 12 ? 0.5 : 1;

采用了三目表达式,该表达式的含义是:如果(outdate - indate).TotalHours <= 12的逻辑为真则返回0.5,否则返回1。简化了if else的语句。

 

所以说一段优秀的代码必然是具有高度的可维护性,而可维护性的代码其实就是能最朴素的表达我们业务的代码,不过这个朴素描述应该是正确演绎了逻辑的见山不是山的境界了。


本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/805172


相关文章
离散数学-考纲版-01-命题逻辑
离散数学-考纲版-01-命题逻辑
《运筹学基础》——第一遍通读
《运筹学基础》——第一遍通读
《运筹学基础》——第一遍通读
|
11月前
四道好题分享(看似简单,但是棘手)
四道好题分享(看似简单,但是棘手)
68 0
【离散数学】命题逻辑
1. 命题 2. 联结词 3. 真值表 4. 等价公式 5. 蕴含式 6. 对偶式 7. 范式 8. 推理理论
233 0
【离散数学】命题逻辑
再学一道算法题: 食物链(带权并查集)
再学一道算法题: 食物链(带权并查集)
再学一道算法题: 食物链(带权并查集)
再学一道算法题: 寻找大富翁
再学一道算法题: 寻找大富翁
|
设计模式 开发框架 JSON
了解这些软件设计思想,你的思维至少上升一个段位
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念,四位作者合称 GOF(全拼 Gang of Four),简称四人帮!
|
算法 Shell 决策智能
只用一行代码就能搞定,博弈论究竟是什么神仙算法?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 博弈论是一门很庞大的学科,它算是数学的一个分支,也和运筹学甚至是经济学有关。虽然它严格说起来并不是算法领域的内容,但是有不少关于博弈论有趣的算法和问题。
微积分的思想-化繁为简
你知道计算器如何求解三角函数么?你知道计算器如何求解1.1的0.1次方么?你知道如何把圆周率π精确到任意小数点位么? 我们今天就以这三个经典的小问题展开,一起探究微积分的思想。
3203 0

相关实验场景

更多