آموزش اصول solid در پایتون(قسمت دوم)

February 2020

توی این مقاله درمورد دومین قانون از قوانین پنجگانه solid براتون میگم.

open/closed principle:

این قانون میگه که شما باید جوری برنامه نویسی کنید که اگه برنامتون نیاز به گسترش داشت، ویژگی های جدید رو بتونید بدون تغییر دادن کدهای قبلی، به برنامه اضافه کنید.
اصطلاحا کدتون برای گسترش(extension) باز باشه اما برای تغییر(modification) بسته باشه.

مثال

در کد پایین کلاس Animal یک اسم از حیوان رو میگیره و داخل متد sound براساس نوع اون حیوان صداش رو به ما میده. خیلی ساده.

class Animal:
	def __init__(self, name):
		self.name = name

	def sound(self):
		if self.name == 'cat':
			print('meow')
		elif self.name == 'dog':
			print('woof')

missy = Animal('cat')
jack = Animal('dog')

missy.sound()
jack.sound()

کد بالا با قانون open/closed مغایرت داره. چرا؟
فکر کنید که ما میخوایم برناممون رو توسعه بدیم و صدای مار رو هم بهش اضافه کنیم در این صورت مجبوریم که متد sound رو تغییر بدیم که این خلاف قانون هستش. به شکل زیر:

class Animal:
	def __init__(self, name):
		self.name = name

	def sound(self):
		if self.name == 'cat':
			print('meow')
		elif self.name == 'dog':
			print('woof')
		elif self.name == 'snake':
			print('hiss')

missy = Animal('cat')
jack = Animal('dog')
mark = Animal('snake')

missy.sound()
jack.sound()
mark.sound()

حالا برای اینکه کد ما از این قانون تبعیت کنه میتونیم به شکل زیر تغییرش بدیم:

class Animal:
	def __init__(self, name):
		self.name = name

	def sound(self):
		pass
	
class Cat(Animal):
	def sound(self):
		print('meow')
		
class Dog(Animal):
	def sound(self):
		print('woof')
		
class Snake(Animal):
	def sound(self):
		print('hiss')

در کد بالا ما برای هر حیوان یک کلاس مجزا ایجاد میکنیم، در این صورت اگه بخوایم حیوان جدیدی رو اضافه کنیم دیگه نیازی نیست که کدهای قبلیمون رو تغییر بدیم.