آرام باشید و کدتان را پنهان کنید: مخفیسازی کد
مخفیسازی کد یا encapsulation یک راهحل کلیدی برای حفظ تمیزی و قابلیت استفاده مجدد آن است. در این مطلب راهنماییهای با توجه به اصل تک مسئولیتی بودن و پنهان کردن وضعیت ارائه میگردد.
مشتریان از خرید یک وسیله انتظار دارند بتوانند آن را باز کنند، قطعات خراب آن را تعویض کنند، آن را ارتقا دهند و دوباره به کار بیندازند. در واقع لازم دارند که هرچه بیشتر ماژولار باشد. همانطور که در کامپیوترها تا حد زیادی به این سمت پیش رفته ایم و در آینده نزدیک تلفنهای همراه هم به همین شکل خواهد شد، کدها هم لازم است اینگونه باشند. با مخفیسازی مناسب کد، با کلاسهایی با همبستگی (cohesion) بالا، خواندن و گسترش کد سادهتر میشود.
اغلب شما کدهای اسپاگتی قدیمی را دیدهاید. مثل فایل PHP بیسرو تهی که HTML و جاوااسکریپت چاپ میکند یا نمونههای جدیدتر آن که از چارچوب MVC استفاده میکنند و توابعی بی سر و ته دارند. مراقبت و نگهداری از این کدها میتواند یک کابوس واقعی باشد. اما آیا شما واقعا از گرفتار شدن در چنین موقعیتهایی اجتناب میکنید؟ توصیه ما این است که همواره تلاش کنید کدتان را تا حد امکان پنهان کنید. جزئیات کد و پیچیدگیهای داخلی آن را پنهان کنید. آن را ماژولار کنید. آن را به black boxهای مجزا تبدیل کنید که هر یک هدف مشخصی دارند. به این ترتیب جایگزینی یک ماژول با دیگری و ساخت یک قابلیت جدید با استفاده مجدد از کامپوننتهای موجود سادهتر خواهد بود. اما دقیقا چگونه؟
۵ فوت و فن پنهان سازی کد
صفتهای کلاس را پنهان کنید، آنها را private کنید.
به جای صفات عمومی، از یک واسط کاربری (interface) مناسب استفاده کنید. اگر دیگران از جزئیات پیادهسازی کلاس شما مطلع هستند و نیاز به دسترسی به صفات آن دارند، پس یک منطقی وجود دارد که لازم است در کلاستان پراکنده و پنهان شده که تنها خدا بداند کجاست. هر تغییری در کلاس نیازمند شما خواهد بود تا تمام استفادههای آن را مرور کنید.
به همین دلیل به جای
if(user.admin || user.moderator || user.editor){ … }
این چطور است:
if(user.canEdit()){ … }
جزئیات کد را درون یک تابع جدید پنهان کنید
یک تکه کد دارید که در چند جا استفاده میشود؟ جزئیات کد را در یک تابع جدید پنهان کنید و به جای آن از این تابع استفاده کنید. با مخفیسازی کد، شما از قانون DRY (Don’t Repeat Yourself)i تبعیت میکنید. استفاده مجدد از آن هم در آینده سادهتر میشود و بازآرایی کد و مراقبت و نگهداری از آن هم سادهتر میگردد.
وضعیت را پنهان کنید.
از متغیرهای global استفاده نکنید، چرا که مخفیسازی را از بین میبرد و تمام بخشهایی که از آن استفاده میکنند را به یکدیگر وابسته میکنند، چرا که به وضعیت آن متغیرها وابسته میشود.
آن را به بخشهای کوچکتر بشکنید.
توابع بزرگی با بخشهای تو در تو و کامنت مجزا دارید؟ آنان را به بخشهای کوچکتر بشکنید، کد را استخراج کنید و کدتان را در توابع private پنهان کنید. به طور معمول یک نظر در کد شما میتواند یک نام عالی برای یک تابع private باشد. بررسی مجدد یک تابع ۵۰۰ خطی میتواند یک توسعهدهنده را به گریه بیندازد. مرور یک تابع که پنج تابع کوچکتر را فراخوانی کرده است خیلی لذتبخشتر است.
به توابع خود تنها یک کار بسپارید.
اگر یک تابع یک مسئولیت داشته باشد، آن را کوتاه و متمرکز روی آن کار قرار داده و کد پشت واسط کاربری کلاس پنهان میشود. اگر نمیتوانید تنها یک مسئولیت به تابع بدهید، پس کلاس همبستگی و یکپارچگی (cohesion) پایینی دارد و لازم است به دو کلاس مجزا شکسته شود.
این لمهای ساده بسیار به شما کمک خواهند کرد که کد انعطافپذیرتری داشته باشید. به زبان دیگر، همانطور که در معرفی همبستگی و وابستگی قبلا توضیح داده شد، همیشه همبستگی را بالا نگهدارید و وابستگی یا coupling را پایین. اولی این اطمینان را میدهد که داده و رفتار به درستی در کلاس قرار گرفتهاند و توابع تمام منطق خود را با استفاده از داده درون خود کلاس اجرا میکنند. دومی تضمین میکند که وابستگی ماژولها مشکلی برای تغییر و استفاده مجدد ماژولها ایجاد نکند.
منبع:
اولین برنامه ی که در اندروید نوشتم کدهای خیلی زیادی داشت و متاسفانه به قدری بزرگ شد که تغییر دادن قسمتی از کد برام بسیار زمان بر شده بود و کلا طوری پیش رفت که دیگه نمی تونستم توی پروژه تغییری ایجاد کنم یا اینکه قسمتی رو که قبلا نوشتم رو بهسازی کنم – این بود که تصمیم گرفتم برم سمت معماری های موجود در برنامه نویسی جاوا و اندروید و در این مسیر به این تصمیم رسیدم که برنامه نویسی ماژولار رو مد نظر داشته باشم و اینکه برنامم رو به بخش های خیلی کوچیک تر که اتفاقا وابستگی ای به هم نداشته باشن تقسیم کنم – این مطلب شما خیلی مناسب بود برام مخصوصا این جمله : همیشه همبستگی را بالا نگهدارید و وابستگی یا coupling را پایین .
بسیار ممنونم .