结构化编程的三重境界:见山是山:朴素的直观逻辑编程
2009-06-21 09:06
337 查看
《五灯会元》卷十七中,有一则青原惟信禅师的语录:“老僧三十年前未参禅时,见山是山,见水是水。及至后来亲见知识,有个入处,见山不是山,见水不是水。而今得个休歇处,依前见山只是山,见水只是水。”这描述了我们对世界的一个观察和思考的过程,只要我们对事物进行执着的观察和思考,那在认识事物的过程中总是会经过以上的三个不同的过程和境界。
我们在本节,将通过一个案例描述作为程序员应如何对待结构化编程的思考。首先描述业务:在酒店退房业务中有如下业务规则:按酒店的住房规则客户过夜算一天,次日12时以后、18时以前办理退房手续者,酒店加收半天房费;次日18时以后办理退房手续者,加收一天房费。现在我们将按这个业务规则编写一段程序来计算用户住了几天。
在编写具体的代码前,一般笔者的建议是先想一想你要做什么?不要想都不想就开始编写代码,如果是这样的话,你所有的代码都将是无效,或者很难管理。
从需求分析,在酒店退房的业务中至少需要以下数据:入住日期,退房日期,住了多少天。然后计算从入住日期到退房日期过了几个晚上,再以及退房日期的具体时间,计算是否要多算天数。我们按最朴实的逻辑出发,编写第一次的代码。
static void Main(string[] args)
{
DateTime indate = new DateTime(2008, 9, 30); //入住时间
DateTime outdate = new DateTime(2008, 10, 5); //退房时间
double days = (outdate - indate).Days; //计算入住了几天
if (outdate.Hour <= 12) //在12点之前
{
days += 0;
}
if (outdate.Hour > 12 && outdate.Hour <= 18) //在12点和18点之间
{
days += 0.5;
}
if (outdate.Hour > 18) //在18点之后
{
days++;
}
System.Console.WriteLine("你的入住结算信息\n入住时间{0}\n退房时间{1}\n一共入住了{2}天", indate, outdate, days);
}
从结果的输出可以了解到,客户是在2008年9月30日午夜入住,在2008年10月5日午夜退房(这个入住退房时间实在诡异啊),我们的程序计算得到客户住了5天,这个数据和我们预期的数据是一样的。
但如果我们将退房时间改成以下数据
DateTime indate = new DateTime(2008, 9, 30); //入住时间
DateTime outdate = new DateTime(2008, 10, 5, 12, 15, 12); //退房时间
你会惊讶的发现不是我们预期的5.5天,而依然是5天。换句话说,当退房时间是12点15分12秒的时候,程序的逻辑没有进入到以下的判断
if (outdate.Hour > 12 && outdate.Hour <= 18)//在12点和18点之间
{
days += 0.5;
}
冷静的想想,其实计算机并没有做错,的确是我们的逻辑有漏洞。虽然现在退房时间超过了12点,但该日期时间的小时部分的值还是12,因此出现了我们不乐意见到的逻辑错误。所以我们得到一个概念:DataTime结构的Hour成员的值不是我们通常意义上的几点钟,而是时间的小时部分的值。具体是否一个整时,需要我们自己进行判断和处理。
我们在本节,将通过一个案例描述作为程序员应如何对待结构化编程的思考。首先描述业务:在酒店退房业务中有如下业务规则:按酒店的住房规则客户过夜算一天,次日12时以后、18时以前办理退房手续者,酒店加收半天房费;次日18时以后办理退房手续者,加收一天房费。现在我们将按这个业务规则编写一段程序来计算用户住了几天。
在编写具体的代码前,一般笔者的建议是先想一想你要做什么?不要想都不想就开始编写代码,如果是这样的话,你所有的代码都将是无效,或者很难管理。
从需求分析,在酒店退房的业务中至少需要以下数据:入住日期,退房日期,住了多少天。然后计算从入住日期到退房日期过了几个晚上,再以及退房日期的具体时间,计算是否要多算天数。我们按最朴实的逻辑出发,编写第一次的代码。
static void Main(string[] args)
{
DateTime indate = new DateTime(2008, 9, 30); //入住时间
DateTime outdate = new DateTime(2008, 10, 5); //退房时间
double days = (outdate - indate).Days; //计算入住了几天
if (outdate.Hour <= 12) //在12点之前
{
days += 0;
}
if (outdate.Hour > 12 && outdate.Hour <= 18) //在12点和18点之间
{
days += 0.5;
}
if (outdate.Hour > 18) //在18点之后
{
days++;
}
System.Console.WriteLine("你的入住结算信息\n入住时间{0}\n退房时间{1}\n一共入住了{2}天", indate, outdate, days);
}
从结果的输出可以了解到,客户是在2008年9月30日午夜入住,在2008年10月5日午夜退房(这个入住退房时间实在诡异啊),我们的程序计算得到客户住了5天,这个数据和我们预期的数据是一样的。
但如果我们将退房时间改成以下数据
DateTime indate = new DateTime(2008, 9, 30); //入住时间
DateTime outdate = new DateTime(2008, 10, 5, 12, 15, 12); //退房时间
你会惊讶的发现不是我们预期的5.5天,而依然是5天。换句话说,当退房时间是12点15分12秒的时候,程序的逻辑没有进入到以下的判断
if (outdate.Hour > 12 && outdate.Hour <= 18)//在12点和18点之间
{
days += 0.5;
}
冷静的想想,其实计算机并没有做错,的确是我们的逻辑有漏洞。虽然现在退房时间超过了12点,但该日期时间的小时部分的值还是12,因此出现了我们不乐意见到的逻辑错误。所以我们得到一个概念:DataTime结构的Hour成员的值不是我们通常意义上的几点钟,而是时间的小时部分的值。具体是否一个整时,需要我们自己进行判断和处理。
相关文章推荐
- 结构化编程的三重境界:见山是山:朴素的直观逻辑编程
- 结构化编程的三重境界:见山是山:朴素的直观逻辑编程
- 结构化编程的三重境界:见山还是山:朴素又正确的逻辑
- 结构化编程的三重境界:见山还是山:朴素又正确的逻辑
- 结构化编程的三重境界:见山还是山:朴素又正确的逻辑
- 结构化编程的三重境界:见山不是山:正确但冗余的逻辑
- 结构化编程的三重境界:见山不是山:正确但冗余的逻辑
- 结构化编程的三重境界:见山不是山:正确但冗余的逻辑
- 编程的最高境界,就是在写逻辑而不是在写代码
- 用心理学分析程序员编程能力的四种境界
- 系统架构逻辑参考图【强调了领域模型+面向服务编程理念】
- 【编程规范系列】if 语句中的关系表达式/逻辑表达式
- 【算法学习】求两数组求差数(Java,三重境界)
- 编程能力的四种心理境界 你属于那一种?
- 编程能力的四种境界
- 用编程解决 公务员考试 中的逻辑推理题
- 顺序性,一致性,原子性:现代多核体系结构与原子操作·CAS与自旋锁·自旋锁与并发编程的原语·语句原子性和编程逻辑的原子性·行锁与数据库事务原子性·binlog与数据库同
- 编程要准确理解程序里面的逻辑
- 1.4编程基础之逻辑表达式与条件分支----学生出错情况及解决方法汇总
- 编程能力的四种境界[转]