zoukankan      html  css  js  c++  java
  • 结构化编程的三重境界:见山不是山:正确但冗余的逻辑

    因此我们了解到,我们需要更加精确的判断时间的界限。因此我们重新将代码改为如下:

    Code

    上述的代码,使用了4个条件的嵌套判断,将退房的时间作了精确的判断(考虑到了分秒的临界点),同时初学的人员再次要了解到注释的重要性,以上的逻辑,如果不描写注释,估计过一个月后,你自己都不知道自己在干什么了。

    现在我们运行程序,设定以下的时间段

    DateTime indate = new DateTime(2008930);                    //入住时间
    DateTime outdate = new DateTime(2008105121512);        //退房时间

    我们程序的运行结果得到了我们乐于见到的5.5

    结构化编程,还有一个重要的概念就是模块化,我们上面的代码中对整点的判断。比如12点整

    outdate.Hour == 12 && outdate.Minute == 0 && outdate.Second == 0

    18点整

    outdate.Hour == 18 && outdate.Minute == 0 && outdate.Second == 0

    完全可以函数化,因此我们需要添加一个函数模块。

    Code

    我们新编写的IsZeroTime将判断整时的问题进行了函数(模块)化,不过初学的人要注意一点,如果一个if else 中仅处理一个问题的时候,我们完全可以优化成如下代码

    Code

    现在我们再来修改原先的逻辑主体的代码为:

    Code

    以上代码使用了IsZeroTime函数,让代码的表现能力更强更优雅。那现在是不是万事大吉呢了?我们现在看看以下的时间:

    DateTime indate = new DateTime(2008, 10, 5, 2, 12, 0);//入住时间

    DateTime outdate = new DateTime(2008, 10, 5, 12, 0, 0);//退房时间

    我们的程序告诉我们,顾客住了0天!!!

    而以下的日期

    DateTime indate = new DateTime(2008, 10, 5, 19, 12, 0);                                                        //入住时间

    DateTime outdate = new DateTime(2008, 10, 5, 19, 13, 0);                                            //退房时间

    我们的程序告诉我们,顾客住了1天!!!

    啊,那是多么不公平的事情啊,一个住了近10个小时的人计算机竟然说他可以免费,而另一个住了才1分钟的顾客,竟然要支付整整一天的房价!

    问题出在哪里呢?如果你仔细想想,就可以猜到,我们一开始的计算也许就错了。

    double days = (outdate - indate).Days;                                                                       //计算入住了几天

    原来这个Days不是计算过了几个晚上,而是两个时间的间隔,该间隔用纳秒来计算出。所以我们要使用差值来计算用户是不是过夜的话,不能简单的进行相减。不过如果我们使用些技巧就可以来解决,比如我们把两个时间都切换到午夜时间(就是午夜凶铃那个电话铃响的时间,0:0:0),那么就可以计算机出用户是否过夜了。

    double days = (outdate.Date - indate.Date).Days;                                                    //计算入住了几天

    这样的话,只要顾客不是同天退房,就会得到大于0的值,如果值是0就表示用户是同天退房的。如果用户是隔夜退房的,我们的逻辑计算照旧,否则要看看用户住的时间是否超过半天。这样才合理嘛。

    所以,我们需要把代码作些小的调正,先判断下顾客是否同天退房,如果是同天退房的话,计算他入住了几个小时:超过12小时算一天,否则算半天;如果顾客是隔天退房,那还继续保持我们原有的逻辑处理。

    Code

    现在我们可以处理同天退房和隔夜退房的不同逻辑了,我们可以看到,通过精确的控制,我们的代码可处理的能力越来越强大,不过代码也越来越复杂了,嵌套也越来越庞大。因此,我们开始反思,为了追求正确的逻辑,我们是不是走了太远了?

  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/shyleoking/p/1507616.html
Copyright © 2011-2022 走看看