>  기사  >  웹 프론트엔드  >  리팩토링 - 속성을 세트로 변환

리팩토링 - 속성을 세트로 변환

Barbara Streisand
Barbara Streisand원래의
2024-10-20 11:33:02609검색

속성을 세트로 변환하여 불변성을 선호하세요

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] 반자동

안전

이 리팩토링은 속성이 특정 인덱싱 동작에 의존하지 않는 경우 안전합니다.

세트는 요소 순서를 유지하지 않으므로 논리가 순서에 의존하는지 확인하세요.

코드가 더 나은 이유는 무엇입니까?

엔티티는 본질적으로 불변입니다.

세트를 사용하면 고유성이 보장되고 논리가 단순화됩니다.

더 이상 요소를 추가하기 전에 중복을 확인할 필요가 없습니다.

합집합, 교차점, 차이 등의 연산이 간단해지면서 코드를 더욱 유지 관리하기 쉽고 유연하게 만들 수 있습니다.

제한사항

세트는 요소 순서를 유지하지 않습니다.

논리가 시퀀스에 의존하는 경우 세트로 변환하는 것이 적절하지 않을 수 있으므로 Ordered Collection 또는 Array를 사용해야 합니다

AI 리팩토링

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

또한보십시오

크레딧

Pixabay에 있는 Angelo Giordano의 이미지


이 글은 리팩토링 시리즈의 일부입니다.

위 내용은 리팩토링 - 속성을 세트로 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.