」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 程式設計風格指南:編寫簡潔程式碼的實用指南

程式設計風格指南:編寫簡潔程式碼的實用指南

發佈於2024-11-06
瀏覽:640

Coding Style Guide: A Practical Guide to Writing Clean Code

在过去的五年里,我一直在不断尝试提高我的编码技能,其中之一就是学习和遵循最推荐的编码风格。
本指南旨在帮助您编写一致且优雅的代码,并包含一些提高代码可读性和可维护性的建议。它的灵感来自于社区中最受接受的流行指南,但进行了一些修改以更适合我的喜好。
值得一提的是,我是一名全栈 JavaScript 开发人员,我的所有笔记都特定于我的技术堆栈(MEVN),可能不适用于其他堆栈。

一般规则

避免代码重复

如果需要在多个地方编写相同的代码块(或具有一些可管理的差异),则必须将它们合并到一个函数中,并且以后只要调用该函数即可需要。

考虑松耦合

函数应该独立工作,这意味着只要输入和输出保持相同,编辑一个函数就应该

绝对不会对其他函数产生影响。每个函数应该不知道其他函数的定义,并作为一个单独的组件工作。在这种情况下,它只知道它的参数,无论谁调用该函数,相同的输入总是返回相同的结果。

宣言

首先,记住始终声明变量。

当不打算重新分配变量时,请使用 const 关键字。但是,您仍然可以对对象或数组变量使用 const,即使您计划重新分配它们的嵌套元素。
请注意,要求模块并始终使用 const 关键字定义常量变量。
当不能使用 const 时使用 let 关键字,只有在需要支持较旧的浏览器时才使用 var 关键字。

功能

功能应限于以下内容:

    四个变量
  • 四个参数
  • 三十行代码(忽略注释)
  • 四个分支(if-else、while、for、or-and、switch-case)
代码行应限制在 100 个字符,并且为了对功能进行分组/组织,最好使相关功能尽可能彼此靠近。

只要有可能,就使箭头函数语法优于传统替代语法。

弦乐

对普通字符串文字使用单引号 ' (而不是双引号 "),但对于嵌入变量/表达式的字符串、多行字符串以及包含单引号字符的字符串,请使用模板文字。

命名

命名变量时保持一致性至关重要。这意味着如果不同页面上的变量负责相同的数据,则它们应该具有相同的名称。

变量、函数、方法和参数的名称应该是自我描述的,这意味着任何人都应该能够通过查看它们的名称来了解(或至少做出合理的猜测)所包含的数据。

常量变量应大写,单词之间用下划线分隔。函数、变量和方法应遵循驼峰命名法,而 CSS 类和 ID 应遵循短横线命名法。

评论

注释应始终以大写字母开头,且不得超过 100 个字符。您可能还记得代码行遵循相同的规则,但请注意,如果行同时包含两者,则它们最多只能超过 150 个字符。

描述函数的注释不应该写在调用它们的地方,而应该写在定义它们的地方。

将注释放在一行代码之后,除非该行的长度超过 150 个字符。在这种情况下,对于多行代码,请将注释放在顶部。

对于if语句,注释应放在条件语句之后。


if (conditionIsTrue) { // 在此发表您的评论 doSomeThing(); } else { // 在此发表您的评论 doSomethingElse(); }
if (conditionIsTrue) { // Put your comment here
    doSomeThing();
} else { // Put your comment here
    doSomethingElse();
}
请记住,对于单行注释使用双斜杠 //,对于多行注释使用 /* */。在一行代码或条件语句中添加多行注释时,请将其放在 /* */ 内,这样 /* 写在代码前面,注释从下一行开始,*/ 写在新行上线。


if (条件为真) { /* 在这里发表您的评论 在这里发表您的评论 */ doSomeThing(); } 函数名(参数), /* 在这里发表您的评论 在这里发表您的评论 */
if (conditionIsTrue) { // Put your comment here
    doSomeThing();
} else { // Put your comment here
    doSomethingElse();
}
功能描述性注释

将注释放在 /** */ 包裹的函数之上。

    使用@param {type}变量名描述来描述参数。
  • 如果参数可以接受多个变量的类型,请使用@param {type1 | type2} 变量名描述。
  • 如果参数是可选的并且可以不存在,请使用@param {type} [variableName] 描述。
  • 如果参数有默认值(必须是可选的才能确实有默认值),请使用@param {type} [variableName =“value”]描述。
  • 使用@returns {type}描述来描述函数输出。
/** * 此处描述该函数 * @param {type} normalVariable 普通变量 * @param {类型1 | type2} multiTypeVariable 具有多种预期类型的​​变量 * @param {type} [variableWithDefaultValue="value"] 可选变量,具有默认值,以防调用函数时不存在 * @param {type} [可选变量] 可选变量 * @returns {type} 描述 */ const 函数名 = (普通变量, 多类型变量, 带默认值的变量, 可选变量) => { doSomeThing(); }
if (conditionIsTrue) { // Put your comment here
    doSomeThing();
} else { // Put your comment here
    doSomethingElse();
}
关于带有req和res参数的服务器函数,不需要描述请求参数;仅使用@returns描述来描述响应。


/** * 此处描述该函数 * @returns 描述 */ 函数名 = (req, res) => { doSomeThing(); }
if (conditionIsTrue) { // Put your comment here
    doSomeThing();
} else { // Put your comment here
    doSomethingElse();
}
一般情况下,req、res、next、to、from参数不需要描述。

在HTML文件中,使用分隔代码的不同部分;因此用户可以轻松识别每个部分。

如果您在代码行中间写注释,请使用 /* */.


const calc_result = (firstNumber * secondaryNumber)/* 解释相乘的原因 */thirdNumber;
if (conditionIsTrue) { // Put your comment here
    doSomeThing();
} else { // Put your comment here
    doSomethingElse();
}
缩进

禁止尾随空格。

请记住,始终在表达式、运算符和符号周围以及逗号和大括号之后添加空格(如果它们是
而不是 行的最后一个字符。 仅在文件末尾(所有文件都应以空行结尾)、最后导入的模块之后、分隔 Template、Script 和 Style 标记以及 CSS 规则集之间允许(且必需)使用空行。
请记住使用 Tab 进行缩进,使用 Space 进行对齐。

命令

    猫鼬模式的变量和组件的 Vue 反应状态按字母顺序排列,但其余时间按从最短到最长的顺序排列行。
  • 按 put、get、post 和 delete 的顺序对路由方法进行排序,而每个方法本身均按字母顺序排列,并且所有路由应根据其 URL 进行分组。
包起来

虽然显然,这些并不是最好的建议,但我相信它们为任何有兴趣学习干净代码原则的人提供了一个坚实的起点。

此外,尽管严格遵守这些规则一开始似乎具有挑战性,但经过实践,它会变得更加简单。

在开发长期代码库时,必须强调坚持当前项目指南的必要性,即使它们还不够。如果您真的想重新审视项目的指导方针,请考虑最有益的修改并让它们逐渐注入到项目中。

封面图片来源:Pexels 的 luis gomes 拍摄

版本聲明 本文轉載於:https://dev.to/mohsen-karami/coding-style-guide-a-practical-guide-to-writing-clean-code-4lbf?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-07-17
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否有必要在heap-procal extrable exit exit上進行手動調用“ delete”操作員,但開發人員通常會想知道是否需要手動調用“ delete”操作員。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(...
    程式設計 發佈於2025-07-17
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-07-17
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-07-17
  • 在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8表中將latin1字符轉換為utf8 ,您遇到了一個問題,其中含義的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致電。為了解決此問題,您正在嘗試使用“ mb_convert_encoding”和“ iconv”轉換受...
    程式設計 發佈於2025-07-17
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html &lt;/main&gt; &lt;section&gt; { display:grid; grid-template-...
    程式設計 發佈於2025-07-17
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-07-17
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-07-17
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-07-17
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    程式設計 發佈於2025-07-17
  • Java數組中元素位置查找技巧
    Java數組中元素位置查找技巧
    在Java數組中檢索元素的位置 利用Java的反射API將數組轉換為列表中,允許您使用indexof方法。 (primitives)(鏈接到Mishax的解決方案) 用於排序陣列的數組此方法此方法返回元素的索引,如果發現了元素的索引,或一個負值,指示應放置元素的插入點。
    程式設計 發佈於2025-07-17
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-07-17
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-07-17
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-07-17
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-07-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3