-
یک شنبه 16 خرداد 1389, 11:02 صبح
#8
VIP
نقل قول: گفتگوی فنی شماره یک - اصول و قواعد کد نویسی
ممنونم از آقای عسگری و به خاطر وقفه ای که رخ داد، عذرخواهی میکنم. بسیار خوب. اجازه بدید تا به مساله Refactoring بیشتر بپردازم و بعدش در ادامه، اگر بهمون وقت دادن، در مورد ویژگیهای دیگه کدهای خوب که هنوز به اونها اشاره ای نشده صحبت کنم.
حالا که متوجه شدیم چطور میشه کد بو دار رو از کد خوب تشخیص داد، مرحله بعدی روشهایی هستش که میشه بکمک اون روشها بوی بد کد رو گرفت و کد رو به کد تمیزی تبدیل کرد. روشهای متفاوتی برای انجام این کار توسط افراد مختلف پیشنهاد شده و من در اینجا سعی میکنم خیلی گذرا این روشها رو توضیح بدم.
- یکی از مسائلی که در صحبتهای قبلی به اون اشاره کردم، نیاز به تقسیم کدهای طولانی به بخشهای کوچکتر قابل مدیریت بودش. این اولین و مهمترین کاری هستش که باید در Refactoring بهش توجه کنید و اونو تحت عنوان Extract Methods می شناسن. در Extract Method، کد مورد نظر از جایگاه فعلی حذف و به یک تابع جدید منتقل شده و تابع جدید در جای قبلی کد، فراخوانی میشه. طبیعی هستش که بر اساس نیاز، ممکنه Formal Parameter هایی برای تابع جدید در نظر بگیریم، یا به یک Return Value تو Signature اون متود نیاز داشته باشیم. این مساله ارتباط مستقیم به کدی که در دست داریم داره.
- برخی اوقات، ما توابع inline ای داریم، که حقیقتا نیازی به استفاده از اونها نیست و میشه اونها رو حذف کرد. تابع inline در C++ تابعی هستش که کد نوشته شده در این تابع، مستقیما در جاییکه تابع فراخوانی شده قرار میگیره (توسط کامپایلر) تا سرعت اجرای کد افزایش پیدا کنه. البته این مساله باعث افزایش سایز برنامه نیز میشه و باید هنگام لزوم و بدقت از اون استفاده بشه. این توضیحات رو دادم تا به روش بعدی Refactoring تحت عنوان Inline Method اشاره کنم. Inline Method دقیقا عمل عکس Extract Method هستش، به این بیان که ما یک تابع کوچک (عموما یک خطی) رو حذف میکنیم، و Body تابع رو جایی که تابع رو فراخوانی کرده ایم قرار میدیم(همون کاری که کامپایلر با کدهای Inline در C++ انجام میده). اما این سوال پیش میاد که چطوری متوجه بشیم که کی باید اینکارو کنیم؟ یکی از جاهایی که Inline Method زیاد استفاده میشه، کدهایی هستش که در اون یک تابع، تابع دیگه ای رو فراخوانی میکنه و اون تابع نیز به نوبه خودش، تابع دیگه ای رو فراخوانی کرده و این زنجیره چند بار تکرار شده. روش Inline Method باید روی چنین کدی اعمال بشه. در حقیقت، باید این Indirection ها با دقت بررسی بشن، اونهایی که قابل حذف هستن حذف شده و کد مورد نظر مستقیما فراخوانی بشه.
- فرض کنید که در ابتدای تابعی، متغیری رو به Return Value تابع دیگه ای Assign کرده اید اما از این متغیر، تنها در یک نقطه از تابع استفاده می کنید و نه بیشتر! اینجا میتونید فراخوانی تابع رو به نقطه ای که از اون متغیر استفاده کرده اید منتقل کنید، و متغیر مزبور رو از بین ببرید (البته عموما اینکارو هنگامی انجام میدن که این متغیر موقت دست و پای ما رو برای اعمال روشهای دیگه Refactoring بسته باشه). به این روش، Inline Temp گفته میشه.
- Replace Temp with Query هنگامی استفاده میشه که شما در تابعی، متغیری دارید که حاصل یک عبارت هستش. تو این شرایط، محاسبه عبارت از روی Member Variable ها رو باید به یک تابع دیگه منتقل کنید، و سپس اونو جای متغیر مربوطه استفاده کنید.
- Explaining Variable روشی است که در اون، یک عبارت پیچیده، به بخشهای قابل فهم توصیف پذیر شکسته میشن و هر بخش به یه متغیر موقت Assign میشه. اجازه بدید مجددا مثالی از یک Web App بزنم. فرض کنید توی کد نیاز داریم که در صورتیکه browser کاربر IE و سیستم عاملش Windows بود، فلان محصول رو بهش پیشنهاد بدیم. برای اینکار، میتونیم در یک شرط، نوع سیستم عامل و همینطور نوع مرورگر رو بررسی کنیم و در صورتیکه Windows و IE بود، HTML مورد نظر رو Render کنیم. اما به جای اینکه چنین if "سخت فهمی" بنویسیم، بهتره یه متغیر boolean به اسم isIE داشته باشیم که نشون دهنده IE بودن یا نبودن Browser هستش، و یک متغیر به اسم isWin که نشوندهنده ویندوز بودن یا نبودن سیستم نگاه میشه متوجه شد که هدف از اون if چی بوده. عامل هستش. سپس در if مورد نظر، از این دو متغیر استفاده کنیم. در این صورت، if مزبور توصیف پذیر هستش.
- روش بعدی هنگامی کاربرد داره که در یک تابع طولانی از local variable ها بگونه ای استفاده میکنه که نمیشه Extract Method رو روی اون اعمال کرد. تو چنین شرایطی، کلیه اون local variable ها رو به کلاس جدیدی باید منتقل کنید و توابع جدیدی برای اون در نظر بگیرید تا با فراخوانی اون توابع روی object مزبور به هدفتون برسید.
- روش بعدی در Refactoring، عدم Assign کردن Formal Paramter های یک تابع، به مقادیر بازگشتی از توابع دیگه هستش. جای این کار، باید از متغیر موقت دیگه ای استفاده کرد.
- روش بعدی در Refactoring یک کد، جایگزینی الگوریتم با یک الگوریتم بهتر هستش. توی این روش، شما منطق دستیابی به هدف رو با منطق بهتری جایگزین می کنید.
- Split Temporary Variable یا جداسازی متغیر موقت، هنگامی کاربرد داره که شما در تابع خودتون، از یک متغیر موقت برای دو منظور استفاده کرده باشید. حتما تا امروز، کدهای بسیاری دیده اید که در اون یک متغیر در ابتدای تابع تعریف شده و برای مقاصد مختلف ازش استفاده شده. خوانایی چنین کدی پایین هستش و میتونه برنامه نویس رو براحتی به درد سر بندازه. برای از بین بردن بوی بد این کد، میتونید از یک متغیر موقت دیگه استفاده کنید.
به مجموعه روشهایی که تا کنون اشاره کردم، Composing Methods یا متودهای ترکیبی میگن. اعمال برخی از این روشها روی کد توسط Visual Studio به سادگی میسر هستش که در ادامه گفتگو در مورد اون صحبت خواهیم کرد.
از دیگر روشهای Refactoring میشه به موارد زیر اشاره کرد:
- Move Method
- Move Field
- Hide Delegate
- Inline Class
- Extract Class
- Foreign Method
- Local Extensions
- Pull up Constructor
- Push Down Method
- Replace Constructor with Factory Method
- Extract Subclass
- Extract Superclass
اینها روشهای عجیب و غریبی نیستن و در خیلی از موارد از همون ابتدای کار میشه بخش عمده ای از اونها رو با ارائه یک معماری خوب برای نرم افزار پوشش داد. لطفا دقت کنید که این روشها هرگز مختص یک زبان خاص نیستن و میشه اونها رو در Platform های متفاوت اعمال کرد. اگر چه در تکنولوژیهای متفاوت، روشهای فوق، نسبتا رنگ و بوی دیگه ای به خودشون میگیرن، اما مسائلی که نام بردم، سرچشمه کلیه متودهای موجود در Refactoring هستش و در کتاب Refactoring: Improving the Design of Existing Code در مورد اونها به تفصیل توضیح داده شده.
گمان میکنم با ذکر چند مثال عملی در Visual Studio و کدهای C#، بحث Refactoring قدری ملموس تر بشه و این مساله نیز باب آشنایی شما با ابزارهای Refactoring در Visual Studio رو نیز باز کنه. اگر آقای عسگری اجازه بدن، چند مثال در این زمینه بزنم (من هنوز در مورد کدهای بودار، حرفهای ناگفته بسیاری دارم).
برچسب های این تاپیک
قوانین ایجاد تاپیک در تالار
- شما نمی توانید تاپیک جدید ایجاد کنید
- شما نمی توانید به تاپیک ها پاسخ دهید
- شما نمی توانید ضمیمه ارسال کنید
- شما نمی توانید پاسخ هایتان را ویرایش کنید
-
قوانین سایت