بررسی اصول SOLID در برنامه نویسی شی گرا

اصل Single Responsibility Principleاولین اصل در اصول پنجگانه SOLID اصل Single Responsibility Principle است، که به صورت کوتاه به آن SRP نیز می‌گویند. براساس اصل SRP برای هر کلاس نباید بیش از یک دلیل برای تغییر کردن وجود داشته باشد. این جمله به این معنی است، که شما باید در برنامه نویسی و طراحی شی‌گرا کلاس‌هایتان را طوری طراحی کنید، که هر کدام فقط یک وظیفه را داشته باشند. دقت کنید که در زبان انگلیسی کلمه Responsibility به معنی وظیفه و کلمه Single به معنی تک می‌باشد. این موضوع به این معنی نیست که هر کلاس فقط می‌تواند یک متد داشته باشد، بلکه به این معناست که تمامی Member های یک کلاس که مجموعه‌ ای از Property ها، Method ها و Event های یک کلاس می‌ باشند، باید به هدف اصلی آن کلاس مرتبط باشند. اگر کلاسی را مشاهده کردید که چندین وظیفه مختلف را انجام می‌دهد، باید با استفاده از تکنیک‌های Refactoring برای مثال Extract Class آن کلاس را به کلاس‌های کوچکتر تبدیل کنید.زمانی که یک کلاس بیش از چندین وظیفه را داشته باشد، احتمال اینکه نیاز به تغییر داشته باشد، افزایش پیدا می‌کند. هرگاه که یک کلاس تغییر کند، خطر به وجود آمد باگ‌ها افزایش پیدا می‌کند. اگر بروی اصل SRP تمرکز کنید، این خطر به مراتب کاهش پیدا خواهد کرد.اصل Open Close Principleدومین اصل در اصول پنجگانه SOLID اصل Open Close Principle است، که به صورت کوتاه به آن OCP نیز می‌گویند. بر اساس این اصل Entity های درون یک نرم‌افزار که شامل کلاس‌ها، ماژول‌ها، توابع و ... می‌باشند، باید برای گسترش باز و برای تغییر بسته باشند. قسمت بسته بودن یا اصطلاحاً Closed بودن این قانون، به این معنی است که زمانی که یک ماژول توسعه پیدا کرد و تست شد، کدی که در درون آن است، فقط باید به منظور تصحیح باگ‌ها تغییر کند. و اما قسمت باز یا Open بودن این قانون به این معناست که شما باید بتوانید به کدی که از قبل موجود است، به منظور اضافه کردن Functionality های جدید کدهایی را اضافه کنید، پس براساس اصل OCP به منظور پیاده‌سازی Functionality های جدید نباید کدهایی که از قبل موجود است را تغییر بدهیم، بلکه باید کدهای جدید بنویسیم. شبیه به اصل SRP، اصل OCP نیز امکان کاهش دادن خطرات به وجود آمدن باگ‌ها و خطاها را در کدی که از قبل موجود است، به مراتب کاهش می‌دهد.اصل Liskov Substitution Principleسومین اصل در اصول پنجگانه SOLID اصل Liskov Substitution Principle است، که به صورت کوتاه به آن LSP نیز می‌گویند. بر اساس این اصل Function هایی که با استفاده از Pointer ها به تعدادی Base Class نیاز دارند، باید بتوانند در جایگاه استفاده از یک Base Class از Sub Class های مربوط به آن Base Class بدون نیاز به دانستن این موضوع استفاده کنند. به بیان ساده‌تر این به این معنی است که اگر کد شما برای انجام دادن وظیفه‌ای که دارد، نیاز به یک شی از یک Base Class داشته باشد، باید بتواند در جایگاه آن Base Class از یک Sub Class نیز استفاده کند. منظور از Base Class و Sub Class، کلاس‌هایی هستند که باهم رابطه وراثت یا Inheritance دارند. همانطور که می‌دانید وراثت یکی از اصول بسیار مهم در برنامه‌ نویسی و طراحی شی‌گرا می‌باشد. بگذارید در مورد اصل LSP کمی بیشتر صحبت کنیم. براساس اصل LSP اگر شما یک کلاس را ایجاد کنید، که به یک کلاس دیگر Dependency یا وابستگی داشته باشد، باید بتوانید در جایگاه آن وابستگی یک شی از Sub Class هایی که از کلاس اصلی ارث بری کردند را به کلاسی که به کلاس مورد نظر وابستگی دارد تحویل بدهید. و در این راستا کلاس اول باید بتواند، بدون هیچ مشکلی کار خود را با آن Sub Class داده شده انجام بدهد. به عبارت دیگر اگر کلاس اول که به کلاس دوم Dependency دارد، نیاز دارد که تایپ مربوط به Dependency خود را چک کند و بر اساس آن رفتارهای متفاوت از خود نشان بدهد، این موضوع اصل LSP را نقض کرده است و باعث ایجاد خطا و مشکلات عدیده‌ای در برنامه خواهد شد.اصل Interface Segregation Principleچهارمین اصل در اصول پنجگانه SOLID اصل Interface Segregation Principle است، که به صورت کوتاه به آن ISP نیز می‌گویند. براساس این اصل، Client ها یا کاربران یک کلاس نباید به Interface هایی که از آن‌ها استفاده نمی‌کنند، وابسته باشند. دقت کنید که در اینجا منظور از کلمه ی اینترفیس لزوماً ماهیت اینترفیس ها در زبان های برنامه نویسی از قبیل زبان سی شارپ نیست. این قانون به این معناست که زمانی که یک کلاس به یک کلاس دیگر وابسته است، تعداد Member های مربوط به Public Interface آن کلاس باید حداقل باشند. در صورت عدم پیاده‌سازی اصل ISP نیز مشکلات عدیده‌ای به وجود خواهد آمد. بگذارید در رابطه با این اصل بیشتر صحبت کنیم. اغلب دیده‌اید که در یک طراحی شی‌گرا تعدادی از کلاس‌ها به همدیگر وابسته‌ اند و از Property و Method های یکدیگر استفاده می‌کنند. اما این موضوع در حداقل تعداد وجود دارد. به عبارت دیگر یک کلاس از تعداد اندکی از Property ها و Method های یک کلاس دیگر استفاده می‌کند. همینطور که این تعداد افزایش پیدا می‌کند، درهم تنیدگی و یا اصطلاحا Tight Coupling بین آن دو کلاس افزایش پیدا می‌کند. با تبعیت کردن از اصل ISP، کلاس‌های بزرگ با پیاده‌سازی Interface های کوچک Functionality های مرتبط به هم را در درون این Interface های کوچک، گروه بندی میکند. با این روش کلاس‌ هایی که به این Interface ها وابستگی دارند به صورت Loosely Coupled عمل کرده و همچنین قابلیت انعطاف پذیری و استفاده مجدد آن‌ها افزایش پیدا می‌کند.اصل Dependency Inversion Principleپنجمین اصل در اصول پنجگانه SOLID اصل Dependency Inversion Principle است، که به صورت کوتاه به آن DIP نیز می‌گویند. اصل DIP از دو جمله تشکیل شده است، جمله اول می‌گوید که ماژول‌های سطح بالا نباید به ماژول‌های سطح پائین وابسته باشند، بلکه هر دو آن‌ها باید به Abstraction ها وابسته باشند. جمله دوم می‌گوید که Abstraction ها نباید به Detail ها وابسته باشند، بلکه Detail ها باید به Abstraction ها وابسته باشند. براساس اصل DIP زمانی که بین کلاس‌ها وابستگی یا Dependency وجود دارد، این Dependency ها نباید به صورت مستقیم بین کلاس‌ ها اتفاق بیفتد بلکه باید با استفاده از Abstraction هایی (برای مثال Interface های سی شارپ) پیاده‌سازی شود. این موضوع باعث می‌شود که Fragile بودن کد یا سطح Fragile بودن کد که در ابتدای این آموزش از آن صحبت کردیم، کاهش پیدا کند. دقت کنید که اصل DIP به صورت بسیار دقیقی با مفهوم Dependency Injection یا تزریق وابستگی در طراحی شی‌گرا گره خوده است.این قسمت از این آموزش را به اتمام میرسانیم و در قسمت‌های بعدی قصد داریم، اصول پنجگانه SOLID را به صورت بسیار شفاف و کوتاه با استفاده از زبان برنامه نویسی سی شراپ پیاده‌سازی کرده تا درک هرچه عمیق‌تر و بهتری از آن‌ها به دست بیاورید.منبع: وبسایت پرووید