深入理解条件控制语句 :if-else

有很多人有疑问,为什么程序员工资那么高,写的代码还有bug呢?

在这里插入图片描述
原因当然非常多,其中一个重要原因是“软件不能百分百反映复杂、模糊现实世界”。

软件是现实世界在计算机世界的反映,基于抽象、简化的模型实现的软件不能100%反映现实世界,当用户发现软件与现实不符时,bug就出现了。

从这个角度看,这是一个无法解决的矛盾,在计算机世界里,bug只能被发现、修复,不可能消灭

尽管不存在没有bug的软件,软件是人类不可或缺的工具早已成为不可置否的事实。其原因就是软件能够相当大程度反映真实世界的复杂度,而条件控制语句if-else是软件解决复杂度的重要手段

一、if-else基础

1.1 什么是if-else语句?

if-else语句是一种二分支选择结构,用于根据条件的真假来决定执行哪一段代码。其基本语法如下:

if (条件) {
    // 条件为真时执行的代码块
} else {
    // 条件为假时执行的代码块
}

1.2 语法解析

  • if关键字后面跟一个圆括号(),里面放置条件表达式。这个表达式的计算结果必须是一个布尔值(truefalse)。
  • 圆括号之后是一对大括号{},里面包含当条件为真时需要执行的代码块。
  • else关键字后面也跟着一对大括号,里面包含当条件为假时执行的代码块。

1.3 示例:根据成绩判断等级

假设我们需要编写一个程序,根据学生的考试分数判断其成绩等级(A: 90-100, B: 80-89, C: 70-79, D: 60-69, F: <60)。这是一个非常适合使用if-else结构的问题。

public class GradeCalculator {
    public static void main(String[] args) {
        int score = 85; // 假设学生分数为85分
        
        if (score >= 90 && score <= 100) {
            System.out.println("Grade: A");
        } else if (score >= 80 && score < 90) {
            System.out.println("Grade: B");
        } else if (score >= 70 && score < 80) {
            System.out.println("Grade: C");
        } else if (score >= 60 && score < 70) {
            System.out.println("Grade: D");
        } else {
            System.out.println("Grade: F");
        }
    }
}

在这里插入图片描述

在这个示例中,我们首先定义了一个变量score来存储学生的分数。然后,通过一系列嵌套的if-else if语句检查分数范围,并根据范围输出相应的成绩等级。最后的else语句用来处理所有不满足上述条件的情况,即分数低于60分的情况。

二、嵌套if-else与多条件判断

2.1 嵌套if-else

在某些情况下,可能需要在满足一个条件后,再基于另一个条件进行判断,这时就需要使用嵌套的if-else结构。

2.2 示例:年龄和身高的游乐设施限制

考虑一个游乐园入口检查系统,规则如下:只有年龄大于等于12岁且身高超过140cm的游客才能乘坐过山车。这个需求可以通过嵌套的if-else来实现。

public class AmusementPark {
    public static void main(String[] args) {
        int age = 13;
        int height = 145; // 假设游客年龄为13岁,身高为145cm
        
        if (age >= 12) {
            if (height > 140) {
                System.out.println("欢迎乘坐过山车!");
            } else {
                System.out.println("抱歉,您的身高未达到要求。");
            }
        } else {
            System.out.println("抱歉,您未满12岁,不能乘坐过山车。");
        }
    }
}

2.3 多重条件判断与switch-case比较

虽然可以通过多个else if来实现多条件判断,但在某些特定场景下,使用switch-case语句可能更为简洁。不过,由于本节重点是if-else,这里仅提及switch-case作为一种替代方案,它适用于等值判断的场景,而if-else则更加灵活,能处理更复杂的逻辑判断。

三、最佳实践

3.1 简洁清晰的代码

尽量保持if-else结构的简洁性,避免过深的嵌套,嵌套过深,可能有如下问题:

①可读性降低

理解难度增加:随着嵌套层数的增加,阅读和理解代码的逻辑路径变得越来越困难。开发者需要跟踪每一层的条件判断,这在复杂的逻辑中很容易出错。

代码维护困难:后期维护时,对某一层条件的修改可能会影响到其他层级,增加了修改出错的风险。同时,查找和定位错误也变得更加耗时。

②可维护性下降

耦合度提高:深嵌套的if-else往往意味着各个条件判断之间存在较高的逻辑耦合,这违反了编程中的低耦合原则,使得代码难以重构和模块化。

扩展性受限:新的条件加入或现有条件的变化可能导致原有结构更加复杂,难以灵活应对需求变化。

③性能影响

执行效率:理论上,虽然现代编译器能够优化一些嵌套逻辑,但极端情况下,深度嵌套的条件判断可能增加程序的执行路径,影响运行效率。

资源消耗:特别是在递归或循环内部的嵌套if-else,可能会不必要地增加栈的使用,影响内存资源。

④调试难题

调试复杂度:当程序在深层嵌套的条件中出现问题时,调试和定位bug会非常困难。每增加一层嵌套,就相当于增加了一个可能出错的点。

逻辑混乱:过多的嵌套容易让人迷失在条件的海洋里,难以快速准确地判断程序的执行流程。

对于复杂逻辑,可以考虑使用函数策略模式进行分解。

3.2 不要省略大括号

在Java编程中,虽然单行if-else语句可以不使用大括号{}来包裹执行语句,这种做法在代码简洁性上看似有优势,但实际上却隐藏着风险,容易导致意料之外的逻辑错误,尤其是在团队协作或长期维护的项目中。

下面通过一个具体的例子来说明这种情况如何导致线上事故。

电商系统中,有一个促销活动的代码片段,目的是在用户购物车中的商品总价超过1000元时给予10%的折扣,否则不给予任何折扣。

问题代码:

double cartTotal = 1200; // 假设购物车总金额为1200元
double payAmount = 1200; // 实际金额,默认等于总金额
double discount = 0;  // 折扣,默认为0
if (cartTotal > 1000) // 省略了大括号
    log.info("金额大于1000元,打9折");
    discount = cartTotal * 0.1; // 问题代码:无论是否满足条件都享受折扣
payAmount = (cartTotal - discount)); // 打印折扣后的价格

问题分析:

这段代码的本意是在满足条件时计算折扣并打印折扣后的价格,但由于省略了大括号,实际上不论条件是否满足,折扣逻辑都会被执行,显然这在逻辑上是错误的,会导致资金的损失。看似简单的问题,但很容易忽略,不一定能很快定位到问题。

正确代码:

double cartTotal = 1200; // 假设购物车总金额为1200元
double payAmount = 1200; // 实际金额,默认等于总金额
double discount = 0;  // 折扣,默认为0
if (cartTotal > 1000) { // 大括号
    log.info("金额大于1000元,打9折");
    discount = cartTotal * 0.1; //  满足条件才享受折扣
}
payAmount = (cartTotal - discount)); // 打印折扣后的价格
  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值