每个人都可以用一张纸和一支笔来解释虫洞,为什么不呢?我会尽量让代码简单易读,包括选择合适的变量名,使用代码约定等等等等,但是还是少了点什么,理解代码不应该是理解“如何”实现它,而是了解您想要“实现”的目标。甚至可以说,读代码应该像读小说一样,而不是一大堆代码。下面讨论了三个主要主题:问题阅读其他人的代码可能会很痛苦,如果没有提供正确的上下文,我们可能会迷失在寻找函数或属性的含义中。建议无论是二进制语言、低级语言还是高级语言,语法越来越友好,以吸引更多的开发者。随着语法越来越接近英语,我们的代码也应该简洁明了。结果是编写良好的代码,读起来像小说,易于阅读和理解(即使没有给出上下文)。命名函数的正确方法是:我们编写函数时假设阅读它的人有足够的上下文来理解该函数试图实现的目标。命名含义模糊的函数比如“handleRedView()”会引起很多疑问,什么是“RedView”?这个功能主要是做什么用的?所以在某些情况下函数的目的会比较模糊,如果没有提供足够的上下文,会非常难以阅读。我们可以把函数的用途分为四类:InformerfunctionManagementfunctionRoutingfunctionExecutionfunction1.Notificationfunction通常会触发routing/managementfunction,例子如下:delegate.dataHasUpdated()funcdataHasUpdated(){//Notificationofsomethinghappening}//NotificationfunctionoverridefuncengineStarted(){super.engineStarted()handleCarStarted()}回调函数通知有事情已经/即将发生,并给予响应的机会。主要用于由委托或通知处理程序触发的操作。2、管理功能用于组合多个功能,以达到更高级的目的。它不需要依赖参数,块中的所有代码都会被执行。//管理函数funchandleCarStarted(){turnLights(on:true)turnAC(on:true)}以上函数包含了所有需要的信息,这些函数在汽车启动时执行。这个时候,我们不关注它是“如何”实现的。而是专注于它的“作用”。3、路由功能用于组合多个功能,达到更高级的目的。它需要依赖一些参数,只有在我们想执行的时候才执行。//路由函数privatefuncturnLights(onshouldTurnLightsOn:Bool){ifshouldTurnLightsOn{turnExteriorLightsOn()checkForBurnedBulbs()}else{turnExteriorLightsOff()}如果if语句只执行一件事,我喜欢写“if”“else”和执行语句在同样OK,这样代码读起来会更流畅。如果if语句只做一件事,我喜欢把“if”“else”和执行语句写在同一行,这样代码读起来更流畅。路由功能通常与指向执行功能相同,但在某些情况下,如果逻辑代码不超过一行代码,它们也可以包含自己的逻辑。4.执行函数名的具体实现。//执行函数privatefuncturnExteriorLightsOn(){leftFrontLight.isOn=truerightFrontLight.isOn=trueleftBackLight.isOn=truerightBackLight.isOn=true}privatefunccheckForBurnedBulbs(){forlightBulbinbulbswhere!lightBulb.isUseable{Dashboard.(errorType:.lights)break}},可读且易于维护的简短类。*牢记每个函数应该只有一个责任的原则。避免在函数名中使用“and”:playAndMinimize()loadAndPlay()这个坏习惯打破了单一职责原则,编写了兼顾这两种情况的代码。避免在函数名中猜测:moveRedViewIfNeeded()上面的例子会导致后续的程序员不得不深挖这个函数来理解触发RedView移动的时机,不够清晰。不,layoutIfNeeded()不是这样的,因为我们知道如果一个视图的setNeedDisplay为真,就应该重新布局。这种情况在Swift语言中很常见,因为函数基本上是应用程序私有的。注意说到代码可读性,我首先想到的是代码约定,它被普遍接受和广泛使用,但使用编码约定并不一定能提高代码质量。虽然有交叉应用,但可读性较差。“is”前缀应该用于布尔变量和方法,以说明返回值是布尔值。#Codingspecification由于“if”语句总是用于布尔值,是否有必要为每个布尔属性添加“is”?为什么Apple将Swift语法从view.hidden更改为view.isHidden?我只能想到一个答案...因为**“ifview.isHidden”**似乎更自然。尝试根据以下原则使用“is”前缀:如果某个类的某个布尔属性/方法用于该类的实例(公开),则有正当理由使用“is”前缀。publicvarisHidden:Bool{returnalpha==0.0}ifcontainerView.isHidden如果在类内部(私下)使用布尔属性,则前缀是多余的。privatevarpositionedVerticaly:Bool{returnview.frame.width/2==centerX}ifpositionedVerticalyifpositionedVerticaly&&positionedHorizo??ntallyVSifisPositionedVerticalyiifisPositionedVerticaly&&isPositionedHorizo??ntally如果布尔属性/方法被私下和公开使用,那么应该使用计算属性来返回私有属性值。publicvarisPositionedVerticaly:Bool{returnpositionedVerticaly}ifcontainerView.isPositionedVerticaly虽然也可以使用私有集合,公开使用这个属性,但是上面的方法可以实现封装。封装用于隐藏类中结构化数据对象的值或状态,以防止未授权方直接访问。如果不是自己直接处理的Boolean类型,怎么命名呢?privatevarplayerIsPlaying:BoolprivatevargridConstraintIsEnabled()“是”需要指向某物:view.isHidden,“是”指向视图。上面的例子playerIsPlaying就用到了这个原理,“is”指向的是player。请记住:开发人员通常在阅读属性声明之前阅读函数内部的代码,试图理解这些属性的用途。/ifplayerIsPlaying{}/与/ifisPlayerIsPlaying{}/哪个更自然?我想你已经有了答案。
