نمایش نتایج 1 تا 1 از 1

نام تاپیک: توابع زنجیره ای در CSharp

  1. #1

    Red face توابع زنجیره ای در CSharp

    به نام آنکه رحمتش بر غضبش پیشی گرفت، با نام او

    امروزه استفاده از کتابخانه jQuery برای برنامه نویسان وب امری عادی محسوب می شود ، شاید یکی از مفیدترین ویژگی هایی که برنامه نویسان را برای استفاده از jQuery ترغیب می کند، ویژگی توابع زنجیره ای در این کتابخانه باشد.
    این سوال پیش می آید که آیا امکان بهره گیری از این ویژگی در زبان های دیگر هم وجود دارد یا نه ؟
    پاسخ مسلما مثبت است، در ادامه نحوه ی پیاده سازی اینگونه توابع را در زبان C#‎ بررسی خواهم کرد.
    بیایید کمی با String ها بازی کنیم ! کلاسی به نام ExtraString تشکیل می دهیم.
    قرار است در این کلاس مجموعه ای از امور Reverse، MD5 و همین طور SHA1 صورت پذیرد.

    • برای درک راحت تر این ویژگی مثال بسیار ساده بالا را در نظر گرفتم تا همگان با این ویژگی و اصول پیاده سازی آن آشنا شوند از این رو امیدوارم دوستان بنده را عفو بفرمایند.

    ابتدا یک پروژه ConsoleApplication بسازید.
    سپس کلاسی به نام ExtraString فراهم کنید و کد زیر را برایش بنویسید.


    using System;
    using System.Security.Cryptography;
    using System.Text;

    namespace ConsoleApplication1
    {
    public class ExtraString
    {
    public ExtraString(string inputString) { InputString = inputString; }
    public ExtraString() { }

    public string InputString { get; set; }


    در شرح کد بالا باید به این موضوع اشاره کرد که دو خط اول پس از تعریف کلاس در حقیقت Constructor های کلاس جاری ما را تشکیل می دهند و خط سوم هم یک AutoProperty که جهت ذخیره سازی رشته ی ورودی در نظر گرفته شده است.
    در ادامه کلاس ، تمام امور Reverse ، MD5 و SHA1 که به صورت متد فراهم شده است را اضافه می کنیم، تا اینجا مسلما مورد جدیدی بیان نشده اما باید برای تکمیل این کلاس همچنان صبور بود !


    #region Methods
    private string CalculateMd5Hash(string input)
    {
    MD5 md5 = System.Security.Cryptography.MD5.Create();
    byte[] inputBytes = Encoding.ASCII.GetBytes(input);
    byte[] hash = md5.ComputeHash(inputBytes);
    var sb = new StringBuilder();
    for (int i = 0; i < hash.Length; i++)
    {
    sb.Append(hash[i].ToString("X2"));
    }
    return sb.ToString();
    }
    private string ReverseString(string input)
    {
    var str = input.ToCharArray();
    Array.Reverse(str);
    return new string(str);
    }
    private string CalculateSHA1(string text)
    {
    byte[] buffer = Encoding.UTF8.GetBytes(text);
    var cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
    var hash = BitConverter.ToString(cryptoTransformSHA1.ComputeH ash(buffer)).Replace("-", "");
    return hash;
    }
    #endregion

    این متد ها که در بلاک کد بالا ذکر شد را هم به کلاس جاری اضافه کنید.
    همان طور که مشخص است متد اولی جهت محاسبه MD5 رشته جاری و متد دوم جهت عمل Reverse و متد سوم هم SHA1 رشته ی جاری را محاسبه می کند.
    و اما بخش اصلی کد نویسی !

    public ExtraString MD5()
    {
    InputString = CalculateMd5Hash(InputString);
    return this;
    }

    این یکی از توابع زنجیره ای است، و 3 نکته در خود دارد :
    1. اول اینکه همانطور که مشاهده می کنید نوع بازگشتی این گونه توابع خود کلاس جاری است.
    2. دوم اینکه غالبا خود کلاس فعلی محل ذخیره تغییرات خودش است ! چرا که باید اطلاعات به گونه ای ذخیره شود که به صورت زنجیروار روی هم اثر بگذارند بنابراین همانطور که می بینید و در ادامه خواهید دید تغییرات در یک یا چند فیلد یا پراپرتی ذخیره می شود.(این جا همه ی تغییرات فقط روی پراپرتی InputString صورت می گیرد )
    3. عبارت return this; پایان بخش اینگونه متد هاست چرا که نوع بازگشتی کلاس جاری است و می دانیم که واژه کلیدی this اشاره گری به کلاس جاری می باشد.
    به همین سادگی تمام شد !

    public ExtraString SHA1()
    {
    InputString = CalculateSHA1(InputString);
    return this;
    }

    public ExtraString Reverse()
    {
    InputString = ReverseString(InputString);
    return this;
    }
    در ادامه به یک متد هم جهت نمایش تغییرات نیاز داریم که آن هم صد البته همچون توابع فوق شکل می گیرد.

    public ExtraString ShowResult()
    {
    Console.WriteLine(InputString);
    return this;
    }

    خب دیگه کلاس تموم شد این هم دو آکولاد آخرش !

    }
    }

    حالا بریم تو کلاس اصلی، کد این بخش رو ببینید :

    using System;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    var s = new ExtraString(Console.ReadLine());
    s
    .Reverse()
    .ShowResult()
    .SHA1()
    .ShowResult()
    .MD5()
    .ShowResult();
    Console.ReadKey();
    }
    }
    }

    همانطور که می بینید به طور زنجیر وار توابع فراخوانی شده است و البته می توانید به هر گونه ی دیگری این توابع را پشت سر هم بچینید !

    image.jpg

    خب دوستان تمام شد با آرزوی اینکه این مطلب مفید بوده باشد 2 تا نکته مونده که بگم :
    1. منابع

    http://en.wikipedia.org/wiki/Method_chaining
    http://stackoverflow.com/questions/293353/fluent-interfaces-method-chaining

    2. هرگونه بهره برداری فقط با ذکر نام نویسنده و منبع مجاز است.
    نویسنده : حامد فتحی – تیر 1390

    * فایل PDF و پروژه این مطلب از طریق لینک زیر قابل دانلود است.
    دانلود
    آخرین ویرایش به وسیله HamedFathi : یک شنبه 05 تیر 1390 در 08:52 صبح

قوانین ایجاد تاپیک در تالار

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