টেকনিক্যালসফটওয়্যার ডিজাইন প্রিন্সিপাল

সফটওয়্যার ডিজাইন প্রিন্সিপাল-৩। লিসকভ সাবস্টিটিউশন প্রিন্সিপাল

লিসকভ সাবস্টিটিউশন প্রিন্সিপাল

বব চাচ্চুর পাচটি প্রিন্সিপালের ৩য় টা অর্থাত লিসকভ সাবস্টিটিউশন প্রিন্সিপাল নিয়ে আমরা আজকে কথা বলব। LSP অনুযায়ী, সাবক্লাস/ডিরাইভড ক্লাস তাদের সুপারক্লাস/বেজ ক্লাসের পরিবর্তে বসতে পারে। পিতাপুত্রের সম্পর্ককে আমরা এখানে বুঝার জন্য উদাহরন দিতে পারি।

ধরি, পিতার সকল বৈশিষ্ট্য তার পুত্র উত্তরাধিকার সুত্রে প্রাপ্ত হয়েছে। পিতার চেহারা, ব্যবহার, যোগ্যতা এমনকি সম্পদের ও। এখন পিতার কোথাও দাওয়াত থাকলে পিতার পরিবর্তে পুত্র গেলেও চলবে। কোথাও পিতার স্বাক্ষর দরকার হলে সেখানে পুত্র স্বাক্ষর করলেই হবে। সহজ ভাষায় এটিই হল লিসকভ সাবস্টিটিউশন প্রিন্সিপাল।

এবার আসি টেকনিক্যাল ব্যাখ্যায়, ধরি B একটি অবজেক্ট অরিয়েন্টেড ক্লাস যে কিনা ক্লাস A কে ইনহেরিট করছে। কোনো একটা মেথডের প্যারামিটার হিসেবে ক্লাসে A এর অবজেক্ট কেত

একটা উদাহরন দেখা যাক-

class Rectangle {
	protected int $width;
	protected int $height;

	public function __construct(int $width, int $height) {
		$this->width = $width;
		$this->height = $height;
	}

	public function getWidth(): int {
		return $this->width;
	}

	public function setWidth(int $width): void {
		$this->width = $width;
	}

	public function getHeight(): int {
		return $height;
	}

	public function setHeight(int $height): void {
		$this->height = $height;
	}

	public function getArea(): int {
		return $this->width * $this->height;
	}
}

একটা আয়তক্ষেত্রের ক্ষেত্রফল এবং এই রিলেটেড টাস্ক সমাধা করার জন্য আমরা একটা Rectangle ক্লাস বানালাম। যেখানে getArea() মেথডের কাজ হল ক্ষেত্রফল ক্যালকুলেট করা। একটি আয়তক্ষেত্রে ক্ষেত্রফল বের করতে হলে এর দৈর্ঘ ও প্রস্থ গুন করলেই পাওয়া যাবে। এখন আমাদের প্রয়োজন হল এবং বর্গক্ষেত্রে ক্যালকুলেশান করার জন্য আরেকটি ক্লাস বানালাম এবং Square ক্লাস Rectangle ক্লাসকে ইনহেরিট করবে। কেন? কারন বর্গক্ষেত্র হল একটি বিশেষ ধরনের আয়তক্ষেত্র যেখানে শুধুমাত্র দৈর্ঘ প্রস্থ সমান।

class Square extends Rectangle {

	public function __construct(int $height, int $width) {
		parent::__construct($height, $width);
	}

	public function setWidth(int $width): void {
		$this->setWidth($width);
		$this->setHeight($width);
	}

	public function setHeight(int $height): void {
		$this->setHeight($height);
		$this->setWidth($height);
	}
}

বর্গক্ষেত্রের দৈর্ঘ প্রস্থ সমান, কিন্তু আমাদের এখানে স্কয়ার ক্লাসে দৈর্ঘ প্রস্থ আলাদা দেওয়ার সুযোগ আছে। তাহলে এখানে লিসকভ সাবস্টিটিউশন প্রিন্সিপাল অমান্য করা হচ্ছে। অর্থাত Rectangle ক্লাসের বদলে আমরা Square ক্লাসকে Substitute হিসেবে ব্যবহার করলে প্রোগ্রামে ইরর আসবে।

Hi, I’m মেহেদী জামান

Leave a Reply