🌂 简化偶数判断程序

温故而知新,今天我们继续加强对分支结构的练习。

还记得第一个分支程序吗,根据不同数字输出是否为偶数:

var x = 5;
if (x % 2 == 0){
  console.log(x, "是偶数");
} else {
  console.log(x, "不是偶数");
}

那上面的程序如何用三目运算符进行精简呢?

我们可以声明一个 msg 变量用来表示要输出的信息,然后用三木运算符进行条件判断和求值。

var x = 7;
var msg = ( x % 2 == 0 ) ? "是偶数" : "不是偶数";
console.log( x, msg );

点击运行检查下结果是否正确。


进入下一页

🌂 水费计算程序

家庭用水的水费属于分段计价,假设逻辑如下,看下如何写一个程序根据用水量计算水费:

✨ 自己先做一下之后再看后面答案吧!

var x = 15;
var money = 0;

if ( x > 0 && x <= 15 ) {
    money = 4 * x / 3;
} else {
    money = 2.5 * x - 10.5;
}

console.log('您需支付水费', money, '元');

这里 x 表示用水量,money 表示水费,money 会在不同的分支里做不同的计算和赋值。


进入下一页

🌂 出租计费程序

再来个出租车计费程序:

先分析一下,这种计费是典型的分阶段计费,不同阶段有不同的计费, 首先想到的就是用 if 语句做三个分支,不同分支里做不同的计算,如下:

var m = 11; // 公里数
var money = 0; // 出租车费

if (m <= 5) {
  money = 5;
} else if (m <= 9 ) {
  money = 5 + (m - 5) * 2;
} else {
  money = 5 + (9 - 5) * 2 + ( m - 9 ) * 3;
}

console.log('您需支付', money, '元车费' );

可以看到上面的代码每个分支里都只有一条赋值语句,赋值语句的表达式负责计算这个分支下整个的车费, 比如第二个条件分支里,就是把 5 公里内的车费 5,再加上 5 公里之后的车费 (m - 5) * 2

提示:Javascript 程序里双斜杠 // 后面的文字属是注释部分,用于给阅读代码的人看,计算机会自动忽略。

给程序加适当的注释是一个好的编码习惯,这有助于提高代码的可读性, 比如程序里有很多变量,就可以在变量后增加变量说明的注释。


进入下一页

🌂 代码优化

思考下,上面的出租车计费程序,有哪些可以优化的地方吗,或者有其它实现思路吗?

首先想到的就是每阶段的定价可以用变量表示,比如下面超过 5 公里的定价,每公里 2 元,就分散在两个分支的代码里。 如果定价变化了,就要修改两个地方,所以我们可以把每阶段的定价提取成变量,这样如果定价修改后,只需要修改变量的值就可以了。

再就是这个数字 2 对于不了解情况的人并不知道它是什么意思,这样的数字叫魔法数字,在编码里是不提倡的。

var m = 11; // 公里数
var money = 0; // 出租车费

var basePrice = 5; // 5 公里内总计费
var lt9Price = 2; // 9 公里内超出部分单价
var gt9Price = 3; // 大于 9 公里每公里单价

if (m <= 5) {
  money = basePrice;
} else if (m <= 9 ) {
  money = basePrice + (m - 5) * lt9Price;
} else {
  money = basePrice + (9 - 5) * lt9Price + ( m - 9 ) * gt9Price;
}

console.log('您需支付', money, '元车费' );

我们加了 3 个变量分别表示不同阶段的单价,其中 ltless than 的缩写, gtgreater than 的缩写。 这样优化过的代码 可维护性 就好一些了,底价或单价修改了只需要修改一处代码即可。


进入下一页

🌂 继续优化

还能优化吗,再看下代码,有什么规律没有。那就是每个分支的计算里,前半部分是上一个分支的计算结果。 所以我们换个思路,可以把每阶段的公里数求出来,最后一次得出最终的计费价格,如下。

var m = 11; // 公里数
var money = 0; // 出租车费

var basePrice = 5; // 底价
var lt9Price = 2; // 9 公里内每公里单价
var gt9Price = 3; // 大于 9 公里每公里单价

var lt9Km = 0; // 5 公里到 9 公里之间的公里数
var gt9Km = 0; // 超过 9 公里的公里数

if (m > 9) {
    lt9Km = 9 - 5;
    gt9Km = m - 9;
} else if (m > 5) {
    lt9Km = m - 5;
}

money = basePrice + lt9Km * lt9Price + gt9Km * gt9Price;

console.log('您需支付', money, '元车费' );

这样优化后,代码更清晰一些,因为每阶段的公里数和单价前面都计算出来了, 所以只需要一个简单的数学求和便可以求出最终费用。


进入下一页

🌂 还能优化吗?

看下,上面的程序,还是有一些魔法数字的,要想办法消除它。 我们需要抽象下分段计费的逻辑,就把它分为第一阶段,第二阶段等, 并把每阶段的起始点,单价,实际公里数用变量来表示。

看下代码:

var m = 11; // 公里数
var money = 0; // 出租车费

var basePrice = 5; // 底价
var step1Price = 2; // 第一阶梯每公里单价
var step2Price = 3; // 第二阶梯每公里单价

var step1Km = 0; // 第一阶梯公里数
var step2Km = 0; // 第二阶梯公里数

var step1Begin = 5; // 第一阶段起始点
var step2Begin = 9; // 第二阶段起始点

if (m > step2Begin) {
    step1Km = step2Begin - step1Begin;
    step2Km = m - step2Begin;
} else if (m > step1Begin) {
    step1Km = m - step1Begin;
}

money = basePrice + step1Km * step1Price + step2Km * step2Price;

console.log('您需支付', money, '元车费' );

经过上面的优化,代码更加的清晰和可维护,如果新加一个分段计费, 只需要加几个变量和分支,最后修改下求和表达式即可。


进入下一页

小结

今天用多个练习巩固了对分支程序的理解和使用,同时看到一个出租车计费程序不断优化的过程, 目的就是为了让代码更有可读性,可维护性,这在程序设计里很重要,要多看几遍体会下。


完成本节学习