این مطلب بخشی از آموزش اصول برنامه نویسی شی گرا هست.
ایده کپسوله سازی (Encapsulation) در مورد محتوی یک شی (Object) است. نه تنها برای نگه داشتن آنها، بلکه برای محافظت از آنها.
ما خصوصیات (attributes) یا داده های (data) یک شی را با متدهایی که بر روی آن داده ها در همان واحد یا کلاس کار می کنند، جمع (bundle) می کنیم. یکی از دلایل این کار محدود کردن دسترسی به برخی از اجزای شی است. فرض کنید که من یه شیشه (jar) پر از کلوچه دارم و بقیه فقط اجازه دارن از طریق من به کلوچه های توی شیشه دسترسی داشته باشن.
کلاس CookieJar دارای یک ویژگی است که تعداد کلوچه های موجود در شیشه را نشان می دهد. زمانی که نمونه ای (Instance) از CookieJar خود را ایجاد می کنم ، نمی خواهم که شما یا هر بخش دیگری از برنامه من بتوانید به تعداد کلوچه ها دسترسی پیدا کرده و مستقیماً آن را تغییر دهید. شاید برای شما سوال بشود که مگر نمی شود به بخش های دیگر کد اعتماد کرد! اینجا فقط بحث اعتماد نیست. اگر به شما اجازه دهم به طور مستقیم چیزهایی مانند شماره (numCookie) را تغییر دهید، ممکن است شما ناخودآگاه آن را به چیزی نامعتبر مانند منفی یک تبدیل کنید. این مقدار برای تعداد کلوچه ها معنی ندارد و ممکن است باعث کرش کردن (crash) برنامه من شود. دلیل دیگر برای محدود کردن دسترسی این است که، خُب شاید بخواهم تعداد کلوچه هایی که به شما می دهم را محدود کنم!
برای کنترل دسترسی به این ویژگی (numCookie)، آن را مخفی می کنم، بنابراین فقط از داخل شی CookieJar قابل دسترسی است. سپس متدی به نام requestCookie (درخواست کلوچه) اضافه می کنم که از سایر قسمت های برنامه قابل دسترسی است. هنگامی که از متد requestCookie استفاده می کنید، یک کلوچه دریافت خواهید کرد و متد فوق خصوصیت تعداد کلوچه ها (numCookie) را تغییر می دهد.
یکی از اصول کپسوله سازی این است که یک شی نباید چیزی را در مورد خودش در دسترس قرار دهد، مگر اینکه واقعا سایر بخش های برنامه نیاز باشد با آن کار کنند. به این مفهوم جعبه سیاه گفته می شود. شما فقط متد requestCookie را صدا می زنید و نیازی نیست که بدانید این متد چگونه پیاده سازی شده و کار میکند.
شاید پیش خودتون بگید که من به عنوان برنامه نویس باید دقیقا بدونم که توی متد چه اتفاقی میفته، خب آیا شما می دونید که تلفن همراه چطور تماس میگیره، ممکنه بکید که خب شماره میگیرم و تماس برقرار میشه، ولی آیا میدونید که دقیقا داخل تلفن همراه شما چه اتفاقی میفته، واقعا مهم نیست، شما ممکنه یه تلفن جدید بخرید، ظاهرا شما دارید شماره میگیرید و تماس برقرار میشه ولی ممکنه که اتفاقات داخل تلفن همراه جدید شما با قبلی تفاوت داشته باشه، ولی چون یه خروجی یکسان (برقراری تماس) به شما میده خیلی برای شما تفاوتی نمیکنه.
یكی از مهمترین مزایای استفاده از شی گرایی، این است كه به ما این امکان را می دهد كه با خیال راحتتر روش كار شی را بدون تغییر مابقی برنامه تغییر دهیم.
ممکنه هنگامی که من برای اولین بار کلاس CookieJar را نوشتم، تعداد کل کلوچه ها را به عنوان یک مقدار واحد بیان کردم. ولی بعداً تصمیم می گیرم از سه مقدار جداگانه استفاده کنم تا تک تک انواع کلوچه ها را بطور جداگانه پیگیری کنم. (مثلا علاوه بر خصوصیت numCookie دو خصوصیت جدید به نام های numChocolateCookie و numSugerCookie هم اضافه کنم.) از آنجایی که این خصوصیات را از بقیه برنامه مخفی کردم، دیگر لازم نیست نگران خرابی قسمت های دیگر برنامه خودم که از متد requestCookie برای گرفتن کلوچه ها استفاده کرده اند، باشم. فقط لازمه که کلاس و متد requestCookie رو برای انجام این کار تغییر بدم.
سوالی که ممکنه پیش بیاد اینه که من خودم کد رو نوشتم، چرا باید کد خودم رو از خودم مخفی کنم؟!!
در واقع جواب این سوال اینه که مسئله فقط مخفی کردن کد نیست بلکه کاهش وابستگی بین بخش های مختلف برنامه است. اگه این اصل رو رعایت نکنیم با یک تغییر کوچک باید بخش های زیادی از برنامه خودمون رو تغییر بدیم.
ولی میزان این مخفی کردن چقدر باید باشه؟ خب زبان های برنامه نویسی مختلف سطوح مختلفی از پنهان کردن خصوصیات و متد ها رو ارائه میدن، ولی قانون کلی اینه که تا جایی که میشه اصل کپسوله سازی رو رعایت کنیم.
قسمت قبلی : آموزش اصول برنامه نویسی شی گرا : انتزاع (Abstraction)
قسمت بعدی : آموزش اصول برنامه نویسی شی گرا : وراثت (Inheritance)