首頁 > web前端 > js教程 > 主體

重構 - 將屬性轉換為集合

Barbara Streisand
發布: 2024-10-20 11:33:02
原創
609 人瀏覽過

透過將屬性轉換為集合來支援不變性

TL;DR:使用屬性集可以簡化程式碼並使狀態管理更容易

解決的問題

  • 可變性
  • 複雜性
  • 屬性被污染
  • 設定器

相關代碼異味

步驟

  1. 辨識代表狀態的屬性
  2. 用集合取代屬性:每個狀態一個
  3. 調整在集合之間移動項目的方法,而不是改變屬性

範例程式碼

class Bill {
  amount: number;
  paid: boolean;

  constructor(amount: number) {
    this.amount = amount;
    this.paid = false;
  }

  pay() {
    if (!this.paid) {
      this.paid = true;
    }
  }
}

const bill = new Bill(100);
console.log(bill.paid); // false
bill.pay();
console.log(bill.paid); // true
登入後複製

// 1. Identify attributes representing states

class Accountant {  
   // 2. Replace the attributes with sets: one for each state
  unpaidBills: Set<Bill>;
  paidBills: Set<Bill>;

  constructor() {
    this.unpaidBills = new Set();
    this.paidBills = new Set();
  }

  addBill(bill: Bill) {
    this.unpaidBills.add(bill);
  }

  payBill(bill: Bill) {    
    // 3. Adjust methods to move items
    // between sets instead of mutating attributes
    if (this.unpaidBills.has(bill)) {
      this.unpaidBills.delete(bill);
      this.paidBills.add(bill);
    }
  }
}

class Bill {
  amount: number;

  constructor(amount: number) {
    this.amount = amount;
  }
}

const bill = new Bill(100);
const accountant = new Accountant();
accountant.addBill(bill);
console.log(accountant.unpaidBills.has(bill)); // true
accountant.payBill(bill);
console.log(accountant.paidBills.has(bill)); // true
登入後複製

類型

[X] 半自動

安全

當您的屬性不依賴特定的索引行為時,此重構是安全的。

由於集合不維護元素順序,請檢查您的邏輯是否依賴順序。

為什麼程式碼更好?

實體本質上是不可變的。

使用集合可確保唯一性並簡化邏輯。

新增元素之前不再需要檢查重複項。

並集、交集和差集等操作變得簡單,使您的程式碼更易於維護和靈活。

限制

集合不保留元素順序。

如果您的邏輯依賴於順序,則轉換為集合可能不合適,您應該使用有序集合或陣列

人工智慧重構

您可以提示您的 AI 助理為您進行此重構。

嘗試一下!

Without Proper Instructions With Specific Instructions
ChatGPT ChatGPT
Claude Claude
Perplexity Perplexity
Copilot Copilot
Gemini Gemini

標籤

  • 可變性

相關重構

https://dev.to/mcsee/refactoring-001-remove-setters-26cg

參見

製作人員

圖片由 Angelo Giordano 在 Pixabay上


本文是重構系列的一部分。

以上是重構 - 將屬性轉換為集合的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!