بایگانی

Posts Tagged ‘Fluent Interface’

کدنویسی Fluent در Net.

آوریل 16, 2010 ۱ دیدگاه

در این مقاله قصد دارم به معرفی تکنیکی بپردازم که به منظور خواناتر کردن کدنویسی به کار گرفته می شود.بهترین تعداد آرگومانهای یک تابع صفر(niladic) است.بعد از آن یک(monadic) و بعد از آن دو(dyadic).تعداد سه آرگومان(triadic) تا جائیکه ممکن است نباید استفاده شود.اما بیش از سه آرگومان(polyadic) نیاز به اصلاح دارد و تحت هر شرایطی نباید استفاده شود.

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

مفهوم Fluent در مهندسی نرم افزار به این دلیل ابداع شد که بتوان واسط کاربری را تهیه کرد که از لحاظ خوانایی بیشترین کیفیت را داشته باشد(Fluent Interface).چیزی که در .Net 3.0 به بعد به وفور به خصوص در LINQ دیده می شود.

فرض کنید کلاسی دارید که اطلاعات شخصی یک نفر را به طور کامل به شما میدهد(مثال رو زیاد پیچیده نمی کنم).به طور معمول از این طریق استفاده می شود(البته بدون تعریف Property)

    1 public class Person

    2 {

    3     string fName;

    4     string lName;

    5     string nName;

    6 

    7     public Person(string firstName,

    8         string nickName, string lastName)

    9     {

   10         this.fName = firstName;

   11         this.nName = nickName;

   12         this.lName = lastName;

   13     }

   14 

   15     public string FullName()

   16     {

   17         StringBuilder sb = new StringBuilder();

   18         sb.Append((fName == string.Empty) ? "" : fName);

   19         sb.Append((lName == string.Empty) ? "" : lName);

   20         sb.Append((nName == string.Empty)

   21             ? "" : " (" + nName + ")");

   22 

   23         return sb.ToString();

   24     }

   25 }

و نحوه استفاده نیز به شکل زیر خواهد بود:

    1 Person p = new Person("Sajjad", "sajjadlove", "Aghapour");

    2 MessageBox.Show(p.FullName());

شاید به خودتان بگوئید که ظاهرا مشکلی در این نحوه کدنویسی وجود ندارد، اما اگر پارامترهای شما بیش از سه باشد به راحتی در ایجاد object دچار سردرگمی خواهید شد.راه حل چیست؟به مثال زیر دقت کنید:

اگر کلاس Person را به صورت زیر پیاده سازی کنیم:

    1 public class PersonBuilder

    2 {

    3     string fName;

    4     string lName;

    5     string nName;

    6 

    7     public PersonBuilder WithFirstName(string firstName)

    8     {

    9         this.fName = firstName;

   10         return this;

   11     }

   12 

   13     public PersonBuilder WithLastName(string lastName)

   14     {

   15         this.lName = lastName;

   16         return this;

   17     }

   18 

   19     public PersonBuilder WithNickName(string nickName)

   20     {

   21         this.nName = nickName;

   22         return this;

   23     }

   24 

   25     public string FullName()

   26     {

   27         StringBuilder sb = new StringBuilder();

   28         sb.Append((fName == string.Empty) ? "" : fName);

   29         sb.Append((lName == string.Empty) ? "" : lName);

   30         sb.Append((nName == string.Empty)

   31             ? "" : " (" + nName + ")");

   32 

   33         return sb.ToString();

   34     }

   35 }

نحوه استفاده به شکل زیر خواهد بود:

    1 PersonBuilder pb = new PersonBuilder();

    2 string name = pb.WithFirstName("Sajjad")

    3     .WithNickName("sajjadlove")

    4     .WithLastName("Aghapour")

    5     .FullName();

    6 

    7 MessageBox.Show(name);

تا به حال به این نحوه پیاده سازی در LINQ زیاد برخورده اید زیرا این نحوه پیاده سازی در ایجاد Query و اجرای آنها بسیار مناسب و کاربردی است.

Advertisements
دسته‌ها:C#.Net برچسب‌ها: , , ,