مقدمه
وراثت، بین کلاسهای والد (Parent) و فرزند (Child) ارتباط ایجاد میکند. در این مطلب، با یک مثال ساده، نکات مختلفی را بررسی خواهیم کرد.
در ابتدا کلاسهایی را با نام parent و child، به شکل زیر ایجاد میکنیم: public class Parent
{
public Parent()
{
Console.WriteLine("Parent Constructor");
}
public void Print()
{
Console.WriteLine("Parent Print");
}
}
...
در ادامه مطلب قبلی ، یکی از مشکلاتی که طراحی Builder از آن رنج میبرد، نقض کردن قانون command query separation است که در ادامه دربارهی این اصل بیشتر بحث خواهیم کرد. اصل Command query separation یا به اختصار CQS، در کتاب Object-Oriented Software Construction توسط Bertrand Meyer معرفی شدهاست. بر اساس آن، عملیاتهای سیستم باید یا Command باشند و یا Query و نه هر دوی آنها. وقتی یک کلاینت به امضای یک متد توجه میکند، اینکه این متد چه ...
الگوی طراحی builder ، برای ساختن اشیاء بسیار مفید است؛ اما پروسه ساختن اشیاء آن بسیار پیچده هست و به صورت معمول، این پروسه شامل چندین قسمت میشود. در این مثال ما مشکلات ساختن شیء Person را مورد بررسی قرار میدهیم و این شیء از اشیایی کوچکتر مانند Name ، Surname و یا Primary Contact و غیره نیز تشکیل شده است. class Person : IPerson
{
private string Name { get; }
private string Surname { get; }
private IContact ...
دانای اطلاعات ( Information Expert ) بر طبق این اصل میتوان برای واگذاری
هر مسئولیت، کلاسی را انتخاب کرد که بیشترین اطلاعات را در مورد انجام آن در اختیار
دارد و لذا نیاز کمتری به ایجاد ارتباط با دیگر مولفهها خواهد داشت. در مثال زیر مشاهده میکنید که کلاس User، اطلاعات کاملی را از عملیات اضافه کردن آیتمی را به لیست خرید و تسویه حساب، ندارد و پیاده سازی این عملیات در این کلاس، نیاز به ایجاد وابستگیه ...
همانطور که قول داده بودم ، به اصول GRASP میپردازیم. اصول GRASP-General Responsibility Assignment
Software Principles این اصول به بررسی نحوه تقسیم
وظایف بین کلاسها و مشارکت اشیاء برای به انجام رساندن یک مسئولیت میپردازند.
اینکه هر کلاس در ساختار نرم افزار چه وظیفهای دارد و چگونه با کلاسهای دیگر
مشارکت میکند تا یک عملکرد به سیستم اضافه گردد. این اصول به چند بخش تقسیم میشوند: کنترلر ( Controlle ...
همانطور که در مطلب آشنایی با معماری Microservices گفته شد، Seneca یک فریمورک مبتنی بر Node.js برای ساخت برنامههای سمت سرور بر مبنای معماری Microservices با هسته Monolithic است. در این مطلب قصد ارائه یک مثال عملی را بر اساس این فریمورک ندارم. هدف، آشنایی با اجزای اصلی Seneca و چهارچوب کاری آن است. فواید استفاده از فریمورک Seneca فریمورک Seneca کدنویسی برای ایجاد درخواستها، ارسال پاسخ به درخواستهای رسیده و تبدیل د ...
برنامههای بزرگ سمت سرور که با تعداد بسیار زیادی کاربر و داده سر و کار دارند، نباید فقط درگیر پاسخگویی سریع و فراهم کردن وب سرویسها برای پلتفرمهای مختلف باشند. این برنامهها باید بتوانند به سادگی رشد کرده، ارتقاء پیدا کنند و به روز شوند. برای ساخت و توسعه این نوع برنامهها، دو مدل معماری وجود دارد: یکی معماری Monolithic و دیگری معماری Microservices. برای شناخت معماری Microservices، ابتدا بایستی با معماری Monolithic آشنا شد. ...
اصل هفتم: Liskove Substitution
Principle "ارث بری باید به
صورتی باشد که زیر نوع را بتوان بجای ابر نوع استفاده کرد" این اصل میگوید اگر قرار است
از ارث بری استفاده شود، نحوهی استفاده باید بدین گونه باشد که اگر یک شیء از کلاس
والد ( Base-Parent-Super type ) داشته باشیم، باید بتوان آن را
با شیء کلاس فرزند ( Sub
Type-Child ) بدون
هیچ گونه تغییری ...
اصل چهارم: Starve for loosely coupled designs "به دنبال طراحی با
اتصال سست بین اجزا باش" اتصال بین اجزای برنامه نویسی
باعث سختتر شدن مدیریت تغییرات میشود؛ چرا که با تغییر یک بخش، بخشهای متصل نیز
دچار مشکل خواهند شد. اتصالها از لحاظ نوع قدرت متفاوتند و اساسا سیستمی بدون
اتصال وجود ندارد. لذا باید به دنبال یک طراحی با کمترین میزان قدرت اتصال یا
همان سست اتصال باشیم. تا به اینجا ، اصلهای دوم و سوم ما
...
قصد دارم مجموعه ای کامل از اصول طراحی شیء گرا، الگوهای
طراحی و best practice های مربوطه را ارائه دهم. از این رو
ابتدا با اصول طراحی شروع میکنم. سپس در مقالات آتی به الگوهای مختلف خواهم
پرداخت و تا جایی که معلومات اجازه دهد مشخص خواهم کرد که هر الگو متمرکز بر رعایت
کدام یک از اصول است و اینکه آیا مناسب است از الگوی مورد نظر استفاده کنیم. این مطالب نیز چکیده ای از آموزشهای Lynda, Pluralsight , SkillFeed ...