C# if İfadesi Yerine Dictionary Kullanmak

23 Şub

Proje geliştirirken karşılaştığımız sorunlardan biri de “if” kullanımı sırasındaki kod fazlalığından dolayı kodun okunabilirliğinin azalmasıdır. Buna örnek olarak aşağıdaki gibi bir örnek verebiliriz. Bu örnekte matematiksel bir işleme karar vermek için belirlenmiş bir dizi “if” sınaması gerçekleştirilmektedir.


public class OperationData
{
    public int X { get; set; }
    public int Y { get; set; }
    public string Operation { get; set; }
}

public ActionResult Save(OperationData operationData)
{
    if (operationData.Operation == "+")
    {
        // Sum
    }
    else if (operationData.Operation == "-")
    {
       // Sub
    }
    else if (operationData.Operation == "*")
    {
       // Mul
    }
    else if (operationData.Operation == "/")
    {
       // Div
    }
    throw new Exception();
}

}

Bunun yerine daha temiz bir tasarım fikri geliştirmek mümkündür. Bu tasarım fikrine okuduğum kitaplarda ve makalelerde de rastlıyorum. Fikri geliştiren hakkında kaynak göstermek isterdim ama elimde kesin bir kaynağa sahip olmadığımdan net bir kaynak gösteremiyorum. Şimdilik sadece fikri sunana teşekkür etmekle yetiniyorum.


public class MathController
{
    readonly Dictionary<string,Func<OperationData,ActionResult>> handleAction =
       new Dictionary<string, Func<OperationData, ActionResult>>
         {
            {"+", SumAction},
            {"-", SumAction},
            {"*", SumAction},
            {"/", SumAction},
         };

   public ActionResult Save(OperationData operationData)
   {
       if (handleAction.ContainsKey(operationData.Operation))
       {
          return handleAction[operationData.Operation](operationData);
       }
       throw new Exception();
   }

}

Yukarıdaki yaklaşım daha temiz ve okunabilirlik bakımından gayet iyi bir şeçim olacaktır. handleAction kolleksiyonunu uygun operasyon bilgileriyle doldurarak istediğimiz işlemleri başarıyla gerçekleştirebiliriz.

One thought on “C# if İfadesi Yerine Dictionary Kullanmak

Comments are closed.