PDA

View Full Version : آموزش: توابع زنجیره ای در CSharp



HamedFathi
پنج شنبه 02 تیر 1390, 18:41 عصر
به نام آنکه رحمتش بر غضبش پیشی گرفت، با نام او


امروزه استفاده از کتابخانه 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();
}
}
}


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

71502

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



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


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











* فایل PDF و پروژه این مطلب از طریق لینک زیر قابل دانلود است.
دانلود (http://uploaderii.persiangig.com/other/Method%20Chaining%20in%20CSharp.rar)