اصغری
اصغری
خواندن ۲ دقیقه·۱ سال پیش

Refactoring Challenge 1: Making the Code Better


تصمیم گرفتم چند چالش کد طراحی کنم تا باهم مهارت های کدنویسی خودمون را افزایش بدیم. اگر آماده هستید، بیایید با اولین چالش شروع کنیم. در این چالش refactoring، کد را با اجرای چندین تغییر گام به گام بهبود میدیم. کد اولیه به زبان php شرح زیر است:


class Order { private $items; public function __construct() { $this->items = []; } public function calculateTotal() { $total = 0; foreach ($this->items as $item) { $total += $item->price; } $this->applyDiscount($total); return $total; } private function applyDiscount(&$total) { $total *= 0.9; } }

اگر فکر کردی راجع به تغییراتش شروع کنیم.

  1. Remove pass-by-reference for testability

برای اولین گام ارجاع با رفرنس رو حذف میکنیم. اینجوری کدمون خیلی تست پذیر تر هست.

public function calculateTotal() { $total = 0; foreach ($this->items as $item) { $total += $item->price; } return $this->applyDiscount($total); } private function applyDiscount($total) { return $total * 0.9; }

2. Single Responsibility

اگر بخوایم بر اساس اصل اول SOLID کدمون رو پیاده کنیم بهتر هست که فانکشن calculateTotal رو بشکنیم به دو فانکشن به شکل زیر:

public function calculateTotal() { $subtotal = $this->calculateSubtotal(); return $this->applyDiscount($subtotal); } private function calculateSubtotal() { $subtotal = 0; foreach ($this->items as $item) { $subtotal += $item->price; } return $subtotal; }

3. Constructor property promotion

بهتره تا از خاصیتهای جدید php هم اضافه کنیم و کانستراکتور رو به این شکل بازنویسی کنیم. دیگه نیازی به تعریف اولیه $items در بدنه کلاس نیست.

public function __construct(private $items=[]) { }


4. Type Declaration

چطوره تا تایپ اضافه کنیم تا کارمون تکمیل بشه:

class Order { public function __construct( private readonly array $items=[] ) {} public function calculateTotal(): float { $subtotal = $this->calculateSubtotal(); return $this->applyDiscount($subtotal); } private function calculateSubtotal(): int { $subtotal = 0; foreach ($this->items as $item) { $subtotal += $item->price; } return $subtotal; } private function applyDiscount($total): float { return $total * 0.9; } }

کار ما فعلا تمومه!!
اگر هر پیشنهاد دیگری برای بهبود کد داری ممنون میشم بدونم.
این مطلب رو به صورت اسلاید و به زبان انگلیسی میتونی در لینکدینم دنبال کنی:


https://www.linkedin.com/posts/sm-asghari_refactoring-code-challenge-activity-7117045778669260800-2e2Z



phpریفکتورینگکلین کد
شاید از این پست‌ها خوشتان بیاید