如何简洁实现三字符串全空或全非空校验的If-else逻辑
字符串校验逻辑精简方案
你的业务规则本质是要求三个字符串的空状态完全一致:要么全部为空,要么全部非空;状态不合法时需要明确列出所有为空的字符串。原实现存在两处冗余:外层多余的「是否存在非空字符串」分支判断,以及三段完全重复的空值检查逻辑,可以按以下方式优化。
基础精简版(无嵌套、无重复代码)
去掉多余的外层嵌套,把重复的检查逻辑抽成简单的可调用块,逻辑和原实现100%等价但可读性更高:
#include <iostream> #include <string> // 假设string1、string2、string3为已定义的std::string变量 bool invalid = false; auto check_str = [&](const std::string& s, const char* s_name) { if (s.empty()) { invalid = true; std::cout << s_name << " is empty\n"; } }; check_str(string1, "string1"); check_str(string2, "string2"); check_str(string3, "string3"); // 排除三个全空的合法场景,其余存在空字符串的情况均为非法 bool all_empty = string1.empty() && string2.empty() && string3.empty(); if (invalid && !all_empty) { return 0; } // 校验通过,执行业务逻辑 // do something
可扩展版(适配后续新增校验项的场景)
如果后续可能增加更多需要遵循同规则校验的字符串,可以把待校验项和对应的展示名结构化存储,通过循环完成检查,避免新增重复代码:
#include <iostream> #include <string> #include <utility> // 后续新增校验字符串时,只需要往这个数组里加对应条目即可 std::pair<const std::string&, const char*> check_targets[] = { {string1, "string1"}, {string2, "string2"}, {string3, "string3"} }; size_t empty_count = 0; for (auto& [target, name] : check_targets) { if (target.empty()) { empty_count++; std::cout << name << " is empty\n"; } } // 空字符串数量既不是0(全非空)、也不等于总校验项数(全空)时,判定为非法 if (empty_count != 0 && empty_count != std::size(check_targets)) { return 0; } // 校验通过,执行业务逻辑 // do something
逻辑覆盖说明
两种实现都完全满足业务要求:
- 三个字符串全空:无报错,正常进入后续业务流程
- 三个字符串全非空:无报错,正常进入后续业务流程
- 存在部分为空的情况:精准打印所有空字符串的名称,直接返回终止流程
内容的提问来源于stack exchange,提问作者ontherocks
相关产品推荐
相关产品推荐

