
آموزش پیشرفته برنامه نویسی شی گرا در سی شارپ
آموزش پیشرفته برنامه نویسی شی گرا در سی شارپ یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی شی گرا کردن بیشتر کد است که با نام اصلی Making Your C# Code More Object-oriented از شرکت Pluralsight منتشر شده است.
برنامه نویسی شی گرا چیست؟
برنامه نويسي شي گرا در اوايل دهه ۱۹۷۰ توسط آلن کي Alan Kay طراحي شده يعني اولين قدمهاي اين سبک برنامه نويسي توسط آلن کي برداشته شده است. اولين زبان شي گرا توسط آلن کي طراحي شد. اسم اين زبان Small Talk است. آلن کي گفته بود که: آن چيزي که باعث شد اين فکر به ذهنم برسد نحوه عملکرد سلولهاي زيست محيطي بود. يعني اين سبک برنامه نويسي از روي سلولهاي جاندارها الگو برداري شده است.
برنامه نویسی شی گرا شیوه نوینی است که در آن می توان قطعاتی را ایجاد کرد و در برنامه های مختلف مورد استفاده قرار داد.قابلیت خوانایی برنامه هایی که در این روش نوشته می شوند بالا بوده، تست، عیب یابی و اصلاح آن ها آسان است. شی گرایی، بر اشیا تاکید دارد. در برنامه نویسی شی گرا اشیا به صورت انتزاع مطرح می شوند. توصیه می کنیم که از آموزش شی گرایی OOP در سی شارپ نیز دیدن کنید.
نکته ی قابل توجه اینکه اکثر محیط های برنامه نویسی امروزی بر اساس مفاهیم شی گرایی بنا نهاده شده اند. برای مثال کل محیط دات نت بر اساس شی گرایی بنا نهاده شده است و ما بعنوان یک برنامه نویس موفق نیاز داریم که مفاهیم شی گرایی را درک کرده و بتوانیم از آنها در نوشتن برنامه های خود استفاده کنیم. در غیر اینصورت، مانند کسی عمل می کنیم که در یک محیط بسیار پیشرفته و دقیق قرار گرفته اما بعلت نداستن ساختار و کار کردن با آن محیط، نمی تواند حد اکثر استفاده را از مزیت ها و نقاط قوت آن محیط ببرد.
چگونه طراحی شی گرا در C# را بهبود دهیم؟
برنامه نویسی شیگرا فقط به تعریف کلاسها و ساخت اشیا محدود نمیشود؛ نحوه تقسیم مسئولیتها و طراحی ارتباط میان اجزا نیز اهمیت زیادی دارد. اگر یک کلاس چندین وظیفه نامرتبط را بر عهده بگیرد یا منطق برنامه به تعداد زیادی شرط وابسته باشد، توسعه و تغییر آن دشوارتر میشود. طراحی شیگرای بهتر تلاش میکند مسئولیتها را شفاف کند و ساختاری ایجاد کند که افزودن قابلیتهای جدید، رفتارهای موجود را کمتر تحت تأثیر قرار دهد.

در C# میتوان از مفاهیم شیگرایی برای ساخت کدی استفاده کرد که توسعه و نگهداری آن آسانتر باشد. برای مثال، تعریف قراردادهای مشخص و واگذاری رفتارها به اشیای مناسب میتواند وابستگی میان بخشهای برنامه را کاهش دهد. هدف این نیست که برای هر عملیات یک کلاس جدید ساخته شود؛ بلکه باید از ساختارهایی استفاده کرد که پیچیدگی واقعی مسئله را بهخوبی نمایش دهند. درک این اصول به برنامه نویسان کمک میکند طراحی کلاسها را آگاهانهتر انجام دهند و از ساختارهای بیش از حد پیچیده دور بمانند.
چگونه شرط های پیچیده را با طراحی شی گرا جایگزین کنیم؟
در بسیاری از برنامهها، شرطهای متعدد مانند `if` و `switch` برای انتخاب رفتار مناسب بر اساس نوع یا وضعیت یک شیء استفاده میشوند. اگر این شرطها در بخشهای مختلف برنامه تکرار شوند، افزودن یک حالت جدید ممکن است نیازمند تغییر چندین قسمت باشد. یکی از راههای بهبود طراحی، انتقال رفتارهای متفاوت به اشیایی است که هرکدام مسئولیت مشخصی دارند. این کار میتواند وابستگی مستقیم کد به فهرست بلند شرطها را کاهش دهد و تغییر رفتارها را سادهتر کند.
الگوهایی مانند Strategy به برنامه نویس اجازه میدهند الگوریتمهای متفاوت را پشت یک قرارداد مشترک قرار دهد و در زمان مناسب پیاده سازی مورد نظر را انتخاب کند. در شرایط دیگر، زنجیرهای از قواعد یا اشیای نماینده حالتهای خاص میتواند جایگزین شرطهای تودرتو شود. البته حذف شرطها بهخودیخود هدف اصلی نیست؛ شرط ساده و روشن گاهی بهترین راه حل است. مهم آن است که وقتی منطق انتخاب رفتار پیچیده میشود، ساختار مناسبتری برای نگهداری و گسترش آن در نظر گرفته شود.
Immutable Object و Special Case Object چه کاربردی دارند؟
Immutable Object به شیئی گفته میشود که وضعیت آن پس از ساخته شدن تغییر نمیکند. چنین اشیایی میتوانند درک رفتار برنامه را آسانتر کنند، زیرا مقدارهای آنها در طول استفاده بهصورت ناگهانی تغییر نمیکند. این ویژگی در بخشهایی از برنامه که به دادههای ثابت یا مقادیر قابل پیشبینی نیاز دارند، مفید است. در C# میتوان با طراحی مناسب کلاسها و محدود کردن امکان تغییر وضعیت، اشیایی ایجاد کرد که رفتارشان روشنتر باشد و بررسی آنها در کد و آزمونها سادهتر انجام شود.

Special Case Object نیز میتواند برای نمایش یک وضعیت خاص و شناختهشده به کار رود؛ برای مثال، زمانی که برنامه با نبود یک مقدار اختیاری مواجه است. بهجای پراکنده کردن بررسیهای `null` در بخشهای مختلف، میتوان در برخی طراحیها رفتار مشخصی برای آن وضعیت تعریف کرد. این رویکرد در صورت استفاده درست، تعداد شرطهای تکراری را کاهش میدهد و منطق فراخوانی متدها را سادهتر میکند. انتخاب آن باید با توجه به معنای واقعی داده و رفتار مورد انتظار برنامه انجام شود.
این آموزش پیشرفته برنامه نویسی شی گرا برای چه کسانی مناسب است؟
این دوره برای برنامه نویسانی مناسب است که با C# و اصول پایه شیگرایی آشنا هستند و میخواهند طراحی کدهای خود را در سطح بالاتری بهبود دهند. اگر در پروژههای خود با شرطهای متعدد، الگوریتمهای دشوار برای گسترش یا کلاسهایی مواجه شدهاید که تغییر آنها روی بخشهای مختلف برنامه اثر میگذارد، موضوعات این آموزش میتوانند برایتان کاربردی باشند. سطح پیشرفته دوره برای مخاطبانی مناسب است که تجربه برنامه نویسی دارند و میخواهند درباره ساختار و کیفیت طراحی تصمیمهای دقیقتری بگیرند.
یادگیری این مفاهیم برای توسعه دهندگانی مفید است که مسئول نگهداری کدهای موجود هستند یا روی برنامههایی کار میکنند که مرتباً قابلیتهای جدید دریافت میکنند. استفاده از اشیای Strategy، طراحی اشیای تغییرناپذیر و بازنگری در منطق شرطی میتواند راههای متفاوتی برای کاهش پیچیدگی فراهم کند. این آموزش به شما کمک میکند هنگام بازطراحی کد، میان سادگی، انعطاف پذیری و نیاز واقعی پروژه تعادل برقرار کنید و ساختاری متناسب با مسئله انتخاب کنید.
سرفصل مطالب آموزش ویدئویی شی گرایی پیشرفته در سی شارپ
فصل اول: مقدمه دوره آموزشی- مقدمه
- چه چیزی کد را شی گرا می کند؟
- چه چیزی در این دوره ی آموزشی وجود دارد؟
- یک مثال که فاقد Object است
- قرار دادن Object ها در مکانی که غیرممکن به نظر می آید
- جمع بندی
- معرفی کردن مشکل موجود در کد
- کشف کردن مشکل
- تبدیل کردن Branch به یک Function
- تبدیل کردن یک Function به یک State
- منتقل کردن تمامی کدهای مربوط به State به درون State ها
- بررسی بهبودهای انجام شده
- جمع بندی
- درک کردن مشکل
- بررسی کردن راه حل مورد نظر
- Aggregate کردن Solution
- بهبود دادن Readability
- بهبود دادن Performance مربوط به Infrastructural Operation ها
- جمع بندی
- مشحص کردن مشکل مربوط به انتخاب کردن یک Object
- مشحص کردن مشکل مربوط به ترکیب کردن یک Object
- فهمیدن مشکل
- رفتار کردن با Collection ای از Object ها به عنوان یک Object
- پیاده سازی Collection ای از Object ها
- بررسی Compositional Function Idea
- بررسی Generalized Composition Function
- جمع بندی
- مشخص کردن مشکل مربوط به بک الگوریتم متغیر
- تفکیک کردن الگوریتم
- مشخص کردن Moving Part های یک الگوریتم
- تجزیه و تحلیل کردن Template Method با Strategy Object
- خارج کردن Strategy به یک کلاس جداگانه
- پیاده سازی یک کلاس Strategy
- جمع بندی
- ایجاد یک Bug از یک Mutable Object ریشه گرفته است
- کشف کردن Aliasing Bug
- رفع کردن Aliasing Bug
- فهمیدن Value Object ها
- پیاده سازی Reference Type به عنوان یک Value Type
- مصرف کردن Immutable Class
- تبدیل کردن Immutable Object ها به Value Object ها
- پشتیبانی کردن از Hash Table ها
- کامل کردن Equality Test ها
- مقایسه ی Mutable بودن، Immutable بودن و Value Object ها
- جمع بندی
- فهمیدن مشکل Null ها
- معرفی کردن یک Design بدون Null Reference
- چگونه هیچگاه Null را Return نکنیم
- نشان دادن قدرت Null Object ها
- معرفی Special Case ها
- تبدیل کردن Boolean Query Method ها به Operation های واقعی
- جایگزین کردن Object ها در زمان Run Time
- جمع بندی
- پیچیده کردن نیازمندی هایی که منجر به استفاده از Null می شوند
- مشخص کردن مشکل مربوط به Object هایی که وجود ندارند
- نشان دادن Object های اختیاری به عنوان یک Collection
- Wrap کردن یک Collection در یک Option Type
- بهبود Readability مربوط به Client Code
- اضافه کردن Pattern Matching به Option ها
- پیاده سازی سنگین وزن Option ها با Pattern Matching
- نشان دادن عملی استفاده از Option Type سنگین وزن
- جمع بندی
- اضافه کردن نیازمندی هایی که منجر به Multiway Branching می شوند
- استفاده از روش سنتی Switch و یک Enum
- Encapsulate کردن Representation در یک کلاس جداگانه
- استفاده کردن از Encapsulated Representation به عنوان یک Key
- تبدیل کردن Multiway Branching به یک Dictionary
- جایگزین کردن Multiway Branching Object در زمان Run Time
- جمع بندی
- پیاده سازی زنجیر سنتی جملات If-Then-Else
- پیشنهاد یک طراحی شی گرا
- پیاده سازی Concrete Rule ها
- ساده سازی پیاده سازی از طریق ریفکتورینگ
- ترکیب کردن Primitive Rule ها به Complex Rule ها
- نشان دادن عملی انعطاف پذیری مربوط به Chain of Rule ها
- جمع بندی
- معرفی یک مثال
- تجزیه و تحلیل پیاده سازی اولیه
- کشف کردن Infrastructural Code
- Explicit کردن Infrastrucutre
- حذف کردن تمامی Infrastructure از پیاده سازی
- جهت حرکت با Infrastructural Code
- سود بردن از انعطاف پذیری کد شی گرا
- جمع بندی
- جمع بندی بسته ی آموزشی







