所谓self-documenting代码其实指的是“readablecode”(可读性强的代码)。虽然可读的代码并不能代替真实的文档和合理的代码注释,但是写出更高质量的代码毕竟没有坏处,至少在团队合作中,你的代码不会让你的队友迷失方向。现在让我们看看一些可以让你的代码更“可读”的编码习惯。不要使用幻数让我们先看一个例子来理解什么是幻数:if(students.length>23){上面的代码可读性很强,因为你不知道数字23是什么意思。事实上,这个23就是我们所说的神奇数字。魔数这个名字听起来很酷很有趣,但实际上它是编程中的贬义词,代表着不良的编码习惯。所谓的神奇数字是看似重要但完全没有提供上下文的数字。我们应该避免在编码中使用幻数,并使用有意义的变量来表示重要的数字:constmaxClassSize=23;if(students.length>maxClassSize){看,当前代码立即变得可读:如果学生人数超过班级允许的最大学生人数,则执行某些操作。那么如何给变量命名呢?这就是我接下来要说的:使用显式变量名。我不知道为什么我一直有意识地写那些超长的变量名。例如,我觉得短变量名rStuNms和fStuNms与长变量名rawStudentNames和filteredStudents相比效果不佳。虽然最后两个变量名很长,但我可以告诉你,如果你用第一种方式来命名变量,两周后你再看你的代码时,你可能不记得你写的这些缩写词是什么意思了。变量名其实是一个很重要的东西,因为你可以通过变量名告诉你的读者你的代码在做什么:constfStuNms=stus.map(s=>s.n)//vsconstfilteredStudentNames=students.map(student=>student.name)上面的例子可能没有什么实际意义,但是你应该能看懂我想表达的意思。对于变量命名,另一个技巧是使用一些命名约定。如果您的变量表示布尔值,则其名称应以is或has开头,例如isEnrolled:true。如果你的变量是用来存储数组的,那么你的变量名应该是复数,比如students。表示数字的变量名称应尽可能以min或max为前缀。对于函数名称,它应该以动词开头,例如createSchedule或updateNickName。使用简洁命名的函数重构显式变量名并不是解释代码行为的唯一方法,函数名也是一个不错的选择!以前一直认为函数只能用来复用代码逻辑,最近发现函数也可以用来提高代码的可读性。花几秒钟看看下面的代码并告诉我它做了什么:')setIsAlertVisible(true)setTimeout(()=>setIsAlertVisible(false),2000)}).then(()=>{if(hasTitleChanged){context.setRefreshTitles(true)setHasTitleChanged(false)}})}你可能理解上面的代码需要一点功夫,我们可以通过细化函数来重构它:constshowSaveAlertFor=(milliseconds)=>()=>{setCurrentAlert('Saved')setIsAlertVisible(true)setTimeout(()=>setIsAlertVisible(false),毫秒)}constupdateTitleIfNew=()=>{if(hasTitleChanged){context.setRefreshTitles(true)setHasTitleChanged(false)}}consthandleSubmit=(event)=>{event.preventDefault()NoteAdapter.update(currentNote).then(showSaveAlertFor(2000)).then(更新TitleIfNew)}看看,整个代码的逻辑和思路是不是清晰多了?我们所做的只是将几行代码封装成不同的函数,这样可以大大提高代码的可读性。如果需要,可以在其他地方使用showSaveAlertFor函数。我们将相关代码封装在函数定义中。这些函数定义其实已经足够告诉你这些代码是干什么的了,所以一般情况下你不需要直接去阅读具体的代码,除非它们有什么问题。在上面重构的代码示例中,handleSubmit方法只维护了一个高层事件链,指示在某些事件发生后应该执行哪个方法,而不是指定具体的操作,在每个方法实现中定义。添加有用的测试描述很少有人知道文档实际上可以写入测试。假设我们有如下方法:constgetDailySchedule=(student,dayOfWeek)=>{如果getDailySchedule是一个调用很多方法的驱动函数,它会根据不同的情况做不同的事情:如果那天是周末,返回一个空数组正常返回学生的全天任务学生没有注册,打印一张Gif……当然你可以把以上几种情况都写在这个函数的注释里,但是这样会让你的代码看起来怪怪的。放置这些案例的最佳位置实际上是在测试中:describe('getDailyScheduletests',()=>{it("retrievesthestudent'sfullschedule",()=>{})it('returnsanemptyarrayif给定一个周末',()=>{})it('如果学生尚未注册则打印一个gif链接',()=>{})...})这是将“评论”放入代码中无需添加注释的最简单和最直接的方法。底线:可读性比聪明更重要衡量一个好开发者的标准不是他能不能写出最聪明的代码,而是他是不是一个好队友。高质量的软件很少是一个人一个人开发出来的,最后总会有第二个人看你写的代码。即使你真的只是自己码字,今天的你和两三周后的你其实是两个不同的人,你不一定记得两三周前你是怎么写代码的。提高代码可读性的方法有很多,比如添加好的注释,但最重要的是你要开始思考。
