خانه مهندسی نرم افزار مفاهیم برنامهنویسی شیگرا مهندسی نرم افزار شی گرایی نوشته شده توسط: سید سروش سید صدر تاریخ انتشار: ۱۶ اردیبهشت ۱۳۹۷ آخرین بروزرسانی: ۱۹ بهمن ۱۴۰۰ زمان مطالعه: 10 دقیقه ۵ (۱) مفاهیم برنامهنویسی شیگرا امروزه تقریبا تمام افرادی که در حوزه IT مشغول به کار هستند و یا رشته تحصیلی آنها مرتبط با IT و مهندسی نرمافزار است مطمئنا با عباراتی از قبیل شیگرایی / برنامهنویسی شیگرا / تجزیه و تحلیل شیگرا و … آشنایی دارند. دلیل آن هم مشخص است و آن گستردگی استفاده از مباحث شیگرا در دنیای نرمافزار است. اصولا نرمافزارها از خیلی سال پیش نوشته شدهاند تا بتوانند مسئلهای را در دنیای واقعی حل و کار را برای ما راحتتر کنند. میتوان گفت در اکثر مواقع ورودی یک نرمافزار اطلاعاتی است که از سمت دنیای واقعی فراهم میشود. حال اگر ما بتوانیم در حین تولید نرمافزار خود، این اطلاعات را به همین شکل مدل کنیم کمک بسیاری در روند تولید، توسعه و به نتیجه رسیدن آن میکند. بنابرین به زبان ساده میتوان شیگرایی را، روشی برای مدل کردن دنیای واقعی بیان کرد. شاید یکی از ملموسترین مثالهای آن بودن مفهومی به اسم ارثبری است که در خیلی جاها مشاهده میکنیم و اتفاق خواهد افتاد.حتما بخاطر دارید مباحثی که در درس علوم داشتیم و جانواران را به دستهها و گونههای مختلفی تقسیمبندی میکردند. جانوران یا بیمهره هستند یا مهره دار! مهره دارها خود شامل ماهیها، پرندگان، دوزیستان، خزندگان و … بودند! و این سلسله مراتب تا چند مرحله ریزتر و دقیقتر میشد! انواع پرندگان و ماهیها و…. حال فرض کنید قرار است همین اطلاعات و دستهبندیها رو در قالب یک نرمافزار داشته باشیم ! البته همان طور که میدانید روشهای بسیاری برای حل یک مسئله وجود دارد! اما قصد ما فقط حل مسئله نیست بلکه حل آن به بهینهترین روش ممکن از هر لحاظ میباشد. به همین جهت مفاهیم شیگرایی به عنوان یک روش طراحی برای نرمافزارهایی که بصورت منعطف هستند بوجود آمد. به این معنی که در برابر تغییر مقاومت نمیکنند و هر لحظه ممکن است امکاناتی به آنها افزوده، حذف و یا به هرطریقی تغییر خواهند کرد. در روش شیگرایی بصورت کلی میتوان گفت که مسئله ما به بخشهای کوچکتری شکسته خواهد شد که ما به آنها موجودیت یا Entity میگوییم. موجودیتها خود شامل خصوصیتها و رفتارهایی هستند که باعث میشود آن موجودیت شکل بگیرد. روش طراحی شیگرا شامل ۴ رکن اصلی میباشد که بهتر است درک خوبی از آنها داشته باشیم تا بتوانیم از هر کدام به درستی در جایگاه خودش استفاده کنیم و از مزایای آن بهره ببریم. 1- Abstraction 2- Encapsulation 3- Inheritance 4- Polymorphism Abstraction در این اصل نکته اصلی نمایش جزییات و امکانات مرتبط و مورد نیاز به کاربر و پنهان کردن مواردی است که کاربر نیازی به مشاهده و اطلاع از وجود آنها ندارد. مثالهای بسیاری دراطراف ما وجود دارد که با این تعریف و اصل هماهنگ میباشد. همه شما با ریموت کنترل تلویزیون کار کردهاید و حتی شاید جای تمام دکمههای آن راهم حفظ باشید و به قول معروف چشم بسته با آن کار میکنید! صدا رو کم و زیاد میکنید، کانال را تغییر میدهد و تمام مواردی که برای شما درنظر گرفته شده و در دسترس شما هست را انجام میدهید. اما آیا میدانید و یا نیازی هست بدانید در پشت صحنه با فشردن هر کدام از این دکمهها واقعا چه روندی انجام میشود و چه اتفاقاتی خواهد افتاد تا عملکرد آن دکمه انجام و شما نتیجه آن را ببینید؟زمانی که در حین رانندگی ترمز میکنید چطور؟ آیا نیازی هست بدانید چطور سرعت ماشین کاسته میشود؟ اگر هم بدانید آیا نیازی هست درگیر آن اتفاقات بشوید؟ زمانی که دکمه پاور کامپیوتر، لپتاپ ، موبایل و … نیازی هست درگیر اتفاقات پشت صحنه آن بشوید؟! به طور قطع جواب این سوالها و خیلی از سوالهایی که از این دسته هستند خیر میباشد. در نتیجه ما هم به عنوان طراح و یا برنامهنویس باید این اصل مهم را رعایت و به کار ببریم. Encapsulation اصل کپسولهسازی بسیار نزدیک به اصل تجرید یا انتزاع میباشد. در این اصل میگوییم که موارد مرتبط به هم باید در یک ساختار قرار بگیرند. این ساختار را در مفاهیم شیگرایی کلاس مینامیم . یک کلاس شامل خصوصیات، رفتارها و توابع مرتبط با هم میباشد که در قالب یک واحد گرد هم آمدهاند. در این اصل با استفاده از دادن حق دسترسی به اجزای مختلف کلاس امکان پنهان کردن جزییات درون آن را با دنیای بیرون خواهیم داشت. چرا که مواردی وجود دارد که نیازی نیست از خارج از کلاس، کسی از وجود آنها خبر داشته باشد. دقیقا مثل یک قرص کپسول، که داخل آن قابل مشاهده نمیباشد. همانطور که میبینید این دو اصل خیلی به هم نزدیک هستند به زبان دیگر اصل Abstraction میگوید چه جزییاتی باید قابل مشاهده باشند و اصل Encapsulation میزان حق دسترسی آن جزییات را مشخص میکند. درواقع میتوان گفت پیادهسازی سطح انتزاع مورد نظر با کپسولهسازی انجام میشود. اصطلاح دیگری که ممکن است در مباحث مرتبط با این دو اصل با آن برخورد کنید Black Box میباشد. که مطمئنا دلیل آن را با توجه به موارد مطرح شده درک خواهید کرد. Inheritance برای اصل ارثبری در ابتدای مقاله مثالی زده شد اما اگر بخواهیم دقیقتر به آن نگاه کنیم این اصل این امکان را به ما میدهد بجای آن که اطلاعات تکراری را در چندین جا کپی کنیم، که سختیهای خودش را دارد مخصوصا زمانی که قرار به تغییر بخشی از این اطلاعات باشد، میتوانیم تمام اطلاعات مشترک بین موجودیتهای مختلفی که از یک گروه هستند را جدا کرده و در یک کلاس واحد قرار دهیم. مثل اطلاعات مشترک بین تمام کارمندها، تمام ماشینها و غیره. سپس به ازای هر نوع خاص از آن موجودیت یک کلاس دیگری تعریف کنیم و از کلاس اول اطلاعات مشترک و البته قابل مشاهده رو ارث ببریم. به عنوان نمونه کارمند رسمی، کارمند قراردادی و یا ماشین مسابقهای، ماشین سنگین و مواردی از این قبیل. به این شکل تمام این کلاسها اطلاعات مشترک را خواهند داشت بدون آنکه نیازی به کپی کردن آنها داشته باشیم. اگر نیازی به تغییر هم باشد فقط در کلاس والد این کار انجام میشود. حال نوبت میرسد به اضافه کردن خصوصیات و رفتارهای مخصوص به هر فرزند که دیگر مشترک نمیباشد. در واقع همین اطلاعات مخصوص به هر گروه باعث شد تا ما از اصل ارثبری استفاده کنیم. ماشینهای مسابقهای خصوصیات و رفتارهای خود را دارند و ماشینهای سنگین نیز همچنین.در آخر اگر بخواهیم تعریف آکادمیکتری از ارثبری داشته باشیم به تعریف زیر خواهیم رسید: مفهوم ارثبری عبارت است از مشتق کردن یک کلاس جدید از کلاس موجود و ارثبردن تمام ویژگیهای قابل دسترس آن و افزودن ویژگیهای جدید به کلاس مشتق شده. همانطور که در تصویر نیز مشخص است رابطه ارثبری به رابطه is-a معروف است. به این معنی که گفته میشود کلاس فرزند هست از نوع کلاس پدر. به عنوان مثال ماشین مسابقهای از نوع ماشین میباشد. نکته دیگری که در پیادهسازی اصل ارثبری در زبان سیشارپ وجود دارد این است که هر کلاس فقط میتواند فرزند یک کلاس دیگر باشد. که در اصطلاح گفته میشود سیشارپ فقط از Single Inheritance پشتیبانی میکند. Polymorphism اصل چندریختی نیز یکی دیگر از اصول کاربردی و مهم شیگرایی میباشد. به این معنی است که یک موجودیت دارای چندین شکل یا رفتار باشد. همانطور که ما در برابر والدین یک نوع رفتار و در برابر دوست و همکار نوع دیگری رفتار خواهیم کرد.یکی از ملموسترین و معروفترین مثالهایی که دراین مورد میتوان داشت زمانی است که مسئله شما محاسبه محیط و مساحت شکلهای هندسی متفاوت میباشد. یکی از معروفترین روشها داشتن یک کلاس والد میباشد به نام Shape که دارای متدهای محاسبه محیط و مساحت میباشد. حال برای هر شکل هندسی مثل مربع و مستطیل و دایره کلاس جداگانهای تعریف کرده و متدهای والد را با توجه به فرمول هر شکل پیادهسازی میکنیم. در نتیجه ما متدهایی داریم که رفتارهای گوناگونی دارند بر اساس اینکه کدام یک از فرزندان آنها را فراخوانی میکنند. مثال دیگر میتواند متد محاسبه حقوق کارمندان باشد که در بالا اشاره کردیم. این متد برای کارمندان رسمی فرمول خاص خود و برای کارمندان قراردادی نیز فرمول دیگری خواهد داشت.همانطور که میدانید مباحث شیگرایی به همین ۴ اصل خلاصه نمیشود و توصیه میشود که تا آنجا که مقدور است به تمام مباحث شیگرایی تسلط پیدا کرده. همچنین زبان سیشارپ که زبان اصلی برنامهنویسی اینجانب میباشد بصورت کامل، از مفاهیم شیگرایی پشتیبانی میکند. در این مقاله سعی شد بتوانم با زبانی ساده ۴ رکن اصلی شیگرایی را مطرح کنم تا بتوانید درک بهتری از مفاهیم برنامهنویسی شیگرا داشته باشید و در پروژههای خود استفاده کنید و یا در مصاحبههای کاری موفقتر باشید. برای آشنایی بیشتر با مفاهیم و اصول برنامهنویس شیگرا در زبان سیشارپ میتوانید سرفصلهای مربوط به این دوره را در سایت نیکآموز مطالعه کرده و یا نسبت به ثبتنام اقدام کنید. چه رتبه ای میدهید؟ میانگین ۵ / ۵. از مجموع ۱ اولین نفر باش معرفی نویسنده مقالات 1 مقاله توسط این نویسنده محصولات 5 دوره توسط این نویسنده سیدسروش سیدصدر سروش سیدصدر بیش از ۱۰ سال است که بصورت حرفهای با سی شارپ و SQL Server کار میکند. از دیگر تخصص های او می توان به مدرس دوره های سیشارپ در نیک آموز، برنامه نویس Desktop Application با Oracle و #C در سازمان فن آوری اطلاعات و ارتباطات شهرداری تهران، برنامه نویس وب ASP.Net و SQL Server در شرکت ایران هاست، برنامه نویس Desktop Application و #C و SQL Server در شرکت فناوری اطلاعات پارمیس، برنامه نویس وب ASP.Net و SQL Server در شرکت طیف نرم افزاران پارسیان؛ مسلط به تحلیل و طراحی سیستمهای مالی و اداری، مسلط به مباحث برنامه نویسی ASP.NET MVC، مسلط به مباحث SQL Server، مدرس مباحث سی شارپ و SQL Server معرفی محصول علیرضا ارومند دوره Full Stack .NET Developer 3.900.000 تومان مقالات مرتبط ۰۷ فروردین مهندسی نرم افزار تفاوت DDD، میکروسرویس (Microservice)، الگوهای طراحی (Design pattern) و معماری تمیز (Clean Architecture) تیم فنی نیک آموز ۰۳ اسفند مهندسی نرم افزار آشنایی با تفاوت Domain Events و Integration Events تیم فنی نیک آموز ۲۶ بهمن مهندسی نرم افزار ۵ راز ساخت سیستم قدرتمند با پیاده سازی معماری میکروسرویس : چالش ها و راه حل ها تیم فنی نیک آموز ۰۵ دی مهندسی نرم افزار راهنمای مسیر شغلی معمار ارشد نرم افزار تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ ندا صادقی ۰۳ / ۰۷ / ۹۹ - ۱۱:۱۱ خیلی عالی بود، ممنون از شما استاد پاسخ به دیدگاه مسعود طاهری ۲۳ / ۰۲ / ۹۷ - ۰۹:۰۴ سروش جان ممنون از مقاله خوبی که در سایت قرار دادی پاسخ به دیدگاه سروش صدر ۲۴ / ۰۲ / ۹۷ - ۰۵:۲۱ خواهش میکنم اختیار دارید 🙂 پاسخ به دیدگاه