آقای بهروز بختياری که نويسنده وبلاگ زيبا و پرمحتوای
ooa.blogfa.com هستند، در مورد نوشته من درباره ذينفعهای پروژه، ابراز لطف کرده بودند و اين موضوع باعث شد تا من با وبلاگشان آشنا گشته و از مطالبشان استفاده نمايم.
وقتی مطالب ايشان در مورد مفاهيم شیءگرا را مطالعه میکردم، نکتهای برایم جالب آمد که آن را با ذکر خيری از دوران دانشجويیام عرض میکنم.
وقتی که من درس مهندسی نرمافزار را با استاد عزيزم آقای مهندس سیدابراهيم ابطحی میگذراندم، از ايشان خواهش کردم که اجازه بدهند تا من سميناری در مورد مفاهيم شیءگرا داشته باشم. ايشان نيز لطف کردند و موافقت نمودند.
پس از اتمام سمينارم، استاد نکتهای را اشاره کردند که آن موقع منظورشان را درست برداشت نکردم و بعدها به کنه مطلبشان پی بردم.ايشان در آن جلسه فرمودند که
نگاه شما به مفاهيم شیءگرا در سطح برنامهنويسی متمرکز شده است، در حالی که اين مفاهيم گستره وسيعتری را در بر میگيرند.
برای اين که منظورشان را بيشتر توضيح دهم، اجازه بدهيد در مورد اصل
Encapsulation که در فارسی آن را لفافبندی، محصورسازی و مخفیسازی ترجمه کردهاند، مطالبی را عرض کنم.
اين اصل وقتی در سطح برنامهنويسی مطرح میشود، در ذهن اين موضوع را تداعی میکند که شیء ساختار و رفتارش را مخفی میکند، ساختار و رفتاری که استفاده کننده برای استفاده نيازی به دانستن آن ندارد. درست مانند مثالی که دوستمان در وبلاگش آورده است.
اما گستره اين به مراتب بيش از سطح اشيای سيستم است.
در تعريف لفافبندی گفته شده است که «
لفافبندی يعنی در اختيار گذاشتن مواردی که استفاده کننده برای استفاده به آن نياز دارد و حذف مواردی که استفاده کننده برای استفاده به دانستن آن نياز ندارد». دقيقاً مثل فيلمهای پليسی و مافيايی که متهم برای اينکه اطرافيانش را در امنيت قرار دهد، به آنها میگويد: هر چه کمتر بدانيد به نفع شماست.
اين مفهوم در هر سطحی قابل به کارگيری است. به عنوان مثال فرض کنيد میخواهيم اين مسأله را حل و طراحی کنيم:
سيستم انبار پس از ثبت رسيد بايد سندی را در سيستم حسابداری ثبت نمايد. خوب اصل لفافبندی به ما میگويد که سيستم انبار بايد موارد لازم جهت انجام کارش را بداند. اين موارد شامل سرويسی است که سيستم حسابداری در اختيارش قرار میدهد به علاوه ساختاری است که اين سرويس جهت دريافت اطلاعات لازم برای ثبت سند، تعبيه کرده است.
(boolean AccountSystem.AccountingService.SaveVoucher(AccountSystem.AccountInfo accInfo))
حال سيستم انبار نيازی به دانستن چگونگی ثبت سند در سيستم حسابداری (شامل طراحی داخلی، طراحی بانک اطلاعاتی، الگوريتمهای محاسباتی و قوانين کاری) ندارد و نبايد داشته باشد.
چرا؟ برای اينکه مانند فيلمهای مافيايی «در امان باشد».
از چه؟ از تغييرات داخلی سيستم حسابداری (شامل تغيير طراحی، طراحی بانک، الگوريتمها و قوانين کاری).
به عبارت ديگر تأکيد بر اين است که واسط(interface) يعنی تعريف سرويس از نحوه پيادهسازی(implementation) جدا باشد. اين مفهوم نه تنها در سطح اشياء، بلکه در هر سطحی قابل کاربرد است.
اين مفهوم، يکی از اصول دنيای شیءگراست و در بر طراحی تمامی اجزای آن مانند سيستم، زيرسيستم، مولفه و غيره نيز حاکم است.