در درس های گذشته، با دو حرف اول SOLID آ شنا شدیم. ابتدا Single Responsibility را بحث کردیم و سپس به مفهوم Open Closed پرداختیم. در این درس میخواهیم به سومین حرف از مفهوم SOLID بپردازیم که به آن Lisko Substitution Principle یا همان مفهوم جایگزینی لیسکو میگویند. در میان مفاهیم موجود در SOLID شاید این مفهوم برای درک شدن کمی نیاز به تفکر بیشتری داشته باشد.
این مفهوم به صورت زیر تعریف می شود:
اگر یک موجودیت مثلا کلاس S زیر مجموعه یک کلاس T باشد (برای مثال از آن ارث برده باشد)، اشیایی که از نوع T هستند باید بتواند با اشیایی که از نوع S هستند، جایگزین شوند. این جایگزینی نباید باعث تغییر در ویژگی های مطلوب T شود.
قبول داریم که تعریف بالا، تعریفی نسبتا مجرد و کمی تا قسمتی پیچیده بود. اجازه دهید با یک مثال کلاسیک، این مفهوم را شرح دهیم.
فرض کنید دو کلاس دارید. یکی کلاس Rectangle (یعنی چهارضلعی) و یک کلاس Square (یعنی مربع). در دنیای واقعی، مربع یک چهارضلعی است. یعنی میتوان مربع را یک کلاس زیر مجموعه از چهار ضلعی در نظر گرفت. پس نگاهی به تکه کد زیر با زبان PHP بیندازید:
<?php class Rectangle { protected $width; protected $height; public function setWidth ($width) { $this->width = $width; } public function getWidth () { return $this->width; } public function setHeight ($height) { $this->height = $height; } public function getHeight () { return $this->height; } } class Square extends Rectangle { public function setWidth ($width) { $this->width = $width; $this->height = $width; } public function setHeight ($height) { $this->height = $height; $this->width = $height; } } ?>
همان طور که مشاهده میکنید در کد بالا، کلاس مربع از کلاس چهارضلعی مشتق شده است. از آن جایی که اندازه اضلاع مربع مساوی هستند، در کلاس مربع، مثلا با تغییر ضلع عرض مربع، طول مربع را هم تغییر می دهیم. این کار باعث ایجاد یک سری مشکل در فرآیندهای نرم افزاری می شود.
برای تمرین بر روی این قضیه فکر کنید که این مدل کدنویسی چه مشکلاتی را میتواند بعدا به وجود آورد. برای راهنمایی فرض کنید یک کلاس دارید که ورودی آن یکی از زیرنوع های کلاس چهارضلعی است و نمی دانیم آن چیست. حال در بسیاری از موارد انتظار نداریم که با تغییر عرض یک چهار ضلعی، طول آن هم عوض شود! ولی اگر آن زیر نوع مربع باشد این اتفاق خواهد افتاد و مشکلات بعدی را به وجود خواهد آورد
- ۱ » مسئولیت واحد (Single Responsibility) در مهندسی نرم افزار و برنامه نویسی
- ۲ » مفهوم باز-بسته (Open-Closed) در برنامه نویسی و مهندسی نرم افزار
- ۳ » مفهوم جایگزینی لیسکو (Lisko Substitution Principle) در برنامه نویسی
- ۴ » مفهوم جدایی واسط ها (Interface Segregation Principle) در مهندسی نرم افزار
- ۵ » معکوس سازی وابستگی (Dependency Inversion) در برنامه نویسی