2014-01-07 5 views
1

У меня есть код, который должен присвоить некоторые значения его свойствам в соответствии с заданным порядком.Каков наилучший способ реализации метода переупорядочения?

Ниже приведен пример кода, который будет выполнять работу:

public class AnimalCount 
{ 
    public int Dogs; 
    public int Cats; 
    public int Fish; 
    public int Birds; 

    public void RankValues(string first, string second, string third, string fourth) 
    { 
     string property = ""; 
     int value = -1; 
     for (int i = 0; i < 4; i++) 
     { 
      switch (i) 
      { 
       case 0: property = first; value = 10; break; 
       case 1: property = second; value = 12; break; 
       case 2: property = third; value = 19; break; 
       case 3: property = fourth; value = 20; break; 
      } 
      switch (property) 
      { 
       case "dogs": Dogs = value; break; 
       case "cats": Cats = value; break; 
       case "fish": Fish = value; break; 
       case "birds": Birds = value; break; 
      } 
     } 
    } 
} 

Есть некоторые проблемы с этим кодом, однако.

  1. Основная проблема заключается в том, как передать параметры. С помощью этого метода, поскольку они передаются как строки, мы теряем безопасность типа. Таким образом, мы могли бы иметь дубликаты или несогласованные строки. Мы могли бы использовать перечисления, но тогда у нас все еще есть риск дублирования, и нам нужно будет сделать дублирование кода, чтобы он работал.
  2. Коммутаторы являются уродливыми. Это похоже на дублирование кода.

Есть ли лучшее решение, чем просто заполнение кода обработкой исключений? Кажется ужасно уродливым для меня.

Если вы должны знать, я пытаюсь написать функцию, которая берет требуемый порядок баллов в Dungeons and Dragons и рулонах для них в выбранном вами порядке.

+0

Вы используете специфические язык? Выглядит C#/java для меня? – robasaurus

+0

да, это C#, но вопрос будет применен для любого процедурного языка – Nacht

+1

C# объектно ориентирован не процедурный. – robasaurus

ответ

1

Не совсем уверен, что если я буду следовать за вами, но можете ли вы не просто взять упорядоченную коллекцию из 4 параметров?

public void doWhatever(String[] orderedParams) { 
    this.animals = orderedParams; 
    // ... 
    this.doTheThing(animals[0], 10); 
    this.doTheThing(animals[1], 12); 
    // etc 
} 
1

Словарь будет хорошим контейнером для ваших результатов, поскольку вам по существу нужна пара ключ/значение. Если вы подаете две коллекции в вашей функции ранга

public Dictionary<string, int> Rank(string[] orderedKeys, int[] orderedValues) 
{ 
    Dictionary<string, int> rankedDictionary = new Dictionary<string, int>(); 
    for (int i = 0; i < orderedKeys.Length; i++) 
    { 
     rankedDictionary.Add(orderedKeys[i], orderedValues[i]); 
    } 
    return rankedDictionary; 
} 

public void CallRank() 
{ 
    string[] orderedKeys = new[] { "dogs", "cats", "fish", "birds" }; 
    int[] orderedValues = new[] { 10, 12, 19, 20 }; 

    Dictionary<string,int> rankedResults = Rank(orderedKeys, orderedValues); 

    int catsValue = rankedResults["cats"]; 
} 

Причина я спросил, если вы используете C#, потому что если вы беспокоитесь о сильно типизированных переменных, вместо строки «кошка» и «собака» и т.д. Вы можете использовать Enum в C#.

http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

public enum Animals 
{ 
    Dog 
    Cat 
    .... 
} 

так что вы словарю бы типа

Dictionary<Animals, int> 

и доступ будет как так

int dogValue = rankedDictionary[Animals.Dog]; 
+0

да, я думал об использовании словаря и перечислений ... но я действительно хочу, чтобы публичные свойства там назывались как они есть. конечно, я всегда могу использовать их getter, чтобы сделать эту работу, но это кажется слишком большим усилием для чего-то такого простого ... также перечисления кажутся глупыми, потому что я хочу, чтобы там были свойства ... я думаю, что я буду придерживаться того, что у меня было первоначально – Nacht

2

Я хотел бы сделать это:

public class AnimalCount 
{ 
    public int Dogs; 
    public int Cats; 
    public int Fish; 
    public int Birds; 

    private Dictionary<string, Action<int>> rankers 
     = new Dictionary<string, Action<int>>() 
    { 
     { "dogs", v => Dogs = v }, 
     { "cats", v => Cats = v }, 
     { "fish", v => Fish = v }, 
     { "birds", v => Birds = v }, 
    }; 

    private Action<string, int> setRank = (t, v) => 
    { 
     if (rankers.ContainsKey(t)) 
     { 
      rankers[t](v); 
     } 
    }; 

    public RankValues(string first, string second, string third, string fourth) 
    { 
     setRank(first, 10); 
     setRank(second, 12); 
     setRank(third, 19); 
     setRank(fourth, 20); 
    } 
} 
+0

и я отказался от этого проекта некоторое время назад, но я думаю, что это по-прежнему хороший вопрос ... учитывая временное отставание, мой мозг говорит мне, что Дик определенно способ пойти, но, возможно, по-другому. .. отправляю свой собственный ответ сейчас. – Nacht

0

Принимая идеи из других ответов, я считаю, что лучшим способом осуществить это было бы следующее:

using System.Collections.Generic; 
public class AnimalCount 
{ 
    public int Dogs { get { return animals["dogs"]; } } 
    public int Cats { get { return animals["cats"]; } } 
    public int Fish { get { return animals["fish"]; } } 
    public int Birds { get { return animals["birds"]; } } 

    private Dictionary<string, int> animals = new Dictionary<string, int>(); 

    public void RankValues(string first, string second, string third, string fourth) 
    { 
     animals[first] = 10; 
     animals[second] = 12; 
     animals[third] = 19; 
     animals[fourth] = 20; 
    } 
} 

и перечисление для безопасности типа:

using System.Collections.Generic; 

public enum Animals 
{ 
    Dogs, Cats, Fish, Birds 
} 

public class AnimalCount 
{ 
    public int Dogs { get { return animals[Animals.Dogs]; } } 
    public int Cats { get { return animals[Animals.Cats]; } } 
    public int Fish { get { return animals[Animals.Fish]; } } 
    public int Birds { get { return animals[Animals.Birds]; } } 

    private Dictionary<Animals, int> animals = new Dictionary<Animals, int>(); 

    public void RankValues(Animals first, Animals second, Animals third, Animals fourth) 
    { 
     animals[first] = 10; 
     animals[second] = 12; 
     animals[third] = 19; 
     animals[fourth] = 20; 
    } 
} 
+0

с четырьмя возможными значениями, возможно, перечисление не стоит. также предоставлено с большим количеством возможных значений или для произвольного количества возможных значений, проходящих в каком-то упорядоченном пакете, было бы лучше, как ответ Бен Гриффитса – Nacht

Смежные вопросы