• 编程的艺术:不嵌套主义


    编程的艺术 不嵌套主义

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

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

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

  • 相关阅读:
    兄弟组件通信context
    零极点分析
    对接淘宝天猫平台的第一篇
    MySQL空间数据函数
    李沐的学习Pytorch环境配置
    Mysql事务日志
    Redis+SpringBoot企业版集群实战------【华为云版】
    fastapi 与 vue结合,进行前后端不分离的方式部署,返回dist文件
    SpringBoot如何缓存方法返回值?
    【翻译】rocksdb write stall
  • 原文地址:https://www.cnblogs.com/Leventure/p/17192315.html