Amir Fatemi
Amir Fatemi
خواندن ۳ دقیقه·۱ سال پیش

اصول Solid در یونیتی - قسمت دوم (O)

سلام دوستان

ما قبلا در مورد اصل Single-responsibility principle صحبت کردیم و متوجهش شدیم.تو این مقاله میخواییم در مورد اصل باز-بسته (Open-Closed Principle) در اصول SOLID صحبت کنیم


اصل باز-بسته (Open-Closed Principle) در طراحی SOLID می‌گوید که کلاس‌ها باید برای گسترش باز باشند اما برای اصلاح بسته شوند. ساختار کلاس‌های خود را به گونه‌ای بچینید که بتوانید رفتار جدیدی را بدون اصلاح کد اصلی ایجاد کنید.

یک مثال کلاسیک این اصل در محاسبه مساحت یک شکل است. شما می‌توانید یک کلاس به نام "AreaCalculator" با متدهایی برای بازگرداندن مساحت یک مستطیل و یک دایره ایجاد کنید.

برای محاسبه مساحت، یک کلاس "Rectangle" که دارای عرض (Width) و ارتفاع (Height) است لازم است. اما برای یک دایره، تنها نیاز به شعاع (Radius) و مقدار پی (pi) است.

این روش به خوبی کار می‌کند، اما اگر بخواهید شکل‌های دیگری را به AreaCalculator اضافه کنید، باید برای هر شکل جدید یک متد جدید ایجاد کنید. فرض کنید بعداً می‌خواهید به آن پنتاگون یا اکتاگون نیز بدهید؟ اگر نیاز به 20 شکل دیگر داشته باشید، کلاس AreaCalculator به سرعت به طور ناپیوسته بزرگ می‌شود.

می‌توانید یک کلاس پایه به نام Shape بسازید و یک متد برای پردازش اشکال ایجاد کنید. با این حال، این کار نیازمند چندین عبارت if در داخل منطق است تا هر نوع شکل را پردازش کند. این روش خوب مقیاس پذیر نیست.

شما می‌خواهید برنامه را برای گسترش (قابلیت استفاده از اشکال جدید) بدون اصلاح کد اصلی (بخش داخلی AreaCalculator) باز کنید. اگرچه کاربردی است، اما AreaCalculator فعلی در اصل باز-بسته را نقض می‌کند.

چگونه می‌توانیم کلاس AreaCalculator را به گونه‌ای طراحی کنیم که بتواند شکل‌های جدید را پذیرفت؟
چگونه می‌توانیم کلاس AreaCalculator را به گونه‌ای طراحی کنیم که بتواند شکل‌های جدید را پذیرفت؟


به جای آن، در نظر بگیرید که یک کلاس انتزاعی به نام Shape را تعریف کنید.

این شامل یک متد انتزاعی به نام CalculateArea می‌شود. اگر سپس مستطیل (Rectangle) و دایره (Circle) را از Shape ارث ببرید، هر شکل می‌تواند مساحت خود را محاسبه کند و نتیجه زیر را بازگرداند:

در نتیجه AreaCalculator می‌تواند به این شکل ساده‌سازی شود:

کلاس بازنگری شده AreaCalculator اکنون می‌تواند مساحت هر شکلی را از کلاس انتزاعی Shape که به درستی پیاده‌سازی شده است، دریافت کند. سپس می‌توانید قابلیت‌های AreaCalculator را بدون تغییر در منبع اصلی آن گسترش دهید.

بازبینی کلاس‌ها برای اصل باز-بسته (Open-Closed Principle)
بازبینی کلاس‌ها برای اصل باز-بسته (Open-Closed Principle)


هر بار که به یک چندضلعی جدید نیاز دارید، به سادگی یک کلاس جدیدی تعریف کنید که از کلاس Shape ارث‌بری کند. سپس هر زیرکلاس شکل، متد CalculateArea را بازنویسی کرده و مساحت صحیح را برگرداند.

این طراحی جدید، عملیات اشکال یابی را آسان‌تر می‌کند. اگر یک شکل جدید خطایی به وجود آورد، نیازی به بازبینی کلاس AreaCalculator نخواهید داشت. کد قبلی بدون تغییر باقی می‌ماند، بنابراین تنها کافیست کدهای جدید را برای یافتن هرگونه منطق نادرست بررسی کنید.

هنگام ایجاد کلاس‌های جدید در Unity، از رابط‌ها و انتزاع استفاده کنید. این کمک می‌کند تا از عبارات switch یا if بزرگ و پیچیده در منطق خود استفاده نکنید که در آینده سختی در افزودن و گسترش آنها خواهد بود. وقتی با تنظیم کلاس‌های خود طبق اصل باز-بسته آشنا شوید، افزودن کد جدید در طولانی مدت ساده‌تر می‌شود.



قسمت بعد به سومین اصل طراحی Solid که Liskov substitution principle نام دارد خواهیم پرداخت

امیر فاطمی - Amir Fatemi

SOLIDPrinciplesSoftwareDesignObjectOrientedProgrammingcleancodeCodeArchitecture
شاید از این پست‌ها خوشتان بیاید