为了账号安全,请及时绑定邮箱和手机立即绑定

[转发] 巧用数组为什么定义从0开始

标签:
设计

今天给大家分享的小技巧是跟数组下标有关的,大家可能会不太理解,数组的下标不就是从0开始连续递增的吗?并且在使用下标操作数组时下标不能越界(在C语言中是允许数组的下标越界的,但这不是今天的话题)。还有什么说的?在分享这个小技巧之前我们先来看两个问题,我们回答了这两个问题之后再来谈谈数组下标的使用技巧:

    问题一:在很多高级编程语言中通常都一些方法直接取得当前的日期,包括年、月、日,比如Java和Javascript。但这里有个问题,通常在取得的“月份”这个值时你会注意到,月份的值往往是从0到11,而不是我们日常用到1到12。我见过有朋友对这个问题很敏感,在网上写博客大骂这种机制的设计人员,认为这不过是设计人员为了写代码方便直接用“枚举”类型定义的1到12月的值,结果取出来之后还要对其加1才是我们想要的1到12。我在面试时问过很多求职者这个问题,可惜的是,目前为止还没有任何一个人能够正确的回答这个问题。我通常会问,为什么取得的月份会是0到11,这样做有什么好处?大多数的求职者的回答都是“不知道”。但也有个别超自信的人会理直气壮的回答:“没有什么好处!这样的设计用起来反而不方面,还要在月份上加1才是我想要的结果。”那么,这个问题的答案究竟是什么呢?为什么设计人员会这样设计月份的值呢?为什么无论是C语言中的日期、Java中的日期、Javascript中的日期中月份都是从0开始的呢?JDK从1.2到1.5再到1.6再到1.7及至1.8为什么还是这样的设计,没有任何变化呢?这么做到底有什么好处?这个问题我们暂时保留一会,再来看看第二个问题。

    问题二:如果我们来设计一个商城网站,订单的状态通常是这样的“未付款”、“已付款”、“已发货”、“已收货”、“交易成功”,我们通常采用一个变量status来记录这个状态值,status的取值为0、1、2、3、4,分别对应前面的这5种状态。但为什么status仍然是0~4而不是1~5呢?先别急,我们先想一下,如果我们取得了status的值并且需要将这个状态的文字描述显示在网页上那么我们应该如何编写一个函数来完成这个功能:

String getStatusName(int status)
{
// status取值范围0~4
if (0 == status)
{
return "未付款";
}
if (1 == status)
{
return "已付款";
}
if (2 == status)
{
return "已发货";
}
if (3 == status)
{
return "已收货";
}
if (4 == status)
{
return "交易成功";
}
return null;
}
如果你对上面程序中为什么不写else而写return有疑问,请参见《技巧三:妙用return语句》。或许你也在想:“可以使用switch语句来实现这个函数,它会变得更漂亮一些。”有细心的朋友会问:“说了这么多,跟数组的下标有什么关系?”答案很简单,我们来看一下下面的程序,采用数组的方式来实现同样的功能:
String[] statusName =
{ "未付款", "已付款", "已发货", "已收货", "交易成功" };
String getStatusName(int status)
{
return statusName[status];
}
看到这里你有没有一种豁然开朗的感觉?我们为什么要将status的取值定为0~4而不是1~5?因为它刚好可以做为数组的下标,通过数组的方式直接将数字转为字符串。

    下面我们回过头来看看第一个问题:

不合格的程序员通常在取得了年、月、日之后会这样显示:“2017-05-17”,甚至他还要判断取得的月份是4, 加1之后得5,为了显示格式美观,又使用if else语句判断,如果这个月份小于10,则在5的前面加一个0,显示成05……如此的繁琐。
优秀的程序员通常在取得了年、月、日之后会这样显示“2017年 五月 17日”或“May 17 2017”
于是我们参考上面问题二的解决办法,做如下的处理:

String[] monthName =
{ "January", "February", "March" …… "December"};
String getMonthName(int month)
{
return monthName[month];
}

    现在我们的两个问题都有了满意的答案,为什么很多高级语言中的月份取值都是0~11而不是1~12,我们可以在显示时将它直接做为数组的下标,不需要做任何的逻辑判断和处理。是不是非常的方便?不得不承认,这是一种高明的设计理念!非常高明!
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消