اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
چهار دقیقه
برای مشاهده طبقه بندی Bad code smellها میتوانید به اینجا مراجعه کنید.
استفاده از کامنت، به خودی خود یک الگوی بد کد نویسی نیست. ولی ممکن است این امکان به درستی استفاده نشده و فایده مد نظر توسعه دهنده را نداشته باشد.
زمانیکه متدی پر از کامنتهای توضیحی در مورد متد و پیاده سازی آن باشد، احتمالا مشکلی به وجود خواهد آمد. معمولا کامنتهای توضیحی زمانی استفاده میشوند که کد به اندازه کافی گویای کاری که انجام میدهد نباشد. زمانیکه چنین شرایطی بوجود آمد، یکی از اولین راه حلها، اعمال تغییراتی بر روی کد، برای درک بهتر آن است.
نامگذاری مناسب و استفاده از نامهای معنی دار برای بخشهای مختلف کد مانند نام کلاسها، نام متدها، نام متغیرها و پارامترها، نقش بسیار مهمی را در زمینه کاهش کامنتهای نامناسب خواهند داشت.
اما وجود کامنتهای توضیحی در مورد کد چه اشکالی را ایجاد میکنند؟ یکی از بزرگترین اشکالاتی که چنین کامنتهایی با خود به همراه میآورند، نگهداری سخت آنها است. فرض کنید کامنتی وجود دارد که عملیات انجام شده توسط کدی را توضیح میدهد. زمانیکه آن مکانیزم تغییر کرد، نیاز خواهد بود که کامنت مربوطه نیز به دقت بررسی شود و تغییر کند. در تولید نرم افزارهای پیچیده این کار بسیار دشوار و زمینه ساز خطا خواهد بود و اگر به دلیل سختی کار یا عجله در تولید، کامنتها بروز نشوند، دیگر هیچ یک از کامنتهای نوشته شده در کد، مورد اعتماد نخواهند بود و کار به مراتب سختتر نیز خواهد شد.
چند مورد از انواع کامنتهایی که بهتر است از آنها پرهیز کنیم، در ادامه مطرح شدهاند.
کامنتهای اضافی یا توضیح واضحات
کامنتهایی که بالای متدها یا کلاسها مشاهده میشوند و توصیف کننده کاری هستند که آن کلاس یا عضو آن انجام میدهد. هنگام توصیف یک کلاس یا عضوی از آن حتما باید توجه داشت که توضیح واضحات انجام نشود. به طور مثال کد زیر را در نظر بگیرید:
// Computes the employee salary public int CalculateSalary(int emplyeeId) { return int.MaxValue; }
امضای متد به اندازه کافی نشان دهنده این است که چه کاری را انجام میدهد. پس نیازی به کامنت بالای آن وجود نخواهد داشت. در این مثال، کامنت معمولی بالای متد استفاده شده است. در مثال مذکور این امکان وجود داشت که از مدل xml documentation استفاده شود؛ ولی در اصل موضوع تفاوتی ایجاد نمیکرد.
زمانیکه میتوان از متغیر یا متد استفاده کرد
زمانیکه در بدنه متدها با محاسبه یا چکهایی روبرو هستیم که به اندازه کافی واضح نیستند، یکی از اولین راهکارهایی که به نظر میرسد، نوشتن کامنت برای آنها است. به طور مثال در متدی که مسئول پاک کردن یک حساب، در یک نرم افزار حسابداری است، چکی به صورت زیر داشته باشیم:
// checks that an account is used or not and checks that an account has childs or not if (voucherLineRepository.Any(dd => dd.PostingAccountId == accountId) || accountRepository.Any(dd => dd.ParentId == accountId])) { return; }
if (UsedInVouchers(accountId) || HasChilds(accountId)) { return; }
if (!CanDeleteAccount(accountId)) { return; } ... public bool CanDeleteAccount(int accountId) { if (UsedInVouchers(accountId) || HasChilds(accountId)) { return false; } return true; }
کدهای کامنت شده
کدهای کامنت شده حسی از ترس و عدم اطمینان را به مشاهده کننده انتقال میدهند. کسی که با کد کامنت شده مواجه شده نمیتواند اطمینان داشته باشد که کد به طور کلی حذف شده، یا موقتا حذف شده و یا باید از حالت کامنت در بیاید یا خیر؟
کسی که آن را کامنت کرده نیز از کار خود اطمینان نداشته! اگر اطمینان داشت که کامنت شدن کد مورد نظر هیچ اختلالی را ایجاد نخواهد کرد و کسی نیازی به آن نمیداشت و حتما آن را به طور کلی حذف میکرد.
کامنتهای اجباری
در بعضی پروژهها، تیم برنامه نویسی تصمیم میگیرد که به صورت اجباری بالای هر متد و عضوی از کلاسها کامنتهایی برای روشنتر شدن موضوع ایجاد کنند. نتیجهای که این کار خواهد داشت، ایجاد یک سری کامنتهای تکراری و اضافه است. کامنتهایی که در خیلی مواقع حتی کپی نام عضو مورد نظر هستند. در بعضی از پروژههایی که به صورت فریم ورک هستند، به دلیل ذات پروژه شاید نوشتن توضیحات اضافه تصمیم خوبی باشد. ولی در بیشتر موارد نوشتن کامنتهای اجباری نتیجه خوبی نخواهد داشت.
لاگ تغییرات
در سالهای پیش این عادت وجود داشت که تغییرات اعلام شده در کدهای برنامه به صورت کامنت در بالای فایلهای مورد نظر وارد میشد. با وجود اینکه با استفاده از ابزارهای سورس کنترل، این موارد خیلی مشاهده نمیشود؛ ولی ذکر آن خالی از لطف نیست. در حال حاضر عموما ابزارهای سورس کنترل میتوانند نقش نگهداری لاگ تغییرات و دلایل آنها را به خوبی بر عهده بگیرند.
کامنت در زبانهای برنامه نویسی امکان خوبی است؛ به شرطی که به خوبی مورد استفاده قرار گیرد.