هر زمان شخصی رو میبینم که سریع شروع به کد زدن میکنه یاد جمله ی زیبای Jeffery Way توی کتاب Testing Decoded میوفتم: "اجازه نده گاو چرون باشی" گاو چرون اول کد میزنه بعد فکر میکنه، ولی برنامه نویس قبل از کد زدن فکر میکنه.
به عنوان برنامه نویس شاید تقریبا واژه ی عزیز Refactor رو هر روز به زبون بیاریم یا از آدم های اطراف بشنویم!
اگه فکر میکنید ریفکتور کار سختیه! لطفا تا آخر مطلب مهمون من باشین.
ریفکتور یعنی تغییر ساختار یه کد بدون اینکه عملکرد کد تغییر کنه.
اگه بعد از ریفکتور ساید افکت به وجود بیاد قطعا ریفکتور نکردیم! جملم به این معنی نیست که کار رو ادامه بدیم تا ساید افکت از بین بره! نه اصلا! چطوره یه بار برای همیشه ریفکتور رو با هم معنی کنیم؟
استاد Ron Jeffries چی میگه؟!
Refactoring isn’t rewriting. Certainly if we have a program with a bad design, we can write a new program, using a better design. It would take a long time, however, and in Scrum we don’t have a long time: we need a better design by the end of the current Sprint.
ریفکتور دوباره نویسی نیست. قطعا اگه برنامه ای داریم که بد طراحی شده میتونیم با طراحی بهتر برنامه ی جدیدی بنویسیم. زمان زیادی میگیره، با اینکه، توی اسکرام زمان زیادی نداریم: "ما به دیزاین بهتر در پایان اسپرینت فعلی نیاز داریم"
از سخن استاد که بگذریم، جدا چطور میتونیم ادعا کنیم کدی رو ریفکتور کردیم ولی ساید افکت داشته! یا بدتر، بگیم ریفکتور کار سختیه… اصلا چرا ریفکتور کنیم وقتی احتمال ساید افکت وجود داره؟ اصلا ریفکتور کی و کجا باید انجام بشه؟!
قصد ندارم خیلی سرتون رو درد بیارم، اگه بعد از ریفکتور ساید افکت به وجود بیاد قطعا یه چیزی به اسم Test توی پروژه کمه! یا اینکه Test هایی که داریم Valuable نیست.
زمانی که داریم روی کدی کار میکنیم که Test نداره یا اصطلاحا Legacy Code هست خنده داره بخوایم راجب ریفکتور حرف بزنیم. در واقع بهتره قبل از تغییر ساختار کد اول از عملکردش به کمک Test مطمئن بشیم. زمانی که مطمئن شدیم کد داره درست کار میکنه ریفکتور آغاز میشه. نتیجتا اگر بعد از ریفکتور تست ها پاس شد کار تمامه! (میزان Code Coverage و Valuable بودن تست ها رو در نظر داشته باشین).
جمله ی بالا رو میتونم اینجوری عنوان کنم که Test به ما این اطمینان رو میده که کدها رو با اعتماد به نفس Refactor کنیم. (اگر فرصت داشته باشم بعدا راجب تست مطلب مینویسم)
ریفکتور نه تنها کار سختی نیست شاید یکی از لذت بخش ترین قسمت های برنامه نویسی باشه چیزی که کمک میکنه اخر اسپرینت نرم فراری با طراحی خوب داشته باشیم (حتی آخر روز). ریفکتور تسک نیست که بخواد در قالب اسپرینت بگنجه ریفکتور یه پروسه هست که دائم درگیریم باهاش.
First, solve the problem. Then, write the code. “John Johnson”
اول مسأله رو حل کن، بعد کد رو بنویس.
این جمله واقعیت ارزشمندی رو بیان میکنه، اولین قدم حل کردن مساله هست، به نظر من روی کاغذ، بعد نوشتن کد هست، و نهایتا بهتر کردن کد با هدف اینکه قراره بعدا توسط خودمون یا شخص دیگه ای توسعه پیدا کنه.
تا کی ریفکتور کنیم؟
به نظرم تقریبا هر کدی قابلیت بهتر شدن رو داره، چه از نظر زیبایی چه از نظر performance، شاید یکی از هدف های ریفکتور قابل خوندن تر شدن کد باشه. به عبارتی ما کد رو ریفکتور میکنیم که پیچیدگی ها کمتر بشه و معماری کدمون تمیز تر بشه تا نهایتا به کدی برسیم که نگهداری و توسعه ی اون راحتتره. اینکه ریفکتور رو تا کی ادامه بدیم جای بحث داره. اگر یکسال پیش این سوال رو ازم میپرسیدن میگفتم تا وقتی امکانش هست! (یه جورابیتا بی نهایت)، الان نظرم اینه تا وقتی حس کنی زمانبندی محصول رو خیلی دچار مشکل نمیکنی و نفر بعدی برای خوندن کدت زمان زیادی نیاز نداشته باشه و اینکه راحت بتونه کدت رو توسعه بده.