编程的艺术:不嵌套主义

发布时间 2023-03-22 19:13:35作者: 轩先生。

编程的艺术 不嵌套主义

之前不记得是在哪里看到的这个不嵌套主义,貌似是在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;
}

虽然这也写可能代码稍微会长一点,但是其可读性比之前算的上是显著性地高上了不少。

就我个人而言,有时候代码写的时候可以稍微啰嗦一点多写一点,但是这也写的代码逻辑结构清晰很多,可读性也强,不管是维护也好还是调试也好,都会大大降低查错的难度