Typescript 代碼整潔之道

Typescript

適用於 Typescript 的代碼整潔之道。 受到 clean-code-javascript 的啓發。javascript

目錄

  1. 介紹
  2. 變量
  3. 函數
  4. Objects and Data Structures
  5. Classes
  6. SOLID
  7. Testing
  8. Concurrency
  9. Error Handling
  10. Formatting
  11. Comments
  12. Translations

介紹

Humorous image of software quality estimation as a count of how many expletives
you shout when reading code

軟件工程原理,源自 Robert C. Martin's 的書 Clean Code, 適用於 TypeScript。 這不是風格指南,它是在 TypeScript 中生成 可讀,可重用和可重構 軟件的指南。java

並不是每一個原則都必須嚴格遵照,廣泛認同的甚至更少。這些只是準則,僅此而已,但他們倒是 Clean Code 一書的做者根據自身多年的編程體會而提煉撰寫出來的。git

咱們的軟件工程技術只有50多年的歷史,咱們還有不少東西須要學習。當軟件架構與架構自己同樣古老時,也許那時咱們會有更難遵循的規則。如今,讓這些指導方針做爲一個試金石,用來評估您和您的團隊所生成的 Typescript 代碼的質量.github

除此以外:知道這些並不會當即使你成爲一個更好的軟件開發者,這些規則伴隨你工做多年後並不意味着你就不會犯錯誤了。每一段代碼都是做爲初稿開始的,就像溼粘土被塑形成最終形狀同樣。最終,當咱們與小夥伴們一塊兒審查時,咱們會鑿掉不完美之處。不要由於這些須要改進的初稿而阻礙本身技術的提高。先幹掉代碼吧!編程

⬆ 返回頂部架構

變量

使用有意義的變量名

以這樣的方式區分名稱,以便讀者知道他們的差別究竟是什麼。函數

反例:工具

function between<T>(a1: T, a2: T, a3: T): boolean {
  return a2 <= a1 && a1 <= a3;
}

複製代碼

正例:學習

function between<T>(value: T, left: T, right: T): boolean {
  return left <= value && value <= right;
}
複製代碼

⬆ 返回頂部ui

使用可拼讀的變量名

若是你不能拼讀他,你只能像個白癡同樣去聲明它。

反例:

type DtaRcrd102 = {
  genymdhms: Date;
  modymdhms: Date;
  pszqint: number;
}
複製代碼

正例:

type Customer = {
  generationTimestamp: Date;
  modificationTimestamp: Date;
  recordId: number;
}
複製代碼

⬆ 返回頂部

對於相同類型的變量只使用同一個單詞

反例:

function getUserInfo(): User;
function getUserDetails(): User;
function getUserData(): User;
複製代碼

正例:

function getUser(): User;
複製代碼

⬆ 返回頂部

使用可搜索的名稱

咱們閱讀的代碼每每比咱們要寫的代碼多。所以咱們編寫的代碼的可讀性和可搜索性是很是重要的。不給那些具備意義且有助於理解程序的變量命名,就會傷害了閱讀代碼的人。讓您的名字可搜索。像 TSLint 這樣的工具能夠幫助識別未命名的常量。

反例:

// 86400000 究竟是什麼?
setTimeout(restart, 86400000);
複製代碼

正例:

// 將它們聲明爲大寫的命名常量。
const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000;

setTimeout(restart, MILLISECONDS_IN_A_DAY);
複製代碼

⬆ 返回頂部

使用變量展開

反例:

declare const users: Map<string, User>;

for (const keyValue of users) {
  // 迭代用戶地圖
}
複製代碼

正例:

declare const users: Map<string, User>;

for (const [id, user] of users) {
  // 迭代用戶地圖
}
複製代碼

⬆ 返回頂部

避免心領神會

顯式優於隱式。
清晰是王道。

反例:

const u = getUser();
const s = getSubscription();
const t = charge(u, s);
複製代碼

正例:

const user = getUser();
const subscription = getSubscription();
const transaction = charge(user, subscription);
複製代碼

⬆ 返回頂部

不要添加不須要的上下文

若是你的 類/類型/對象 名稱中已經有說明,不要在你的變量中重複它們。

反例:

type Car = {
  carMake: string;
  carModel: string;
  carColor: string;
}

function print(car: Car): void {
  console.log(`${car.carMake} ${car.carModel} (${car.carColor})`);
}
複製代碼

正例:

type Car = {
  make: string;
  model: string;
  color: string;
}

function print(car: Car): void {
  console.log(`${car.make} ${car.model} (${car.color})`);
}
複製代碼

⬆ 返回頂部

使用默認參數而不是短路表達式或條件語句

默認參數一般比短路表達式更清晰。

反例:

function loadPages(count?: number) {
  const loadCount = count !== undefined ? count : 10;
  // ...
}
複製代碼

正例:

function loadPages(count: number = 10) {
  // ...
}
複製代碼

⬆ 返回頂部

相關文章
相關標籤/搜索