اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
یک دقیقه
قبلا در مورد تبدیل switch statement به الگوی استراتژی مطلبی را در این سایت مطالعه کردهاید (^) و بیشتر مربوط است به حالتی که داخل هر یک از case های یک switch statement چندین و چند سطر کد و یا فراخوانی یک تابع وجود دارد. حالت سادهتری هم برای refactoring یک عبارت switch وجود دارد و آن هم زمانی است که هر case، تنها از یک سطر تشکیل میشود؛ مانند:
namespace Refactoring.Day12.RefactoringSwitchStatement.Before
{
public class Translator
{
public string ToPersian(string englishWord)
{
switch (englishWord)
{
case "zero":
return "صفر";
case "one":
return "یک";
default:
return string.Empty;
}
}
}
}
در اینجا میتوان از امکانات ساختار دادههای توکار دات نت استفاده کرد و این switch statement را به یک dictionary تبدیل نمود:
using System.Collections.Generic;
namespace Refactoring.Day12.RefactoringSwitchStatement.After
{
public class Translator
{
IDictionary<string, string> Words = new Dictionary<string, string>
{
{ "zero", "صفر" },
{ "one", "یک" }
};
public string ToPersian(string englishWord)
{
string persianWord;
if (Words.TryGetValue(englishWord, out persianWord))
{
return persianWord;
}
return string.Empty;
}
}
}
همانطور که ملاحظه میکنید هر case به یک key و هر return به یک value در Dictionary تعریف شده، تبدیل گشتهاند. در اینجا هم بهتر است از متد TryGetValue جهت دریافت مقدار کلیدها استفاده شود؛ زیرا در صورت فراخوانی یک Dictionary با کلیدی که در آن موجود نباشد یک استثناء بروز خواهد کرد.
برای حذف این متد TryGetValue، میتوان یک enum را بجای کلیدهای تعریف شده، معرفی کرد. به صورت زیر:
using System.Collections.Generic;
namespace Refactoring.Day12.RefactoringSwitchStatement.After
{
public enum EnglishWord
{
Zero,
One
}
public class Translator2
{
IDictionary<EnglishWord, string> Words = new Dictionary<EnglishWord, string>
{
{ EnglishWord.Zero, "صفر" },
{ EnglishWord.One, "یک" }
};
public string ToPersian(EnglishWord englishWord)
{
return Words[englishWord];
}
}
}
به این ترتیب از یک خروجی پر از if و else و switch به یک خروجی ساده و بدون وجود هیچ شرطی رسیدهایم.