编程的艺术:不嵌套主义
编程的艺术 不嵌套主义
之前不记得是在哪里看到的这个不嵌套主义,貌似是在B站上看到的,算是我看了这么多和编程相关的meme里面对我影响最大的。
是什么?
什么是不嵌套主义?准确的说 不嵌套主义 并不是不让你缩进,而是针对代码的结构而言,要尽量少使用嵌套关系,而尽量去使用断言,或者说将其当成一个单独的代码块去操作。
比较常见的方式是将报错提前,而不是用“未报错则继续运行”的模式去进行。
怎么做?
什么意思?让我们来阅读一段代码
//嵌套1
if (clsTeachServerInfo)
{
strValue = clsTeachServerInfo->WsSvrAddr;
//嵌套2
if (!System::String::IsNullOrEmpty(strValue))
{
intValue = strValue->IndexOf(":");
//嵌套3
if (intValue > 0)
{
strTeachServerIp = strValue->Remove(intValue);
strTeachServerPort = strValue->Substring(intValue + 1);
this->DebugMessage("CloudPreparation.Initialize " + strTeachServerIp + " " + strTeachServerPort);
PublicObjects::CloudPreparation->Initialize(strTeachServerIp, strTeachServerPort);
}
}
}
我们可以看到这一段代码,里面有三层嵌套的代码,这就会导致整个代码变得非常的庞大和臃肿,不仅对写代码的用户不友好,对维护代码的用户更是压力山大。
或者我们换一个角度来看这段代码,如果是不满足嵌套的条件,会发生什么?实际上什么都不会发生对不对?也就是说我们从上往下走代码,这个嵌套唯一代表的含义就是:如果在几个判断中有一个失败了,则代码不会走到下一步去。
那我们能不能换一种思路,我们把判定失败的情况提前,让它单独去进行判断,然后用一个bool值去做判断,或者精简一点直接return掉,那这样代码的可读性会不会好很多呢?
让我们来看一段功能类似的代码:
QString strValue;
QString title = "InitTeachServerInfo";
if (SysID.isEmpty()) {
this->eLog(title, "SysID is Empty");
return;
}
CloudPlatformSubsystem_cpp cls_TeachServerInfo;
cls_TeachServerInfo = ptr->GetSubSysAddr(SysID.toStdString());
if (cls_TeachServerInfo.SubjectID.empty()) {
//判定这个是否为空
this->eLog(title, "cls_teachServerInfo return null");
return;
}
strValue = QString::fromStdString(cls_TeachServerInfo.WsSvrAddr);
if (strValue.isEmpty()) {
this->eLog(title, "WsSvrAddr return Error");
return;
}
QStringList list = strValue.split(':');
if (list.size() == 0) {
this->eLog(title, "list's size is zero");
return;
}
虽然这也写可能代码稍微会长一点,但是其可读性比之前算的上是显著性地高上了不少。
就我个人而言,有时候代码写的时候可以稍微啰嗦一点多写一点,但是这也写的代码逻辑结构清晰很多,可读性也强,不管是维护也好还是调试也好,都会大大降低查错的难度