Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions educational-resources/SOLID/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# اصول شی گرایی
شی گرایی یا
شی‌گرایی یا
Object Oriented
صرفا یک روش برنامه نویسی نیست؛ بلکه نوعی روش نگاه است به قلمروی مسئله؛ پشتیبانی زبان های برنامه نویسی متعدد از این رویکرد، به ما کمک می‌کند که آن چه را در قلمروی مسئله و با این رویکرد توصیف کرده ایم، در قلمروی جواب نیز پیاده سازی کنیم.
طراحی سیستم‌ها با رویکرد شی گرایی نیازمند رعایت اصولی است که باعث می‌شود که تغییر دادن سیستم در مواقع لزوم و نیز مراقبت و نگهداری از آن، با حداقل نیاز تغییرات در اجزای متعدد سیستم مقدور باشد.
Expand All @@ -16,15 +16,15 @@ PLK
این اصل بیام می‌دارد که کلاس شما بایستی یک دلیل برای تغییر داشته باشد؛ در غیر این صورت این اصل نقض شده است.
مثال : فرض کنید که یک کلاس User در سیستم مدیریت امور آموزشی دارید که وظیفه رسیدگی به اطلاعات کاربری در آن تعریف شده است؛ حال فرض کنید که در این کلاس، توابعی وجود داشته باشد که کارهایی از مدیریت دروس را انجام می‌دهد (حال آن که این توابع در خصوص مدیریت کاربران چندان معنا ندارد). با توجه به وجود توابعی که چندان به این کلاس مرتبط نیست، اصل SRP با مشکل مواجه می‌شود.
### اصل باز بسته یا Open-Close Principle (OCP)
ن اصل بیان می‌دارد که باید به گونه‌ای سیستم را طراحی کنید که در صورت نیاز به افزودن قابلیت (کلاس‌های) جدید به آن، لازم نباشد که بخش مهمی از کلاس‌های موجود را تغییر دهید. این رویکرد باعث کاهش وابستگی (Coupling)
این اصل بیان می‌دارد که باید به گونه‌ای سیستم را طراحی کنید که در صورت نیاز به افزودن قابلیت (کلاس‌های) جدید به آن، لازم نباشد که بخش مهمی از کلاس‌های موجود را تغییر دهید. این رویکرد باعث کاهش وابستگی (Coupling)
در بین کلاس‌های شما و در سطح سیستم می‌شود. برای آن که بتوانید این اصل را رعایت کنید، لازم است اصل DIP را نیز رعایت کنید.
### اصل Liskov Substitution Principle (LSP)
این اصل بیان می‌کند که که زیرکلاس های یک کلاس باید بتوانند به جای کلاس والدشان جایگزین شوند؛ این یعنی باید بتوان از قابلیت Polymorfism به درستی استفاده کرد و برای این منظور، بایستی کلاس‌های فرزند با کلاس والدشان رابطه is-a داشته باشد. جهت اطلاع بیشتر، به
[این مثال ساده](https://github.com/ssc-public/Software-Engineering-Lab/blob/main/resources/SOLID/%D8%B9%D9%86%DA%A9%D8%A8%D9%88%D8%AA%20%D9%8A%DA%A9%20%D8%A7%D8%B3%D8%A8%20%D9%86%D9%8A%D8%B3%D8%AA.pdf)
این اصل بیان می‌کند که زیرکلاس های یک کلاس باید بتوانند به جای کلاس والدشان جایگزین شوند؛ این یعنی باید بتوان از قابلیت Polymorfism به درستی استفاده کرد و برای این منظور، بایستی کلاس‌های فرزند با کلاس والدشان رابطه is-a داشته باشد. جهت اطلاع بیشتر، به
[این مثال ساده](https://github.com/ssc-public/Software-Engineering-Lab/blob/main/educational-resources/SOLID/%D8%B9%D9%86%DA%A9%D8%A8%D9%88%D8%AA%20%D9%8A%DA%A9%20%D8%A7%D8%B3%D8%A8%20%D9%86%D9%8A%D8%B3%D8%AA.pdf)
توجه کنید.
### اصل جداسازی واسط‌ها یا Interface segregation Principle (ISP)
این اصل بیان می‌دارد که به جای آن که برای گروهی از زیرکلاس‌هایتان یک واسط بزرگ بسازید، از واسط‌های کوچک تر و منسجم تر استفاده کنید تا مجبور نشوید برای برخی از زیرکلاس‌ها، برخی از توابع را با بدنه خالی پیاده سازی کنید و دچار Refused Bequest نشوید.
[دیدن این مثال می‌تواند به درک بهتر این دو اصل کمک کند](https://github.com/ssc-public/Software-Engineering-Lab/blob/main/resources/SOLID/%D8%B9%D9%86%DA%A9%D8%A8%D9%88%D8%AA%20%D9%8A%DA%A9%20%D8%A7%D8%B3%D8%A8%20%D9%86%D9%8A%D8%B3%D8%AA.pdf)
[دیدن این مثال می‌تواند به درک بهتر این دو اصل کمک کند](https://github.com/ssc-public/Software-Engineering-Lab/blob/main/educational-resources/SOLID/%D8%B9%D9%86%DA%A9%D8%A8%D9%88%D8%AA%20%D9%8A%DA%A9%20%D8%A7%D8%B3%D8%A8%20%D9%86%D9%8A%D8%B3%D8%AA.pdf)

### اصل Dependency Inversion Principle یا DIP
این اصل بیان می‌دارد که بهتر است وابستگی بین اجزای سیستم در سطح کلاس های انتزاعی و یا واسط ها باشد. در این صورت، تغییر در زیرکلاس‌ها باعث تغییر در بخش‌های دیگر سیستم نمی‌شود؛ در نتیجه بهتر است که زیرکلاس‌های Concreete را به صورت مستقیم به یک دیگر مرتبط نکنیم. با رعایت این اصل ، می‌توان به تحقق اصل OCP نیز کمک کرد.
Expand All @@ -39,6 +39,6 @@ PLK
- [توضیحاتی در مورد Cohesion](https://pages.cpsc.ucalgary.ca/~eberly/Courses/CPSC333/Lectures/Design/cohesion.html)
- یکی دیگر از ویژگی‌هایی که باید در برنامه شما برقرار باشد، همبند بودن توابع و رفتارهای داخل هر کلاس است. اصول SOLID به برقراری این وِیژگی کمک می‌کنند.
- اصول شئ‌گرایی: [بخش ۱ (بیست دقیقه پایانی)](https://ocw.sharif.edu/course/385/session/id/8776) | [بخش ۲ (کل جلسه به‌غیر از GRASP)](https://ocw.sharif.edu/course/385/session/id/8777) | [بخش ۳ (نیم‌ساعت اول)](https://ocw.sharif.edu/course/385/session/id/8778)
- [توضیح مثال اسب و عنکبوت](https://github.com/ssc-public/Software-Engineering-Lab/blob/main/resources/SOLID/%D8%B9%D9%86%DA%A9%D8%A8%D9%88%D8%AA%20%D9%8A%DA%A9%20%D8%A7%D8%B3%D8%A8%20%D9%86%D9%8A%D8%B3%D8%AA.pdf)
- [توضیح مثال اسب و عنکبوت](https://github.com/ssc-public/Software-Engineering-Lab/blob/main/educational-resources/SOLID/%D8%B9%D9%86%DA%A9%D8%A8%D9%88%D8%AA%20%D9%8A%DA%A9%20%D8%A7%D8%B3%D8%A8%20%D9%86%D9%8A%D8%B3%D8%AA.pdf)