با در نظر گرفتن و توجه به این اصول، می توانید به سادگی، هزینه را کاهش داده و قدرت نگهداری و یا همان maintenance نرم افزار را افزایش بدهید. قابلیت های دیگر از قبیل؛ قابلیت گسترش پذیری و یا همان extendibility و قابلیت استفاده کردن و یا usability، با استفاده از این اصول، افزایش پیدا خواهند کرد.
بر اساس این اصل بسیار مهم، اجزای تشکیل دهنده و یا component های یک سیستم نرم افزاری، می بایست به قسمت های کوچک تر تقسیم شده و هیچ کدام از آنها با یکدیگر همپوشانی نداشته باشند. این موضوع باعث افزایش cohesion و کاهش coupling میشود. برای به دست آوردن separation of concerns، روش های مختلفی وجود دارند. یکی از این روش ها، استفاده کردن مناسب از interface ها می باشد. با استفاده از اصل separation of concerns، وابستگی درونی اجزای تشکیل دهنده و یا component های یک سیستم به حداقل رسیده و این موضوع باعث افزایش قابلیت نگهداری و یا همان maintenance نرم افزار خواهد شد.
بر اساس اصل single responsibility principle، هر ماژول و یا کلاس و یا حتی متد از یک سیستم نرمافزاری، می بایست فقط و فقط یک وظیفه خاص را داشته باشد و آن وظیفه را به خوبی انجام بدهد. این موضوع باعث میشود که درک سیستم نرمافزاری برای برنامه نویسان به مراتب ساده تر گردد. علاوه بر این؛ با استفاده از این اصل، به راحتی، integration و یا یکپارچه سازی یک نرم افزار با دیگر اجزای تشکیل دهنده آن، به خوبی انجام میگردد.
بر اساس اصل principle of least knowledge، هر component و یا object خاصی می بایست حداقل دانش را در رابطه با جزئیات درونی دیگر component ها داشته باشد. این اصل نیز هدف خود را بر کاهش وابستگی درونی اجزاهای تشکیل دهنده نرم افزار گذارده است و به این ترتیب قابلیت نگهداری برنامه را افزایش میدهد.
یک موضوع بسیار مهم در طراحی نرم افزارهای موفق این است که در ابتدای کار نباید طراحی های بزرگ را انجام داد. چراکه نیازمندیها در این زمان کاملاً مشخص نشده و امکان تغییر یافتن آنها زیاد است. به هر حال؛ اگر احتمال تغییر یافتن نیازمندی ها زیاد می باشد، بهتر است که در ابتدای کار، سرمایهگذاری زیادی بر روی طراحی کلی سیستم قرار نگیرد.
یک موضوع بسیار مهم دیگر، در طراحی نرم افزارهای موفق، عدم تکرار یک functionality و یا ویژگی در برنامه است. به عبارت دیگر؛ هیچگاه نباید یک تکه کد و یا یک class دارای کدهای تکراری باشد. احتمالاً میدانید که تکرار کدها و یا اصطلاحاً code duplication، جزء مهمترین code smell ها و یا بوی بدِ کُد به حساب میآید. علاوه بر این؛ شفافیت برنامه کاهش یافته و احتمال به وجود آمدن ناسازگاری و یا اصطلاحاً inconsistency افزایش مییابد.
یکی از اصول شی گرایی، وراثت و یا inheritance است. متاسفانه وراثت، باعث ایجاد dependency و یا وابستگی بین کلاس های فرزند و پدر می شود و به همین ترتیب، استفاده کردن از کلاسهای فرزند را دچار اختلال می کند. این در حالی است که تکنیک composition و یا ترکیب میتواند سطح بسیار مناسبی از آزادی در استفاده از کلاس های موجود در سلسله مراتب وراثت را به ما بدهد. برای پیاده سازی composition و یا ترکیب، از interface ها استفاده می کنیم.
موضوع دیگر این است که می بایست اجزای تشکیل دهنده و یا component های مربوط به یک قسمت از برنامه را بر اساس نیازمندی ها تشخیص بدهید. پس از انجام این کار؛ این component های مرتبط با یکدیگر باید در یک لایه منطقی گروه بندی شوند. این موضوع باعث میشود تا درک ساختار کلی یک نرم افزار در سطوح بالاتر راحت تر اتفاق بیافتد. البته دقت کنید که نمیبایست component هایی که نوع آنها متفاوت است و یا در رابطه با functionality های متفاوت پیاده سازی شده اند را در یک لایه یکسان قرار داد.
اگر component ها به لایه های مختلف تقسیم گردند، می بایست بتوانند با یکدیگر ارتباط برقرار کنند. به منظور پیاده سازی قابلیت ارتباط با یکدیگر، component ها و لایه ها می بایست پروتکل های خاصی را داشته باشند. این موضوع نیز، یکی دیگر از اصول مهم طراحی موفق نرم افزار ها می باشد.
همانطور که تا به اینجای کار گفتیم، لایه های مختلف و component های بین آنها می بایست بتوانند با یکدیگر ارتباط برقرار کنند. به منظور ارسال داده ها بین لایه های مختلف، یک قالب داده ای و یا date format نیاز خواهد بود. لطفاً دقت کنید که نمی بایست date format ها را طوری با هم ترکیب کنید که برنامه دچار اختلال گردد. پیاده سازی date format ها باید به گونهای باشد که استفاده کردن از آنها به سادگی انجام پذیر باشد و علاوه بر این؛ قابلیت گسترش و نگهداری بالایی داشته باشند. میبایست برای یک لایه، یک data format یکسان لحاظ بگردد تا component های مختلف بتوانند داده های مورد نظر خود را رمزگشایی و یا رمزنگاری کنند و به این ترتیب، سربار پردازش کار با data format ها را کاهش دهند.
یک موضوع مهم دیگر در طراحی نرم افزارهای موفق این است که کدهای مربوط به مسائلی از قبیل؛ امنیت و ارتباط و حتی لاگ کردن و پروفایل کردن و پیکر بندی داده ها، می بایست به صورت abstract در component های جداگانه تعریف بگردند. این گونه از کدها که اصطلاحاً تحت عنوان cross-cutting concern نیز شناخته می شوند، نمی بایست که با business logic برنامه ترکیب بگردند. این کار باعث می شود که قابلیت گسترش طراحی و نگهداری آن، افزایش پیدا کند.
تعریف کردن exception های مربوط به یک domain از قبل از طراحی، کمک میکند که component ها بتوانند خطاها و شرایط نامطلوب را به شکل مناسبی مدیریت کنند. سیستم مدیریت استثنا، می بایست در سرتاسر نرم افزار به یک شکل پیاده سازی گردد.
یک موضوع بسیار مهم دیگر در طراحی نرم افزارهای موفق، استفاده از رسم و رسومات نامگذاری عناصر مختلف نرم افزار می باشد. رسم و رسومات نامگذاری که تحت عنوان naming convention از آنها یاد می شود، برای یک زبان و یا یک نرم افزار می بایست از پیش تعریف شوند. این روش باعث می شود که یک مدل سازگار و یک شکل در اختیار برنامه نویسان قرار بگیرد، تا بتوانند نرمافزار را هر چه راحت تر درک کنند. این موضوع علاوه بر این میتواند به برنامه نویسان کمک کنند تا کدهای دیگر برنامه نویسان را ارزیابی کنند و از این طریق قابلیت نگهداری و یا maintainability سیستم افزایش می یابد.
منبع: وبسایت پرووید