بناء واجهات التطبيقات Fluent APIs

17 نوفمبر 2016     484 مشاهدة    0 تعليق
تم النشر في #Fluent APIs  #APIs 

ماهي الـ Fluent APIs؟ كما هو من المعروف أن أي لغة برمجية توفر كم هائل من واجهات التطبيقات APIs التي تتيح للمبرمجين من عمل أي شيء في نطاق المميزات التي تقدمها تلك اللغة. وكذلك نرى بعض المشاريع مفتوحة المصدر والتي كتبت بواسطة مطوين آخرين ولكن السؤال ما مدى سهولة التعامل مع تلك الـ APIs, وهل هي سهلة القراءة والفهم؟!!

فالـ Fluent APIs هي نمط برمجي يستخدم لبناء APIs تكون على شكل سلسة من الدوال Method Chaining  بحيث تكون سهلة القراءة والإستخدام.

فلو نلاحظ تقنية الـ LINQ مثلاً أنها قدمت أسلوب رائع, سهل وومتع في كتابة الإستعلامات ضمن السي شارب أو الفيجوال بيسك, دعونا نلقي نظرة على المثال التالي:

var query = db.Products.Where(p => p.Category.Name == "Beverages")
    .OrderBy(p => p.Name)
    .Select(p => p);

فالجملة السابقة سهلة للقراءة لأي مبرمج, والسر في سهولتها إستخدام سلسلة من الدوال مسماه بأسماء مقاربة للغة البشر, ففي مقالتنا اليوم سوف نتعرف على كيفية صنع مثل هذه النوع من الواجهات.

يمكن عمل Fluent APIs بأكثر من طريقة مثل أستخدام الواجهات Interfaces أو الـ Extension Methods أو غيرهما.

أول مثال سأقوم بطرح هو تسهيل إستدعاء الـ Web APIs & Web Services بإستخدام الـ AJAX. طبعاّ ببساطه سأقوم بعمل دالة إستدعاء للخدمة ودالتين أخرتين في حالة نجاح أو فشل العملية.

public class Ajax
{
    private enum HttpStatus
    {
        OK,
        ERR
    }

    private static HttpStatus _status;

    public static Ajax Call(string url, dynamic parameters)
    {
        try
        {
	    // TODO: Calling the service
            
	    // TODO: Uncomment the line if the service call has successffuly executed
            //_status = HttpStatus.OK;
            
            // TODO: Uncomment the line if the service call has failure during the execution
            //_status = HttpStatus.ERR;
            
            return new Ajax();
        }
        catch (Exception)
        {
            _status = HttpStatus.ERR;
        }

        return new Ajax();
    }

    public Ajax Success()
    {
        if (_status == HttpStatus.OK)
        {
            // TODO: Success action
        }

        return this;
    }

    public Ajax Fail()
    {
        if (_status == HttpStatus.ERR)
        {
            // TODO: Failed action
        }

        return this;
    }
}

والآن يمكننا ببساطة إستخدام الـ Fluent APIs على النحو التالي:

Ajax.Call(url: "/services/userLogin", parameters: new { Username = "hisham", Password = "SuPerSeCuReP@ssw0rd" })
    .Success()
    .Fail();

المثال الآخر ساستخدم الواجهات Interfaces لعمل ما يسمى Fluent Interface APIs, وهي شبيه للطريقة الأولى إلا أنها تستخدم الواجهات, طبعاً سأقوم بعمل فئة تمكننا من إرسال بريد إلكتروني, والأغلبية يعرف أن لعمل هذا الشيء في الدوت نت نحتاج للفئتين MailMessage و SmtpClient.

public interface IEmailService
{
    IEmailService UsingServer(string host, int port);
    IEmailService WithCredentials(string username, string password);
    EmailMessage CreateMessage();
    void Send();
}
public class Email : IEmailService
{
    private string _host;
    private int _port;
    private string _username;
    private string _password;
    private EmailMessage _msg;

    public EmailMessage CreateMessage()
    {
        _msg = new EmailMessage(this);
        return _msg;
    }

    public IEmailService FromServer(string host, int port)
    {
        _host = host;
        _port = port;
        return this;
    }

    public void Send()
    {
        Console.WriteLine($"Email sent from {_msg.FromAddress} to {_msg.ToAddress} titled {_msg.Subject}.");
    }

    public IEmailService WithCredentials(string username, string password)
    {
        _username = username;
        _password = password;
        return this;
    }
}
public partial class EmailMessage
{
    private string _from;
    private string _to;
    private string _subject;
    private string _body;
    private IEmailService _sender;

    public EmailMessage(IEmailService sender)
    {
        _sender = sender;
    }

    public string FromAddress
    {
        get
        {
            return _from;
        }
    }

    public string ToAddress
    {
        get
        {
            return _to;
        }
    }

    public string Subject
    {
        get
        {
            return _subject;
        }
    }

    public string Body
    {
        get
        {
            return _body;
        }
    }
}
public partial class EmailMessage
{
    public EmailMessage From(string sender)
    {
        _from = sender;
        return this;
    }

    public EmailMessage To(string recipient)
    {
        _to = recipient;
        return this;
    }

    public EmailMessage WithSubject(string subject)
    {
        _subject = subject;
        return this;
    }

    public IEmailService WithBody(string message)
    {
        _body = message;
        return _sender;
    }
}

والآن ببساطه يمكننا إستخدامها على النحو التالي:

new Email()
    .FromServer("localhost", 25)
    .WithCredentials("hisham", "SuPerSeCuReP@ssw0rd")
    .CreateMessage()
    .From("hishamco_2007@yahoo.com")
    .To("hishamco_2007@hotmail.com")
    .WithSubject("Fluent APIs")
    .WithBody("This is email is created using Fluent APIs")
    .Send();

وفي الختام أرجو أن يكون المقال أعجبكم وشوقكم لعمل Fluent APIs خاصة بكم.

تويتر فيسبوك قوقل + لينكد إن


اكتب تعليقك