【问题标题】:.net: Hard-coded conditions or WHAT?.net:硬编码条件还是什么?
【发布时间】:2011-06-03 06:15:51
【问题描述】:

我有一个表单 (form1),其中包含一个简单的下拉列表 (dropdown1) 和 2 个文本框 (textbox1) 和 (textbox2)。

场景是:用户在 textbox1 中输入了一些代码,然后根据他输入的内容,代码的“类型”将出现在 textbox2 中。我应该说 textbox2 是只读的。

场景的主要部分是,只有当 textbox2.text 等于某些特定值(类型)时,例如“Polymeric, Cord and Seat”,dropdown1 才会出现在 form1 中并填充一些颜色 - 从 DB 中获取 -

你认为硬编码这个条件是一个正确的决定吗?如果没有,您有什么建议?

【问题讨论】:

  • 代码的“类型”是什么意思?您是指代码中对象的类型吗?
  • 不,我的意思是聚合物、座椅、绳索,我在上面的主题中说过
  • Nono,不是硬编码的。制作一个简单的配置文件,这样你就可以在不接触代码的情况下轻松添加/更改/删除类型。
  • 如果 textbox2 是只读的,你能把它改成标签吗?

标签: .net conditional-statements hardcode


【解决方案1】:

如果硬编码的内容可能会发生变化,那么硬编码永远不会是好的。

例如,您需要添加一个新类型,并且您必须重新构建所有内容。

我的建议:如果可以的话,让代码和类型之间的映射是可配置的。

【讨论】:

  • 你的意思是我应该在数据库中这样做吗?
  • 这是可能的,将一些配置设置存储到数据库中,绝对比硬编码更好。另一种方法是配置文件,但它实际上取决于有多少数据。如果金额很大,请使用 db。
【解决方案2】:

这样的硬编码规则从来都不是一件好事。

我会创建一个类似于

的类
class Something
{
    public string Keyword;
    public string KeywordType;
    public List<string> ListOfItems;
}

然后我会从数据库、xml 文件或其他任何内容中填充Something 的列表,这没关系。

public List<Something> ListOfSomethings;

从您的数据存储中读取并将每个添加到列表中。

ListOfSomethings.Add(new Something("keyword","KeywordType",new List<String>{"Item1","Item2"});

然后,当他们在 textbox1 中输入内容时,您可以 linq 或循环 ListOfSomethings 以找到您需要的项目,并将 textbox2 设置为 Something.KeywordType,然后设置 if 的计数。 ListOfItems > 0 然后将项目添加到组合框并使其可见。

【讨论】:

    【解决方案3】:

    这完全取决于您项目的最终复杂性...如果它是一个 2 页的项目,那么硬编码没有错,只要它只有一次并且它位于一个易于访问的地方,不仅您可以更改,而且将来接受该项目的任何人都可以更改。

    例如,在您的Helper Class中添加

    public const string[] SearchTypes = new string[] { "polymeric", "cord", "seat" };
    

    添加一个扩展方法来帮助你

    public static string ToJavaScriptArray(this string[] array) {
        string r = "";
    
        foreach(string s in array)
            r += String.Format("'{0}',", s);
    
        return r.TrimEnd(',');
    }
    

    然后,在您想要的特定页面的 javascript 中,您可以轻松添加

    var searchTypes = new Array(<%= SearchTypes.ToJavaScriptArray() %>);
    

    并在代码中使用 javascript 数组来检查“类型”是否包含在该数组中,例如

    让我们添加一个原型来帮助我们

    Array.prototype.has = function(obj) {
        return this.indexOf(obj) >= 0;
    }
    

    然后

    if( searchTypes.has( document.getElementById('textBox1').value ) { 
        // show dropdown        
    }
    

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      假设您已经确定了 textbox1 中代码类型的逻辑,则可以将列表框启用为:

      首先定义一个代码类型的枚举,

      
      enum CodeType
      {
          Polymeric,
          Cord,
          Seat
      }
      

      然后启用/禁用列表框,

      
      public void test()
      {
          if (Enum.IsDefined(typeof(CodeType), textBox2.Text.Trim()))
          {
              listBox1.Enabled = true;
          }
          else
          {
              listBox1.Enabled = false;
          }
      
          //Alternative
          //listBox1.Enabled = Enum.IsDefined(typeof(CodeType), textBox2.Text.Trim());
      }
      

      请注意,如果列表框较早隐藏,则需要更改列表框的 Visible 属性而不是 Enabled 属性。

      如果您想避免这种情况,那么您可以将类型名称移动到设置文件中,然后在运行时读取。

      【讨论】:

        【解决方案5】:

        正如其他人所说,硬编码从来都不是一个好主意。您提到您正在访问数据库以获取颜色,为什么不在数据库中为代码/类型映射提供一个简单的查找表?虽然这可能是最复杂的解决方案,但由于多种原因,它是最强大的。

        如果您只有一个 Web 服务器并且不需要担心数据复制,您可以只在 XML 文件中实现映射,并在滑动到期时将该文件缓存在内存中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多