طراحي واسط شناور (Fluent-Interface)
نمایش نتایج: از شماره 1 تا 3 , از مجموع 3
  1. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    tabriz
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض طراحي واسط شناور (Fluent-Interface)

    Fluen t Interface یا همان واسط شناور عنوان روشی برای پیاده‌سازی API ها در زبان‌های شئ‌گرا می باشد که برای نخستین بار توسط E ric Evan (ارائه دهنده رویکرد توسعه دامنه محور Dom ain-Driven Design ) و M artin Fowler ارائه گردید.
    در این روش کد خود بیانگر مقصود می باشد و شناور بودن متود‌ها به فهم هر‌چه بیشتر هدف کمک می نماید. در واقع پیاده‌سازی مبتنی بر این روش حس یک زبان مخصوص دامنه داخلی (internal Domain S pecific Language) را به خواننده القا می‌کند.
    بهتر است شرح این روش را با یک مثال آغاز نماییم. برای مثال در نظر بگیرید می‌خواهید یک شی از جنس Car را طبق عبارت زیر تولید نمایید.
    Make a car that is yellow and uses gasoline,by the way its radio should be turnd off on stop
    با فرض آماده بودن کلاس Car احتمالا کدی مشابه کد زیر را خواهید نوشت :
    1.
    Car myCar = new Car()

    2.
    {

    3.
    Color = Yellow,

    4.
    Fuel = "Gasoline"

    5.
    }

    6.
    myCar.OnStop += TurnRadioOff;




    اکنون فرض کنید برای نوشتن کد بالا به صورت زیر عمل نموده باشید :
    1.
    Car myCar = new Car();

    2.
    myCar.WithColor(Yellow).WithFuel("Gasoline").OnSto p(TurnRadioOff);





    همانطور که ملاحظه می کنید روش دوم بیان صریحتری نسبت به کد قبلی را دارا می ‌باشد. (پياده سازي اين مثال در نمونه كد همراه اين مقاله موجود است.)
    بطور عمومی گام هاي پیاده‌سازی Fluent Interface بدين گونه است :
    1) بستر مورد تنظیم بر پایه یک Interface قرار می‌گیرد.
    2) بستر مبتنی بر interface مقدار بازگشتی هر متود می باشد و در طول فراخوان‌ها Config می‌گردد.
    3) در نهایت نیز می‌تواند طی یک فراخوان اتمام کننده خروجی مورد نظر را برگرداند.
    بهتر است این روش را با ارائه مثالی ساده بیان کنیم. می‌خواهیم کلاسی را به شما معرفی کنیم که برای تولید عبارات SQL مورد استفاده قرار می گیرد. خروجی این مثال طرز استفاده به صورت زیر می باشد:

    1.
    sqlQuery.Select("Id").Select("FirstName").Select(" LastName").From("Person").Where("Id = 1").Where("FirstName = 'Hossein'").OrderBy("LastName").OrderBy("FirstName ").GenerateSQLQuery();





    ابتدا Interface را می نویسیم:

    01.
    public interface ISQLQuery

    02.
    {

    03.
    ISQLQuery Select(string select);

    04.
    ISQLQuery From(string tableName);

    05.
    ISQLQuery Where(string where);

    06.
    ISQLQuery OrderBy(string orderby);

    07.
    08.
    //Termination Call

    09.
    string GenerateSQLQuery();

    10.
    }





    فرایند زنیجروار بودن بر پایه خروجی هر متود که شئ‌ای مبتنی بر ISQLQuery می باشد اعمال می گردد.
    اکنون باید کلاسی را تولید کنیم که بستر روند تولید عبارت SQL ما باشد:

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #1 ارسال شده در تاريخ 11th December 2011 در ساعت 10:52

  2. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    tabriz
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض

    01.
    public class SQLQueryGenerator : ISQLQuery

    02.
    {

    03.
    private List<string> _SelectItems = new List<string>();

    04.
    private List<string> _WhereItems = new List<string>();

    05.
    private List<string> _OrderByItems = new List<string>();

    06.
    public string TableName { get; private set; }

    07.
    08.
    public ISQLQuery Select(string select)

    09.
    {

    10.
    _SelectItems.Add(select);

    11.
    return this;

    12.
    }

    13.
    14.
    public ISQLQuery From(string tableName)

    15.
    {

    16.
    //بهتر است استثناها را با پیامی مناسب مبنی بر محل وقوع آن منتشر نمایید.

    17.
    18.
    if (string.IsNullOrEmpty(tableName))

    19.
    throw new Exception(string.Format("Command:{0}, {1} resulted in an empty value.", "From", "TableName"));

    20.
    21.
    this.TableName = tableName;

    22.
    return this;

    23.
    }

    24.
    25.
    public ISQLQuery Where(string where)

    26.
    {

    27.
    _WhereItems.Add(where);

    28.
    return this;

    29.
    }

    30.
    31.
    public ISQLQuery OrderBy(string orderby)

    32.
    {

    33.
    _OrderByItems.Add(orderby);

    34.
    return this;

    35.
    }

    36.
    37.
    public string GenerateSQLQuery()

    38.
    {

    39.
    StringBuilder sb = new StringBuilder();

    40.
    sb.Append("SELECT ");

    41.
    42.
    for (int I = 0; I < _SelectItems.Count; i++)

    43.
    sb.Append(_SelectItems[i] + ((I == _SelectItems.Count – 1) ? “ “ : “, “));

    44.
    45.
    sb.Append("FROM ");

    46.
    sb.Append(TableName);

    47.
    sb.Append("WHERE ");

    48.
    49.
    for (int I = 0; I < _WhereItems.Count; i++)

    50.
    sb.Append(_WhereItems[i] + ((I == _WhereItems.Count – 1) ? “ “ : “ AND “));

    51.
    52.
    sb.Append("ORDER BY ");

    53.
    54.
    for (int I = 0; I < _OrderByItems.Count; i++)

    55.
    sb.Append(_OrderByItems[i] + ((I == _OrderByItems.Count – 1) ? “ “ : “, “));

    56.
    57.
    return sb.ToString();

    58.
    }

    59.
    }







    اکنون می‌توانید از کلاس مذکور به صورت زیر استفاده کنید:

    1.
    var sqlQuery = new SQLQueryGenerator();

    2.
    var query = sqlQuery.Select("Id").Select("FirstName").Select(" LastName").From("Person")

    3.
    .Where("Id = 1").Where("FirstName = 'Chris'").OrderBy("LastName").OrderBy("FirstName") .GenerateSQLQuery();

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #2 ارسال شده در تاريخ 11th December 2011 در ساعت 10:52

  3. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    tabriz
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض

    متغیر query حاوی مقدار زیر خواهد بود:
    SELECT Id, FirstName, LastName FROM Person WHERE Id = 1 AND FirstName = 'Hossein' ORDER BY LastName, FirstName

    کد بالا با اندکی تلخیص برگرفته شده از وبلاگ Chr is Pietschmann می باشد.
    نکات مهم :
    • از آنجایی که تمامی این متود‌ها طی یک دستور زنجبروار فراخوانی می‌شوند از اینرو اگر استثنایی (exception) در این متود‌ها رخ دهد پیدا کردن متود مشکل دار سخت خواهد بود بنابراین توصیه می‌گردد زمان انتشار استثناها اطلاعات کاملی به خصوص در مورد محل وقوع استثنا را منتشر نمایید.
    • نکته دیگر آنکه حتما تا به اینجا متوجه پیاده‌سازی این روش به وسیله تکنولوژی LINQ شده‌اید، در LINQ تمامی متود‌ها اشیاء مبتنی بر واسط IEnumerable و یا IQueryable را باز‌می گردانند که همگی با استفاده از قابلیت ExtensionMethod های C# 3.0 پیاده سازی شده‌اند. از اینرو می‌توان دریافت که نوع دیگر پیاده‌سازی روش شناور استفاده از ExtensionMethod ها می باشد.
    • بهتر است هنگام نوشتن عبارات شناور از ويژگي NamedParameter ها نيز كمك بگيريد مانند :
      1.var order = CreateOrder(id: 1).ToClient(named: "Jonh").AddOrderItem(product: 1, quantity:30);




    پیاده‌سازی‌های مبتنی بر Fluent Interface :
    از دیگر موارد کاربرد این روش می‌توان به فرایند Render کردن کنترل‌ها در صفحات ASP.NET اشاره نمود که برای مثال مجموعه کنترل‌های Tel erik که برای ASP.NET MVC ارائه شده‌اند بر این اساس می باشند. به مثال زیر که ساخت یک GridView را نشان می دهد توجه نمایید:
    @{Html.Telerik().Grid(Model)
    .Name("Grid")
    .Columns(columns =>
    {
    columns.Bound(o => o.OrderID).Width(100);
    columns.Bound(o => o.ContactName).Width(200);
    columns.Bound(o => o.ShipAddress);
    columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120);
    })
    .Scrollable(scrolling => scrolling.Enabled(true)
    .Sortable(sorting => sorting.Enabled(true)
    .Pageable(paging => paging.Enabled(true)
    .Filterable(filtering => filtering.Enabled(true)
    .Groupable(grouping => grouping.Enabled(true)
    .Render();
    }



    همانطور که ملاحظه می‌کنید بدین‌گونه می‌توان تمامی فرایند ساخت، تنظیم و render کردن کنترل را در یک تگ دستوری اعمال نمود.
    از دیگر Framework های پرکاربرد مبتنی بر Fluent Interface می توان به Aut opoco (يك فريم ورك سبك براي توليد تصادفي اشياء) و Flue ntValidation (فريم وركي براي معتبرسازي، بسيار پر كاربر در AS P.NET MVC) و M oq اشاره نمود.
    نمونه ی Syntax فريم ورك هاي معرفی شده :
    :Moq
    1.mock.Expect(x => x.DoInt(It.Is<int>(i => i % 2 == 0))).Returns(1);



    :Autopoco
    01.mSession.List<SimpleUser>(100)
    02. .First(50)
    03. .Impose(x => x.FirstName, "Rob")
    04. .Impose(x => x.LastName, "Ashton")
    05. .Next(50)
    06. .Impose(x => x.FirstName, "Luke")
    07. .Impose(x => x.LastName, "Smith")
    08. .All().Random(25)
    09. .Impose(x => x.Role, roleOne)
    10. .Get();


    :Fluentvalidation

    1.public class CustomerValidator: AbstractValidator<Customer> {
    2. public CustomerValidator() {
    3. RuleFor(customer => customer.Surname).NotEmpty();
    4. RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    5. RuleFor(customer => customer.Address).Length(20, 250);
    6.}

    کلام آخر
    روش FluentInterface نقش یک API را بازی می کند. یعنی توصیه می‌گردد اگر ساخت کلاس‌های شما همراه با Configuration نسبتا زيادي می‌باشد برای آنها یک API شناور نیز طراحی نمایید که طرز استفاده برای کاربر نهایی را آسان‌تر و قابل فهم‌تر گرداند.
    امیدوارم این مقاله برای خوانندگان گرامی جالب توجه بوده باشد. خواهشمند است ما را از نظرات و پیشنهادات خود مطلع گردانید.

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #3 ارسال شده در تاريخ 11th December 2011 در ساعت 10:53

موضوعات مشابه

  1. فارسی ساز آفیس ۲۰۱۰ – Microsoft Office 2010 Language Interface Pack Persian
    توسط Admin در انجمن نرم افزارهای پارسی
    پاسخ ها: 0
    آخرين نوشته: 29th December 2010, 04:12
  2. پاسخ ها: 0
    آخرين نوشته: 14th December 2010, 07:44
  3. کتاب Professional SharePoint 2010 Branding and User Interface Design
    توسط p h o e n i x در انجمن ادبیات و زبان انگلیسی
    پاسخ ها: 0
    آخرين نوشته: 26th November 2010, 20:06
  4. دانلود آموزش Learn All About User Interface Components using Actionscript 3
    توسط secret در انجمن Video Training (آموزشهای تصویری)
    پاسخ ها: 0
    آخرين نوشته: 5th June 2010, 02:29
  5. آموزش افكت <<ايجاد دكمه هاي InterFace و Player>> در فتوشاپ
    توسط Borna66_TAHA در انجمن آموزش افكت هاي فتوشاپ
    پاسخ ها: 0
    آخرين نوشته: 25th July 2009, 19:33

علاقه مندی ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

Designed With Cooperation

Of Creatively & VBIran&تزیین سفره هفت سین 96