این اصل باز / بسته بنیادیترین اصل طراحی در دنیای توسعه نرمافزار است. این اصل به ما راهنمایی میکند که چگونه یک سیستم پایدار و انعطافپذیر بسازیم.
تعریف:
یک موجودیت نرمافزاری مانند کلاس، ماژول و تابع باید برای گسترش باز و برای تغییر بسته باشد.
معنای اصل باز و بسته این است که یک موجودیت نرمافزاری باید برای دستیابی به تغییر گسترش یابد، نه اینکه با تغییر کد موجود به تغییر دست یابد.
اصل باز و بسته، اصلی است که توسعه و طراحی فعلی را برای آینده موجودیت نرمافزاری محدود میکند.
توجه: اصل باز و بسته برای گسترش باز و برای تغییر بسته است. این به این معنا نیست که هیچ تغییری انجام نخواهد شد. تغییرات در ماژولهای سطح پایین باید با ماژولهای سطح بالا مرتبط باشند، در غیر این صورت، یک قطعه کد جدا شده و بیمعنی خواهد بود.
اهمیت اصل باز و بسته:
- تأثیر اصول باز و بسته بر تست
اصل باز و بسته این است که کد تست اصلی همچنان قادر به اجرا به طور عادی باشد، ما فقط نیاز داریم کد گسترش یافته را تست کنیم.
- اصل باز و بسته میتواند قابلیت استفاده مجدد را بهبود بخشد.
در طراحی شیگرا، تمام منطق از منطق اتمی ترکیب میشود، به جای اینکه منطق کسبوکار به طور مستقل در یک کلاس پیادهسازی شود. تنها به این روش میتوان کد را دوباره استفاده کرد. هرچه اندازهگیری کوچکتر باشد، احتمال استفاده مجدد بیشتر است.
- اصل باز و بسته میتواند قابلیت نگهداری را بهبود بخشد.
- نیازمندیهای توسعه شیگرا
چگونه از اصل باز و بسته استفاده کنیم:
اول، گسترش را از طریق رابط یا کلاس انتزاعی محدود کنید، گسترش مرز را محدود کنید و اجازه ندهید متدهای عمومی که در رابط یا کلاس انتزاعی وجود ندارند؛
دوم، سعی کنید از رابطها یا کلاسهای انتزاعی برای نوع پارامترها و اشیاء مرجع به جای کلاسهای پیادهسازی استفاده کنید؛
سوم، لایه انتزاع باید تا حد ممکن پایدار نگه داشته شود، به محض تأیید، هیچ تغییری مجاز نیست.
کپسولهسازی تغییرات دو معنی دارد:
اول، تغییرات مشابه را در یک رابط یا کلاس انتزاعی کپسوله کنید؛
دوم، تغییرات مختلف را در رابطها یا کلاسهای انتزاعی مختلف کپسوله کنید. دو تغییر مختلف نباید در یک رابط یا کلاس انتزاعی ظاهر شوند.
نمونهها
یک مثال، باز و بسته کردن درها با دست.

اگر یک درخواست جدید وجود داشته باشد، لازم است که عملکرد باز و بسته کردن کشو با دست افزایش یابد. برای کد، شما باید یک کلاس Drawer اضافه کنید و به طور همزمان کلاس Hand را تغییر دهید.

با پیروی از مثال اصل باز و بسته OCP، باز و بسته کردن در با دست به یک رابط وابسته است و کلاس پیادهسازی خاص این رابط را پیادهسازی میکند.

زمانی که لازم است تعداد دستها برای باز و بسته کردن یخچال افزایش یابد، کلاس یخچال این رابط را بدون تغییر کلاس و رابط Hand اصلی پیادهسازی میکند.

منابع بیشتر شیگرا
This post is also available in Deutsch, English, Español, Français, Bahasa Indonesia, 日本語, Polski, Portuguese, Ру́сский, Việt Nam, 简体中文 and 繁體中文.