Refactoring 013 – Repeated Code را حذف کنید
خودت را تکرار نکن
TL;DR: نحوه حذف کدهای تکراری
کد تکراری یک بوی شدید کد است که منجر به مشکلات نگهداری و اثرات امواج می شود.
با شناسایی رفتارهای تکراری شروع کنید.
هنگامی که آن را پیدا کردید، آن را در توابع یا کلاسهای قابل استفاده مجدد استخراج میکنید، افزونگی را کاهش میدهید، منبعی از حقیقت ایجاد میکنید و بهروزرسانیهای آینده را ساده میکنید.
تکرار رفتار نشانه انتزاعی گمشده ای است که باید ایجاد کنید.
مثل همیشه، باید آن را در دنیای واقعی جستجو کنید.
Refactoring یک رویداد یک بار نیست. این یک فرآیند مداوم است که باید در گردش کار توسعه شما ادغام شود.
یک کپی متنی از کد تکراری ایجاد کنید
آنچه متفاوت است را پارامتر کنید
انتزاع را فراخوانی کنید
یک استعاره در دنیای واقعی برای انتزاع پیدا کنید
(این مرحله سخت تر و نه مکانیکی است)
*(این کد واقعی است که توسط 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)
}
?>
مراحل تعریف شده است اما گاهی اوقات نه در مورد تکرار متن، بلکه تکرار رفتار.
از آنجایی که این یک بازسازی مکانیکی نیست، به پوشش خوبی روی کدی که اصلاح می کنید نیاز دارید.
شما یک منبع واحد از حقیقت، کد فشرده تر، و راه حلی ساده تر برای نگهداری دارید.
تصویر توسط Rachealmarie در Pixabay
این مقاله بخشی از سری Refactoring است.