شی گرایی و اصول SOLID

برخی معتقدند شی گرایی نوعی برنامه نویسی منسوخ شده ست اما در مقابل گروهی مخالف این نظر هستند و همچنان بر این عقیده جلو میرن که حتما شی گرا کد بزنن.در این مقاله ما اصلا نمیگیم شی گرایی خوبه یا منسوخ شده صرفا قرار هست باهاش آشنا بشیم و بدونیم چجوری کد شی گرا تمیز تری داشته باشیم. اگر مثل من فکر میکنید شی گرایی ممکنه بعضی مواقع بهمون خیلی کمک کنه ادامه مطلب رو با من همراه باشید.به طور کلی زیرساخت زبان پایتون براساس شی گرایی نوشته شده و متود هایی که استفاده میکنیم نوعی کلاس هستند.شی گرایی در اصل به معنای ساختن اشیایی هست که خصوصیات خاصی را از هم به ارث میبرند.فرض کنیم در یک شرکت اگر افراد را شی در نظر بگیریم ، تمامی کارمند ها انسان هستند و خصوصیات انسان را به ارث می برند. مثلا تمامی انسانها آنها دارای نام و نام خانوادگی و سن و شماره تماس هستند.حال می توان کلاس کارمند بودن را برای آنها تعریف کرد که خواص انسان بودن را ارث میبرند و برای مثال حقوق هم برای آنها تعریف می شود.از بین کارمندان تعدادی حسابدار ، برنامه نویس ، منشی و ... افراد هستند که خواص انسان بودن و کارمند بودن را به ارث میبرند و همینطور خواص متفاوتی نیز باهم دارند.در برخی موارد مانند مثال بالا نیاز است با شی گرایی آشنا باشیم تا برنامه ی منظم تری بنویسیم و از شلوغی کد ها جلوگیری کنیم.حالا اگر بخوایم کد تمیز و شی گرا داشته باشیم باید تا حد ممکن از قواعد SOLID پیروی کنیم. این قواعد مثل ۵ ستون کد های شی گرا عمل میکنن : 1 - SRP ( Single responsibility principle) اصل تک مسئولیتی : هر کلاس باید فقط یک وظیفه داشته باشه !کاملا هم منطقیه ، فکرشو کنید به عنوان حسابدار در جایی استخدام شدید ، شما وظیفتون حسابداری و انجام کار های مالی هستش و هیچوقت مسئولیت های واحد دیجیتال مارکتینگ رو به شما واگذار نمیکنن چون شما فقط یک وظیفه مشخص دارید که باید به همون رسیدگی کنین. 2 - OCP ( open / closed principle ) اصل باز - بسته : کد های پروژه باید برای توسعه داده شدن باز و نسبت به تغییر دادن بسته باشن. پیچیده شد؟ نگران نباشید ! بیاید اول راجع به کلاس باز صحبت کنیم : کلاس باز یعنی کلاسی که بشه ازش extend کرد و توسعه اش داد. یعنی بشه تو متود ها و ویژگی های کلاس تغییراتی ایجاد کرد.کلاس بسته : کلاسی که کامل تست شده باشه و بشه برای توسعه بقیه کلاس ها ازش استفاده کرد ، پایدار باشه و در آینده تغییر نکنه.حالا تو اصلا ocp میگه اگه بخوایم تو کلاسی که داریم متود جدید اضافه کنیم نباید نیاز به تغییر تو بخش های دیگه کد ( مثلا کلاسی که ازش extend کردیم ) باشه.3 - LSP ( Lis kov substitution principle ) اصل جایگزینی لیسکوف : فرض کنید کلاس B یک زیر کلاس از A باشه، آبجکت های نوع A باید بتونن بدون تغییر دادن کد برنامه با آبجکت های نوع B جایگزین بشن. کلاس های فرزند نباید رفتار و ویژگی های کلاس والد رو تغییر بدن.ساده تر بگم. وقتی کلاسمون از یک کلاس دیگه EXTEND میکنه ، نباید طوری کد بزنیم که ویژگی های کلاس والدمون over write بشه. 4 - ISP ( Interface segregation principle ) اصل جداسازی اینترفیس ها : کلاس ها نباید مجبور باشن متود هایی که بهشون نیاز ندارن رو پیاده سازی کنن. ** نکته : در زبان پایتون ما مفهومی به نام اینترفیس نداریم اما یجورایی abstract class هارو میشه به عنوان interface در نظر گرفت کارش شبیه به همونه. اصلا کارش چیه؟ یه جور قانون گذار محسوب میشه. در واقع کلاسیه که یه سری فانکشن تعریف میکنه که هر کلاسی ازش extend کنه حتما باید اون توابع رو پیاده سازی کنه. یعنی چی؟ مثلا من یک کلاس تعریف میکنم محاسبه حقوق که یکی از توابعش محاسبه کارکرد کارمند و تابع دیگه ای داره به اسم محاسبه کسری کار ، اما تو این توابع هیچ کدی نوشته نشده هر واحدی که از این کلاس استفاده میکنه باید با توجه به نیاز خودشون پیاده سازی کنن. اینجا این اصل داره میگه من به عنوان قانون گذار نباید قاعده ای تعریف کنم ، که کسی که نیازی بهش نداره مجبور به پیاده سازیش باشه. مثلا واحد فروش یک شرکت نیاز به یک تابع برای پیگیری مشتری ها داره ، ولی بخش فنی نیازی به استفاده از این تابع نداره اگه من این قاعده رو بزارم مجبور میشن در عین حال که بهش نیاز ندارن پیاده سازیش کنن. و این باعث میشه این اصل نقض بشه.5 - DIP ( dependency inversion principle ) اصل وارونگی وابستگی : بین کلاس ها در شی گرایی ممکنه پیش بیاد که ارتباطی وجود داشته باشه. اما این باید طوری نوشته بشه که بین ماژول ها و آبجکت های سطح بالا و سطح پایین نباید وابستگی وجود داشته باشه. برای تغییر کلاس های سطح بالا نباید کلاس های سطح پایین دچار تغییر بشن.گرد آورنده : پرستو کشاورز هدایتی استاد : دکتر مریم حاجی اسمعیلی ، دکترای علوم کامپیوتر از دانشگاه کینگستون لندنDr.Maryam HajiesmaeiliPhD of computer science from Kingston university of LondonLinkedin