چه تکنولوژی می‌خواهید یاد بگیرید؟

نظرات و انتقادات خود را با ما در میان بگذارید

آپدیت روزانه

بیش از 1500 مطلب آموزشی

نیازهای روز

سازنده زنجیروار در سی‌شارپ

سازنده زنجیروار یا Constructor Chaining رویکردی است که یک سازنده در کلاس قادر خواهد بود سازنده دیگر در همان کلاس یا در کلاس پایه را اجرا نماید. قابلیت عالی است که می‌توان چندین سازنده دلخواه در یک کلاس تعریف نمود. به منظور درک بهتر سازنده زنجیروار به مثال واقعی خواهیم پرداخت. مفروض است در حال توسعه کلاس Mail که در آن سه سازنده به منظور دریافت نام کاربری، رمز عبور، پورت و وضعیت فعال بودن SSL را شامل خواهد شد، در صورت که سازنده زنجیروار بکار گرفته نشود کد شما به صورت زیر ایجاد خواهد شد:

namespace ConstructorChaining
{
    public class Mail
    {
        public string Username { get; set; }
        public string Password { get; set; }
        public int Port { get; set; }
        public bool EnableSsl { get; set; }

        public Mail(string username, string password)
        {
            this.Username = username;
            this.Password = password;
        }

        public Mail(string username, string password, int port)
        {
            // تکراری
            this.Username = username;
            this.Password = password;

            this.Port = port;
        }

        public Mail(string username, string password, int port, bool enableSsl)
        {
            // تکراری
            this.Username = username;
            this.Password = password;
            this.Port = port;

            this.EnableSsl = enableSsl;
        }
    }
}

با اینکه رویکرد فوق مسئله را حل می‌نماید اما کدهای تکراری شامل می‌شود که در بدنه سازنده‌ها قابل رویت است و در صورت استفاده از سازنده زنجیروار می‌توان از تکرار چنین کدهای جلوگیری نمود. برای استفاده از سازنده زنجیروار در کلاس‌ها الزامی است سازنده‌ها بعد از بسته شدن ( به صورت this : نگاشته شود. در صورت استفاده از Constructor Chaining کد فوق به صورت زیر تغییر خواهد کرد:

namespace ConstructorChaining
{
    public class Mail
    {
        public string Username { get; set; }
        public string Password { get; set; }
        public int Port { get; set; }
        public bool EnableSsl { get; set; }

        public Mail(string username, string password)
        {
            this.Username = username;
            this.Password = password;
        }

        public Mail(string username, string password, int port) : this(username, password)
        {
            this.Port = port;
        }

        public Mail(string username, string password, int port, bool enableSsl) : this(username, password, port)
        {
            this.EnableSsl = enableSsl;
        }
    }
}

اگر کلاس پایه شامل چندین سازنده است و نیاز به استفاده از سازنده زنجیروار در کلاس مشتق شود کافیست بجای استفاده از کلمه کلیدی this از base در کلاس مشتق استفاده نمود. به مثال دیگر خواهیم پراخت، مفروض است در حال توسعه محصول شرکتی که از تزریق وابستگی در پروژه‌ها استفاده نشده و از تعریف صریح Context یا Facade بهره می‌برد فعالیت دارید، مهم نیست که چنین پروژه‌های قواعد اصلی شی گرایی را شامل نخواهند شد در اصل شما استخدام شده‌اید که این روند را تغییر و بهبود بدهید. اگر در کلاس‌ها از تزریق وابستگی استفاده نشده و مستقیم از Context برای دسترسی به اطلاعات بهره خواهید برد زمانی به مشکل خواهید خورد که در آینده قصد دارید ویژگی تزریق وابستگی را اضافه نماید تا پروژه قابلیت تست پذیری را شامل شود، البته این تنها یک بخش از این ماجراست که درخورد این مثال جاری است بدین منظور باید در همه جای سیستم شی Context شناسایی شده و آن را به پراپرتی شی جدید که از طریق سازنده مقداردهی می‌شود تغییر دهید که زمان بسیاری از شما خواهد گرفت:

namespace ConstructorChaining
{
    public class AppSettings : Controller
    {
        public ActionResult Index()
        {
            using (var context = new ApplicationContext)
            {
                return View(context.ToList());
            }
        }
        
        ...        
    }
}

کد فوق را با استفاده از سازنده زنجیروار اصلاح خواهیم کرد، توجه داشته باشید در این کلاس از سازنده بدون پارامتر استفاده خواهیم کرد اما شی جدید از ApplicationContext از طریق آن به سازنده دوم ارسال خواهد شد که موجب مقداردهی شدن شی context_ می‌گردد:

namespace ConstructorChaining
{
    public class AppSettings : Controller
    {
        private IContext _context;

        public AppSettings(IContext context)
        {
            this._context = context;
        }

        public AppSettings() : this(new ApplicationContext)
        {

        }

        public ActionResult Index()
        {
            return View(_context.Person.ToList());
        }
        
        ...        
    }
}

در صورت فعال سازی تزریق وابستگی فقط با حذف سازنده زنجیروار پروژه بدون مشکل و در کمترین زمان ممکن ویژگی جدید را شامل خواهد شد.

امید نصری

0 نظر:

تعداد دیدگاه‌های کاربران : 0 دیدگاه
مهمان گرامی! برای ارسال نظر نیاز است وارد سایت شوید.


You must log on to comment.