🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ علی
Open closed principle
مهرداد سامی حل شده توسط مهرداد سامی

سلام 

 

class Notification
{
    public function send(string $type, array $params)
    {
        $class_name = ucfirst($type);
        $object = new $class_name();
        $object->send($params);
    }
};
class Sms
{
    public function send(array $params)
    {
        echo 'send sms';
    }
};
class Email
{
    public function send(array $params)
    {
        echo 'send email';
    }
};

 

تو این مثال که زده شد اگه بدون اینکه تغیری در کدهای قبلی کلاس ایجاد کنم متد جدید ایکس رو داخل کلاس نوتیفیکشن تعریف کنم  اصل باز و بسته که نقض نمیشه؟ درسته؟ 

سلام 

 

بستگی به این داره که چه تغییری میخواید ایجاد کنید. ولی این رو هم در نظر داشته باشید که اگر قرار باشه یه قابلیت جدید به این کلاس اضافه کنید اصل Single Responsibility رو نقض میکنید.

مهرداد سامی ۲۴ فروردین ۱۴۰۰، ۱۷:۲۳

ممنون از پاسختون. 

 

تویه این اصل مطرح میشه که قابلیت‌های کلاس رو گسترش بدیم بدون اینکه کدهای قبلی دستخوش تغییر بشن. تو این مثالی که شما مطرح کردن و چندتا مثالی که خودم دیدم گسترش قابلیت کلاس به این صورت بوده که یک قابلیت مثل ارسال پیام تویه کلاس اصلی داریم که نیاز داریم این قابلیت به شکل‌های دیگه هم توسعه داده بشه. می‌خواستم بدونم غالبا گسترس قابلیت‌های کلاس همین شکلیه؟ یا میشه مثلا با اضافه کردن متد x که قابلیت کاملا جدید و هم سو با هدف کلی کلاس هست کلاس موردنظرمو گسترش داد؟ مثلا کلاس User من تا حالا قابلیت شمارش تعداد کاربران رو نداشته حالا میخوام این قابلیت رو به صورت یک متد جدید بهش اضافه کنم پس کلاس User توسعه داده میشه بدون اینکه کدهای قبلی دچار تغییر بشن

علی ۲۴ فروردین ۱۴۰۰، ۱۸:۱۴

ببینید به صورت کلی زمانی که شما متدی بنویسید که در آینده برای تغییر رفتار اون کلاس مجبور باشید که اون متد رو تغییر بدید اصل Open-Closed رو نقض کردید، حالا مثلا اگر شما یک کلاس دارید که داره براتون پیام کوتاه ارسال میکنه و یه متد جداگانه هستش و شما الان میخواید که به این کلاس ارسال ایمیل رو هم اضافه کنید و میرید برای اون یه متد جداگانه تعریف میکنید و به متد قبلی که ارسال پیام کوتاه هست اصلا کاری ندارید. در این جا اصل اول یعنی Single Responsibility رو نقض کردید .. چون کلاس شما الان داره ۲ تا کار انجام میده , برای این مثال میتونید جلسات مربوط به سرویس Notification رو ببینید.

بهترین پاسخ
مهرداد سامی ۰۱ اردیبهشت ۱۴۰۰، ۰۵:۵۲