متد طولانی چیه؟ آیا طولانی بودن یک متد فقط بستگی به تعداد خط های اون داره؟
نمیشه یک قاعده کلی براش درنظر گرفت اما یک متد نباید بیشتر از یک کار رو انجام بده، تو رفتگی های یک متد اصولا نباید بیشتر 3 باشه و تعداد خط کدهاش بیشتر از 10 خط نباید باشه! ( همیشه استثنا وجود داره :-| )
زمانی که تعداد خط کد های یک متد بیشتر از 10 (البته در مورد تعداد خط دقیق اش نظر های متفاوتی وجود داره) شد، شما باید یکسری سوالات از خودتون بپرسین که چرا این متد تعداد خط هاش زیاد شد؟ آیا میشه کمترش کرد؟ یا یک جایی از کد مشکل داره؟
ممکنه زمانی که شما میخواین یک فیچری به سیستم اضافه کنید با خودتون بگین اضافه کردن چند خط کد آسون تر از نوشتن یک متد جدید باشه و کم کم این روش ادامه پیدا میکنه تا بجایی که با یک کد کثیف طرف میشن و فهمیدن اون کد سخت میشه و کلی مشکل ایجاد میکنه در آینده!
مشکلات که متدطولانی ایجاد میکنه:
زمانی که شما با یک متدطولانی طرف میشین اول بسم الله شروع به ریفکتور اون کد نکنید اول متد رو بررسی کنید و باخودتون فکر کنید آیا ارزش ریفکتور داره؟ تست ها پاس میشن؟ ورودی و خروجی های متد نیاز به تغییر داره؟
اما ممکنه شما بخواین که امکان جدیدی به یک متد اضافه کنید حتی اگر یک خط هم باشه باید یک متد جدید براش بنویسین و اگر یک اسم مناسب هم براش بذارین دیگه فردا روزی کسی اگر خاست کد شمارو بخونه فقط از روی اسم متد میفهمه که این متد چیکار میکنه!
روش هایی که میتونید ازشون برای کوتاه کردن یک متدطولانی کمک بگیرین:
اگر یک if دارید یک چند شرط رو چک می کند بهتره اونارو را داخل یک متد جدید قرار بدیم و از اون متد داخل if استفاده کنیم. با این روش اگر کسی کد شما رو بخواد ریفکتور کنه از روی اسم متد میفهمه که if چه شرط هایی رو چک میکنه!
انجام محاسبات ریاضی و فرمول ها داخل یک متد جدید و استفاده از اون متد داخل متد های دیگه که باعث افزایش خوانایی کدتون میشه، بهتره که بدونید اگر مقدار خروجی نیاز به پرفورمنس بالایی داره، ایجاد یک متد جدید ممکنه روی پرفورمنس شما تاثیر بذاره.
به عکس(2) کد سمت راست توجه کنید basePrice سه بار محاسبه میشه درصورتی که کد سمت چپ فقط یک بار basePrice محاسبه میشه!
تو این روش زمانی که شما یک آبجکت دارید و چند متغیرش رو به متد دیگه ای پاس میدین بجای اینکه داخل متد اصلی اونهارو get کنید و بعد به متد دیگری که کار محاسبه رو انجام میده پاس بدین کل اون آبجکت رو بهش پاس میدین و متغیرها داخل همون متد get میشن و ازشون استفاده میشه، از این خوبی های این روش اینه که اگر نیاز بود متغیر دیگه ای از آبجکت رو به همون متد پاس بدین نیاز به تغییر ورودی های متد نیست!
اما این روش انعطاف پذیری کد رو کمتر میکنه و اگر اون متدفرعی در جاهای دیگری هم استفاده شده باشه برای فرخوانیش نیازه که فقط اون آبجکت رو پاس بدین بهش!
Replace Method with Method Object
در این روش ما یک متد داریم که متغیرهای محلی زیادی داره و خیلی محاسبات پیچده ای انجام میده به همین نمیتونیم اونو به چند متد کوچکتر تبدیلش کنیم،
1. برای حل این مشکل یک کلاس جدید با نام مناسب که گویای کاری که انجام میده ایجاد میکنیم
2. متغیرهایی که داخل متد استفاده شده بود داخل کلاس جدید بصورت private تعریف میکنیم
3. داخل متد سازنده کلاس جدید تمام مقادیری که برای محاسبه نیاز هست میگیرم و مقادیر رو set میکنیم
4. یک متد برای انجام محاسبات ایجاد میکنیم و چون متغیرهای موردنیازمون به صورت محلی داخل کلاس تعریف شدن میتونیم محاسبات به چند متد کوچیک تقسیم کنیم و داخل اصلی محاسبه مقدار اصلی رو برگردونیم.
تو این روش چون یک کلاس جدید برای انجام بیزنس اضافه میشه کمی باعث پیچدگی کد میشه.
Extract Method
ساده ترین روش کوچک تر یک متد این روش هست که فقط کافیه متداصلی به چند متد کوچک تر تقسیم کنید و هرکدوم وظیفه انجام یک کار رو بهعده بگیرن.
که باعث میشه کدخواناتری داشته باشیم و از به وجود کد تکراری جلوگیری میکنه.
جمع بندی
با کوتاه کردن متد های شما به کدهایی دست پیدا میکنید که عمر طولانی دارند، خواناتر هستند و تست نوشتن براشون خیلی آسون تر هست البته تبدیل یک متدطولانی به چند متد کوتاه تر تاثیری خیلی کم روی پرفورمنس داره که اونقدر ناچیز هست که نیاز به نگرانی نداره.
البته همیشه استثنا هست!
منابع
https://refactoring.guru/smells/long-method
https://makolyte.com/refactoring-the-long-method-code-smell/
https://medium.com/@joshsaintjacque/whats-the-problem-with-long-methods-72203f516cdb
https://dev.to/thinkster/code-smell-long-method-1c2e