برنامه نویسی

Refactoring 013 – Repeated Code را حذف کنید

خودت را تکرار نکن

TL;DR: نحوه حذف کدهای تکراری

کد تکراری یک بوی شدید کد است که منجر به مشکلات نگهداری و اثرات امواج می شود.

با شناسایی رفتارهای تکراری شروع کنید.

هنگامی که آن را پیدا کردید، آن را در توابع یا کلاس‌های قابل استفاده مجدد استخراج می‌کنید، افزونگی را کاهش می‌دهید، منبعی از حقیقت ایجاد می‌کنید و به‌روزرسانی‌های آینده را ساده می‌کنید.

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

مثل همیشه، باید آن را در دنیای واقعی جستجو کنید.

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

  1. یک کپی متنی از کد تکراری ایجاد کنید

  2. آنچه متفاوت است را پارامتر کنید

  3. انتزاع را فراخوانی کنید

  4. یک استعاره در دنیای واقعی برای انتزاع پیدا کنید

(این مرحله سخت تر و نه مکانیکی است)

*(این کد واقعی است که توسط Google Gemini تولید شده است)

توضیح کامل را در این گفتگو ببینید*

قبل از



class AccessControlPanel {

  private $users = [];

  public function createRegularUser($username, $password, $email) {
    $user = [
      "username" => $username,
      "email" => $email,
      "type" => $this->regularUserRole(),
      "creationDate" => $this->timeSource->currentTimestamp(),
      "needsToChangePassword" = $this->needsToChangePassword(),
      "loginPolicy" => $this->userLoginPolicy()
    ]
    $this->users[] = $user;
    $this->addCreationToJournal($user);
  }

   public function createAdminUser($username, $password, $email) {
    $user = [
      "username" => $username,
      "email" => $email,
      "type" => $this->regularUserRole(),
      "creationDate" => $this->timeSource->currentTimestamp(),
      "needsToChangePassword" = $this->needsToChangePassword(),
      "loginPolicy" => $this->adminUserLoginPolicy()
    ]
    $this->users[] = $user;
    $this->addCreationToJournal($user);
    return $user;
  }
} 

?>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بعد از



class AccessControlPanel {

  private $users = [];

  // 1.  Make a contextual copy of the repeated code

  private function createUser(
     $username, 
     $password,
     $email, 
     $role, 
     $loginPolicy) {
    $user = [
      "username" => $username,
      "email" => $email,
      "type" => $role,
      "creationDate" => $this->timeSource->currentTimestamp(),
      "needsToChangePassword" => $this->needsToChangePassword(),
      "loginPolicy" => $loginPolicy
    ];
    $this->users[] = $user;
    $this->addCreationToJournal($user);
    return $user;
  }

  // 2. Parametrize what is different (in this case $role and $loginPolicy)

  public function createRegularUser($username, $password, $email) {
    // 3. Invoke the abstraction
    return $this->createUser(
      $username,
      $password,
      $email, 
      $this->regularUserRole(),
      $this->userLoginPolicy());
  }

  public function createAdminUser($username, $password, $email) {
    return $this->createUser(
      $username,
      $password,
      $email,
      $this->adminUserRole(), 
      $this->adminUserLoginPolicy());
  }

  // 4. Find a real-world metaphor for the abstraction
  // private function createUser(
  // $username, 
  // $password,
  // $email, 
  // $role, 
  // $loginPolicy)
}

?>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

[X] نیمه خود کار

مراحل تعریف شده است اما گاهی اوقات نه در مورد تکرار متن، بلکه تکرار رفتار.

از آنجایی که این یک بازسازی مکانیکی نیست، به پوشش خوبی روی کدی که اصلاح می کنید نیاز دارید.

شما یک منبع واحد از حقیقت، کد فشرده تر، و راه حلی ساده تر برای نگهداری دارید.

تصویر توسط Rachealmarie در Pixabay


این مقاله بخشی از سری Refactoring است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا