单词“自我记录代码”是表示“可读代码”的另一种方式。 就其本身而言,它不会代替本文档或好的评论 ,但是无论有没有它们,它绝对会让您的生活和同事的生活更轻松。
让我们看一下创建自文档代码的一些重要原则。
不要使用“幻数”
告诉我,这行是什么意思?
if (students.length > 23) {
检查是否有超过23名学生? 那是什么意思呢? 为什么是23,而不是24?
幻数是没有上下文的数字。 您将需要花费时间和精力来了解这种情况。 摆脱不必要的工作,立即明确给该数字指定名称:
const maxClassSize = 23; if (students.length > maxClassSize) {
现在尝试阅读代码。 我们不检查“是否有超过23名学生”,而是“是否有超过该班级容纳人数的学生”。
对变量使用明确的名称
我不知道为什么,但是在我之前一直不敢将变量名加长。 这对我来说很愚蠢,因为与r awStudentNames和filteredStudentNames相比, rStuNms和fStuNms太糟糕了。
后者似乎还很长吗? 然后考虑一下:在休假2周并使用其他代码后,您会忘记一半的缩写。 也就是说,随时随地读取变量名称的能力就是即时读取代码的能力:
const fStuNms = stus.map(s => sn)
另一个好的技巧是使用约定(命名约定)。 如果变量为Boolean,则以is或has ( isEnrolled:true ) 开头 。 如果变量是数组,则使用复数( 学生 )。 许多数字必须以min或max开头。 并且函数名称必须包含一个动词,例如createSchedule或updateNickname 。 说到功能...
编写微小的命名函数
变量不是读取代码的唯一方法。 作为一个年轻的程序员,我只使用函数来避免代码重复 。 对我来说,真正的启示是,首先,创建描述正在发生的事情的功能是有意义的。
花几秒钟的时间看一下这段代码,然后说一下它的作用:
const handleSubmit = (event) => { event.preventDefault(); NoteAdapter.update(currentNote) .then(() => { setCurrentAlert('Saved!') setIsAlertVisible(true); setTimeout(() => setIsAlertVisible(false), 2000); }) .then(() => { if (hasTitleChanged) { context.setRefreshTitles(true); setHasTitleChanged(false); } }); };
现在对代码执行相同的操作:
const showSaveAlertFor = (milliseconds) => () => { setCurrentAlert('Saved!') setIsAlertVisible(true); setTimeout( () => setIsAlertVisible(false), milliseconds, ); }; const updateTitleIfNew = () => { if (hasTitleChanged) { context.setRefreshTitles(true); setHasTitleChanged(false); } }; const handleSubmit = (event) => { event.preventDefault(); NoteAdapter.update(currentNote) .then(showSaveAlertFor(2000)) .then(updateTitleIfNew); };
似乎有更多的字符,但是可读性更高,对吗? 所需要做的只是将逻辑操作分配到小的命名函数中。 而且,在大多数情况下,小功能本身不是必需阅读的-这些是实现细节。 要了解代码,只需查看最顶层的函数,该函数由一系列易于理解的事件组成。
但是,进一步-再过一会儿,您将意识到这样的小功能非常易于重用。 可重用性是提高可读性的结果,而不是相反。
添加有用的测试说明
可能谈论最少的是自我记录的测试,但徒劳无功。
假设我们有一个像这样的函数:
const getDailySchedule = (student, dayOfWeek) => {
想象一下,它包含许多不同的操作:它收到一个月的计划; 如果今天休息一天,则返回一个空数组; 如果该学生参加了其他课程,则在一天结束时将其添加,依此类推。 总的来说,您了解这个主意:该函数很复杂,最好用简单的文字写下它的工作算法。
试图将其放入评论中不是一个好主意:评论将一度过时,而不是会及时得到纠正的事实。 您知道在哪里记录运算算法吗? 在测试中:
describe('getDailySchedule ', () => { it(" ", () => { it(' , ', () => { it(' ', () => {
这是注释代码而不在代码中注释的最优雅的方式。
底线:可读性比聪明更重要
任何人都可以编写自己可以理解的代码; 优秀的开发人员可以编写他人可以理解的代码 。 一个人创造的东西很少,这意味着其他人迟早会阅读您的代码。 但是,即使您确定只有您会仔细研究一些代码,也要考虑到您现在和一个月后在记住该代码的能力方面是不同的人。