1

在我的程序中,我编写了以下私有变量和函数。

    private string _viewName;
    private string _refValue;

    private void getContentDetails(string id) {
        switch (id.Substring(2, 2))
        {
            case "00": _refValue = "14"; _viewName = "Menu"; break;
            case "01": _refValue = "18"; _viewName = "Topic";  break;
            default: _refValue = "00"; _viewName = "Menu"; break;
        }
    }

我正在寻找一种更好的编码方式,我正在考虑用两个私有函数替换它。

   getViewName(id);
   getRefValue(id);

有人可以建议我编写此代码的最佳方式吗?

4

5 回答 5

2

使用一个类:

class ContentDetails
{
    public string ViewName { get; set; }
    public string RefValue { get; set; }
}

像这样使用它:

switch (id.Substring(2, 2))
{
    case "00": return new ContentDetails { RefValue = "14", ViewName = "Menu" };
    case "01": return new ContentDetails { RefValue = "18", ViewName = "Topic" };
    default: return new ContentDetails { RefValue = "00", ViewName = "Menu" };
}
于 2012-04-08T08:25:30.537 回答
2

在 switch 中放置多个语句当然没有错,但看起来这里可能存在一些重复,特别是如果与 ID 耦合的所需值发生了更改。

在我看来,您必须对两者都使用地图集合对象,viewName并将refValueid 映射到相应的值。然后使用yourCollection.get(id);. 这肯定会使您的代码保持最佳的可维护性和一致性。

Dictionary<string, string> _refValues = new Dictionary<string, string>();
Dictionary<string, string> _viewNames = new Dictionary<string, string>();
fillDictionaries();

void fillDictionaries()
{
    _refValues.add("00","14"); //one way to add a value
    _viewNames["00"] = "Menu"; //another way to add a value
}

string getRefValue(string id)
{
    return _refvalues[id]; //there may be a get method but I'm not using an IDE atm
}

//same function for viewNames

这甚至还不是最好的解决方案。最好的办法是使用字典将 refValues 耦合到 viewNames,然后使用另一个字典将 ids 映射到 refvalues。然后您可以通过使用 id 作为 key 来获取 refValue,然后将返回的 refValue 作为 key 来获取 viewName。希望我说清楚了:)

于 2012-04-08T08:30:44.347 回答
2

有几种方法可以返回多个值。

您可以使用out参数:

private void getContentDetails(string id, out string viewName, out string refValue) {
  switch (id.Substring(2, 2)) {
    case "00": refValue = "14"; viewName = "Menu"; break;
    case "01": refValue = "18"; viewName = "Topic";  break;
    default: refValue = "00"; viewName = "Menu"; break;
  }
}

您可以返回一个包含两个值的对象:

private KeyValuePair<string, string> getContentDetails(string id) {
  switch (id.Substring(2, 2)) {
    case "00": return new KeyValuePair<string, string>("Menu", "14");
    case "01": return new KeyValuePair<string, string>("Topic", "18");
    default: return new KeyValuePair<string, string>("Menu", "00");
  }
}

您可以创建自己的对象来返回:

private class ContentDetails {

  public string ViewName { get; private set; }
  public string RefValue { get; private set; }

  public ContentDetails(string name, value) {
    ViewName = name;
    RefValue = value;
  }

}

private ContentDetails getContentDetails(string id) {
  switch (id.Substring(2, 2)) {
    case "00": return new ContentDetails("Menu", "14");
    case "01": return new ContentDetails("Topic", "18");
    default: return new ContentDetails("Menu", "00");
  }
}
于 2012-04-08T08:39:40.143 回答
1

虽然我看不出在类中使用私有全局变量有什么问题,但如果你想要一个备用变量,你可以通过引用和作为输出参数传递它们。

private getContentDetails(string id, ref string refValue, ref string viewName)

private getContentDetails(string id, out string refValue, out string viewName)
于 2012-04-08T08:28:08.400 回答
1

试试这个实现地图的类(正如马里奥建议的那样)。

idValueDictionary映射idrefValue,将valueNameDictionary映射refValuenameValue。字典是硬编码的,但如果它适合您的需要,您可以在运行时加载数据。

using System;
using System.Collections.Generic;

class ContentDetails
{
  // Maps id to RefValue.
  private static readonly Dictionary<string, string> idValueDictionary =
    new Dictionary<string,string>()
    {
      { "00", "14" },
      { "01", "18" },
      { "XX", "00" }
    };

  // Maps RefValue to ViewName
  private static readonly Dictionary<string, string> valueNameDictionary =
    new Dictionary<string,string>()
    {
      { "00", "Menu" },
      { "14", "Menu" },
      { "18", "Topic" }
    };

  // Private constructor. Use GetContentDetails factory method.
  private ContentDetails(string refValue, string viewName)
  {
    this.RefValue = refValue;
    this.ViewName = viewName;
  }

  // Gets the RefValue.
  public string RefValue
  {
    get;
    private set;
  }

  // Gets the ViewName.
  public string ViewName
  {
    get;
    private set;
  }

  // Creates a new ContentDetails from the specified id.
  public static ContentDetails GetContentDetails(string id)
  {
    // Extract key from id.
    string key = id.Substring(2,2);

    // If key not in dictionary, use the default key "XX".
    if (!idValueDictionary.ContainsKey(key))
    {
      key = "XX";
    }

    // Get refValue and viewName from dictionaries.
    string refValue = idValueDictionary[key];
    string viewName = valueNameDictionary[refValue];

    // Return a new ContentDetails object with properties initialized.
    return new ContentDetails(refValue, viewName);
  }
}

像这样使用它:

// Static factory method creates a new ContentDetails from the specified `id`
ContentDetails details = ContentDetails.GetContentDetails(id);

Console.WriteLine(details.RefValue); // writes RefValue
Console.WriteLine(details.ViewName); // writes ViewName

ContentDetails使用该方法创建一个新GetContentDetails属性后,您可以访问这两个属性以获取RefValueViewName。这些属性是只读的 ( private set),因此一旦创建了类实例(它是不可变的),您就无法更改值。每次你有不同id的查找时创建一个新的。

于 2012-04-08T09:49:08.033 回答