Your resource for web content, online publishing
and the distribution of digital products.
S M T W T F S
 
 
 
 
 
1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
 
25
 
26
 
27
 
28
 
29
 
30
 

Refactoring 017 - Convert Attributes to Sets

DATE POSTED:October 21, 2024

Favor immutability by converting attributes to sets

TL;DR: Using sets for attributes simplifies your code and makes state management easier

Problems Addressed
  • Mutability
  • Complexity
  • Attributes become polluted
  • Setters
Related Code Smells

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vii-8dk31x0

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vi-cmj31om

Steps
  1. Identify attributes representing states
  2. Replace the attributes with sets: one for each state
  3. Adjust methods to move items between sets instead of mutating attributes
Sample Code Before 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 After // 1. Identify attributes representing states class Accountant { // 2. Replace the attributes with sets: one for each state unpaidBills: Set; paidBills: Set; 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(); manager.addBill(bill); console.log(accountant.unpaidBills.has(bill)); // true manager.payBill(bill); console.log(accountant.paidBills.has(bill)); // true Type
  • [x] Semi-Automatic
Safety

This refactoring is safe when your attributes don't rely on specific indexing behavior.

\ Since sets don't maintain element order, check if your logic depends on order.

Why is the code better?

Entities are immutable in the essence.

\ Using sets ensures uniqueness and simplifies logic.

\ You no longer need to check for duplicates before adding elements.

\ Operations like union, intersection, and difference become straightforward, making your code more maintainable and flexible.

Limitations

Sets don't preserve element order.

\ If your logic depends on sequence, converting to a set may not be appropriate and you should use an Ordered Collection or Array

AI Refactoring

You can prompt your AI assistants to make this refactoring for you.

Try Them!

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

Tags
  • Mutability
Related Refactorings

https://hackernoon.com/refactoring-remove-setters-codesmell?embedable=true

See also

https://hackernoon.com/is-it-crystal-clear-for-everybody-that-a-date-should-not-mutate-wuoy3z03?embedable=true

Credits

Image by Angelo Giordano in Pixabay

This article is part of the Refactoring Series.

https://maximilianocontieri.com/how-to-improve-your-code-with-easy-refactorings?embedable=true

\