Open closed principle

پرسیده شده
فعالیت 1105 روز پیش
دیده شده 443 بار
0

سلام 

 

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';
    }
};

 

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

فایل پیوست

علی.
علی.

24 فروردین 00

1
حذف شده

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

فایل پیوست

مهرداد سامی

توسط

مهرداد سامی

1 اردیبهشت 00

0
حذف شده

سلام 

 

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

فایل پیوست

مهرداد سامی

توسط

مهرداد سامی

24 فروردین 00

حذف شده
قسمت پایین یک مثال زدم
علی.

25 فروردین 00

0
حذف شده

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

 

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

فایل پیوست

علی.

توسط

علی.

24 فروردین 00