重构-简化条件语句的使用

‘代码写了几年后,每每遇到看不下的代码,却又苦于找不到好的优化改善的办法,只能用读书少,读码少来挖苦自己了~’

当你在代码里看到一堆if-else,并且还嵌套的时候,第一反应一定是我去喝杯水吧,否则要吐了。今天先把Martin Fowler的原文搬上来,自己的例子后补

1. Decompose Condition(分解条件表达式)

从if,then,else三个段落中分别提炼出独立函数

if(date.before(SUMMER_START) && date.after(SUMMER_END)){
    charge = quantity*_winterRate+ _winterServiceCharge;
}
else{
    charge = quantity*_summerRate;
}

改造成

if(notSummer(date)){
    charge = winterChange(quantity);
}
else{
    charge = summerChange(quantity)
}

private boolean notSummer(Date date){
    return date.before(SUMMER_START) && date.after(SUMMER_END);
}

private double winterChange(int quantity){
    return quantity*_winterRate+ _winterServiceCharge;
}

private double summerChange(int quantity){
    return quantity*_summerRate;
}
2. 合并条件表达式

当有一系列的条件测试,都去执行相同的代码或者返回相同的结果时,把这些条件抽取到一个函数中,用逻辑运算联系起来

double disabilityAmount(){
    if(_seniority<2)return 0;
    if(_monthsDisabled > 12)return 0;
    if(_isPartTime) return 0;
}

改成

double double disabilityAmount(){
    if(isNotEligibleForDisability())return 0;
}

private boolean isNotEligibleForDisability(){
    return (_seniority<2)||(_monthsDisabled > 12)||(_isPartTime);
}
3. 合并重复的条件片段

如果在不同的分支里执行了相同的代码,则考虑将这样的代码放在条件之外执行

4. 移除控制标记

我们经常会写一些标记来传递结果或者用以记录判断何时停止的控制标示,将这种情况替换成break或者continue,或者return语句

void checkSecurity(String[] people){
    boolean found = false;
    if(int i=0;i<people.length;i++){
        if(!found){
            if(people[i].equals("Don")){
                sendAlert();
                found = true;
            }
            if(people[i].equals("John")){
                sendAlert();
                found = true;
            }
        }
    }
}

改成

void checkSecurity(String[] people){
    if(int i=0;i<people.length;i++){
        if(people[i].equals("Don")){
            sendAlert();
            break;
        }
        if(people[i].equals("John")){
            sendAlert();
            break;
        }
    }
}
5. Replace Nested Conditional with Guard Clauses

如果满足一个条件就能退出整个函数,则直接返回,不要在用else一层层去嵌套

double getPayAmount(){
    double result;
    if(_isDead){
        result = deadAmount();
    }else{
        if(_isSeparated){
            result = separatedAmount();
        }else{
            result = normalAmount();
        }
    }
}

改成

double getPayAmount(){
    double result;
    if(_isDead)return deadAmount();
    if(_isSeparated)return separatedAmount();
    return normalAmount();
}

Tips:有的时候可能你还得把条件做一次反转,如果它不能标示一个出口的时候,那它的反面也许是可以的。

6. 以多态取代条件表达式

如果根据不同的对象类型而选择不同的行为时,就可以把条件表达式的分支放进子类复写的函数中,然后将原始函数定义为抽象函数

7. 引入Null对象

之前傻乎乎的用了一个ListUtils#EMPTY_LIST。还想往里面put元素。今天看到这个,才知道NULL Object的设计模式。
学习下这个类就ok。
org.apache.commons.collections.ListUtils#EMPTY_LIST

空对象一定是个常量,它的任何成员都不会发生变化。

8. 引入断言

如果某段代码执行的条件一定要满足某个条件的话,那个该条件不被满足的时候就可以执行抛出异常。因此可以直接用断言语句进行判断,从而减少条件语句的使用。

### Zabbix与Grafana集成的配置指南 #### 1. 安装必要的组件 为了实现 Zabbix 和 Grafana 的集成,首先需要确保两个系统的正常运行。如果尚未安装这些工具,请按照官方文档完成安装。 - **Zabbix**: 可通过官方文档获取详细的安装指导[^1]。 - **Grafana**: 确认已成功安装并能够访问其 Web 界面。默认情况下,Grafana 的配置文件路径为 `/etc/grafana/grafana.ini`[^2]。 --- #### 2. 使用插件支持 Zabbix 数据源 Grafana 提供了一个专门用于连接 Zabbix 的数据源插件——**Grafana-Zabbix 插件**。以下是具体操作步骤: ##### (a) 安装 Grafana-Zabbix 插件 可以通过以下命令在线安装该插件: ```bash grafana-cli plugins install alexanderzobnin-zabbix-app ``` 重启 Grafana 后生效: ```bash sudo systemctl restart grafana-server ``` ##### (b) 配置 Zabbix 数据源 登录到 Grafana 的 Web 界面后,在左侧导航栏中依次选择 `Configuration -> Data Sources`,然后点击 `Add data source` 并选择 `Zabbix`。 填写以下参数: - **Name**: 自定义名称(如 “Zabbix DS”) - **URL**: Zabbix API 地址(例如 http://your_zabbix_server/zabbix/api_jsonrpc.php) - **Access**: 推荐设置为 `Proxy` - **Basic Auth**: 如果启用了基本认证,则勾选此选项,并输入用户名和密码 - 测试连接以验证配置是否正确 --- #### 3. 创建仪表盘展示 Zabbix 数据 在成功添加 Zabbix 数据源之后,可以在 Grafana 中创建新的仪表盘来可视化来自 Zabbix 的指标。 ##### (a) 导入现有模板 Grafana 社区提供了一些预构建的 Zabbix 模板,可以直接导入使用。进入 `Dashboards -> Import` 页面,上传 JSON 文件或者指定模板 ID 即可加载相关内容。 ##### (b) 手动设计面板 对于特定需求,也可以手动添加图表。选择所需的时间序列数据项,并调整显示样式以满足业务分析的要求。 --- #### 4. 考虑替代方案 虽然上述方法实现了基础功能,但在某些复杂场景下可能还需要额外的支持工具或架构优化。例如: - 若希望进一步增强灵活性,可以选择基于 Prometheus 生态圈的产品组合,比如 Nightingale[^3] 或 RocketMQ Exporter[^5]; - 对于数据库性能监控任务而言,采用 Telegraf + InfluxDB + Grafana 架构也是一种常见实践方式[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值