بازساخت کد

**بازساخت**  یا **بازسازی کد** در برنامه‌نویسی رایانه‌ای و طراحی نرم‌افزار، به فرایند ساختمان‌دهی مجدد به کد رایانه موجود گفته می‌شود، این فرایند «**نباید**» رفتار بیرونی آن را تغییر دهد. بازساخت به منطور بهبود طراحی، ساختار، و/یا پیاده‌سازی نرم‌افزار ( بهبود ویژگی‌های غیرعملکردی آن)، انجام می‌شود، درحالیکه عملکرد کد باید حفظ گردد.

بازسازی کد یک فرایند می‌باشد که طی آن، یک کدِ نوشته شده بدون آن که رفتار خارجی‌اش عوض شود، بازسازی می‌شود. به عبارتی دیگر، بازسازی کد به معنای تغییر یک سیستم نرم افزاری به منظور ارتقا و بهبود ساختار داخلی آن به صورتی که رفتار بیرونی آن تحت تأثیر قرار نگیرد، می‌باشد. اگر بخواهم دقیق تر بگوییم، بازسازی کد را می‌توان راهی برای منظم و تمیز کردن ساختار کد دانست. این کار برای جلوگیری از ایجاد باگ‌های نرم افزاری انجام می‌شود.

## بررسی اجمالی
بازسازی کد رابطهٔ نزدیکی با بوی کد (code smell) دارد. برای مثال، متدی را در نظر بگیرید که بسیار بلند یا شبیه متد دیگری شده‌است. به کمک بازسازی کد می‌توان این مشکل‌ها را حل کرد و به عبارتی دیگر بوی کد را از بین برد. در حالتی که متد بسیار بلند است به دو متد یا بیشتر شکسته می‌شود و در حالتی که متد شبیه متد دیگری است، هر دو متد را با یک متد جایگزین می‌شوند.

به‌طور کلی بازسازی کد دارای دو فایده است.
# نگهداشت‌پذیری. با انجام بازسازی کد، رفع مشکل در کد آسان‌تر انجام می‌شود زیرا خوانایی کد بیشتر است و هدف نویسندۀ کد راحت‌تر فهمیده می‌شود.
# توسعه‌پذیری. امکان گسترش دادن توانایی‌های برنامه بیشتر می‌شود درصورتی که کد از الگوهای طراحیِ قابل تشخیص استفاده کند و قابلیت انعطاف‌پذیری داشته باشد.
قبل از انجام بازسازی کد بر روی یک تکه کد، می‌بایست یک سری آزمایش واحدِ خودکار (unit test) انجام شود. این کار برای مطمئن شدن از درست بودنِ کارکردِ تکه کد قبل از انجام بازسازی کد می‌باشد. اگر این آزمایش‌ها شکست بخورند، در حالت کلی ابتدا می‌بایست این آزمایش‌ها را رفع مشکل کرد؛ اگر این کار انجام نشود، تشخیص خطاهایی که به خاطر  بازسازی کد درست شده‌اند از خطاهایی که قبلاً از بازسازی کد در کد وجود داشته‌اند دشوار می‌شود. بعد از بازسازی کد، آزمایش‌ها دوباره اجرا می‌شوند تا تائید شود که بازسازی کد خطای جدیدی را به وجود نیاورده است.

فرایند کلی بازسازی کد به‌طور یک چرخهٔ تکرار شونده است. هر بار تغییر کوچکی در کد ایجاد می‌کنیم و آن را آزمایش می‌کنیم، اگر آزمایش موفقت‌آمیز بود این چرخه را دوباره تکرار می‌کنیم و در غیر این صورت، تغییر ایجاد شده را برمی‌گردانیم و سعی می‌کنیم تغییر را از روش دیگری ایجاد کنیم. در نهایت برنامه از طریق گام‌های کوچک و بسیار از جایی که در حال حاضر وجود دارد به جایی که مدنظر ما است می‌رسد.

## یک مثال از بازسازی کد
تکه کد زیر را در نظر بگیرید.
```java
public MyClass(String lastname, String firstname, int age) {
    this.lastname = lastname
    this.firstname = firstname
    this.age = age
}
```
در این متد اگر ترتیب پارامترهای ورودی را عوض کنیم، خوانایی کد بیشتر می‌شود و در نهایت تابع به صورت زیر می‌شود.
```java
public MyClass(String firstname, String lastname, int age) {
    this.firstname = firstname
    this.lastname = lastname
    this.age = age
}
```


## فهرستی از روش‌های بازسازی کد
* روش‌هایی که خاصیت انتزاعیِ کد (abstraction) را زیاد می‌کنند.
** کپسوله‌سازی - مجبور کردنِ بقیه برای دسترسی به پارامتر یک کلاس از طریق توابع گیرنده و گذارنده.
** کلی‌سازی نوع - کلی کردنِ نوع یک پارامتر برای افزایش اشتراک گذاریِ کد.
* روش‌هایی که نام‌ها یا مکان یک تکه کد را بهبود می‌بخشند.
** انتقال یک متد یا پارامتر - انتقال به یک جای مناسب تر.
** تغییر نام یک متد یا پارامتر - تغییر نام به یک نامِ بهتر که هدف آن متد یا پارامتر را مشخص کند.
** بالا بردن - انتقال به کلاسِ پدر در برنامه‌نویسی شئ‌گرا
** پایین بردن - انتقال به کلاسِ فرزند در برنامه‌نویسی شئ‌گرا

## پانویس

## منابع
# https://en.wikipedia.org/wiki/Code_refactoring
# https://web.archive.org/web/20170513135923/http://ageeknotes.com/refactoring/
# http://www.telerik.com/justcode/tutorials/refactoring-examples

## جستارهای وابسته
انتزاع (رایانه)

توسعه نرم‌افزاری چابک
رده:بازسازی کد
رده:برنامه‌سازی مفرط
رده:نوواژه‌های فناوری
__بافهرست__