【问题标题】:Programming Pattern or coding style with multiple ifs/switches具有多个 if/switch 的编程模式或编码风格
【发布时间】:2012-01-22 16:11:06
【问题描述】:

我有一个带有一些 id 的表,我希望在 default.aspx 中打开带有表单的特定 page.aspx,具体取决于 id。

我现在拥有的是:

if(id_table ==1) {
response.redirect("PageBla.aspx");
}

if(id_table==2) {
response.redirect("Page21231.aspx");
}

if(id_table==6) {
....
}
 etc etc....

如果我要检查的 id 数量很少,这很简单。但我将有几十个身份证要检查。是否有任何编程模式或任何其他方法可以在没有数十个 if 或 switch/case 的情况下执行此操作?

提前致谢

编辑:“=”替换为“==”。

【问题讨论】:

    标签: c# asp.net design-patterns coding-style


    【解决方案1】:

    查找包含 ID 和 url 的内容非常容易。它可以在数据库中以获得灵活性,但您也可以现在将它们放入字典中,如果您发现需要它,稍后再添加数据库部分。

    您可以将查找声明为字段:

    private static readonly Dictionary<int, string> redirectLookup = new Dictionary<int,string> {
        {1, "PageBla.aspx"},
        {2, "Page21231.aspx"},
        // .....
        {6, "somepage6.apx"}
    
    };
    

    在你的重定向逻辑中:

    string redirect;
    if (redirectLookup.TryGetValue(id_table, out redirect)) 
        Response.Redirect(redirect);
    else
        // some default action when that ID was not mapped.
    

    【讨论】:

    • 为什么这被否决了?请在投票时发表评论。
    • 谢谢。我认为这是最好的答案
    【解决方案2】:

    只需像这样创建一个简单的 URL 数组:

    string[] urls = {"PageBla.aspx", "Page21231.aspx"};
    response.redirect(urls[id_table]);
    

    如果您有更复杂的用例,另一种选择是使用Convention over configuration。 你可以这样做:

    1. 您的表将具有字符串 ID。
    2. 您的重定向代码将很简单:

      Response.Redirect(tableId + ".asxp");
      

    【讨论】:

    • 当 id_table == 3 时,您的代码会发生什么情况?数组索引是顺序的,id_table 变量不是。如其他回复所示,使用字典是正确的解决方案。
    • 为什么你认为它不是顺序的?显示的代码只是示例代码?如果是这样,字典就过分了。
    • 显示的代码显然是示例代码,非常不正确地代表了期望的结果。他没有把 ... 放在元素 2 和元素 6 之间的事实并不意味着他不是故意的。正如他在“if”语句中使用“=”这一事实并不意味着他不是指“==”。
    • 假设认为 table_id 的值将是整洁的自然数顺序,即使 OP 已明确指出。当已经发布了更好和更安全的解决方案时,您提出的解决方案可能是错误的。这就是我的 -1 的原因。
    • 请参考维基百科中的 YAGNI 和 Over-Engineering。
    【解决方案3】:

    使用Dictionary&lt;K,V&gt;,或多或少地使用伪代码

    var dic = new Dictionary<int, string> { {1, "PageBla.aspx"}, {2, "Page21231.aspx"}..}
    

    在代码之后:

     response.redirect(dic[id_table]);
    

    【讨论】:

      【解决方案4】:

      您可以使用Factory Design Pattern,它不会减少 ifs 语句,而是封装它。

      更新

      您可以将其他答案与此模式结合起来以获得编写良好的代码

      【讨论】:

        【解决方案5】:

        将链接保存在字典中:

            Dictionary<int, string> links = 
                new Dictionary<int, string>()
            {
                { 1, "One.aspx" },
                { 2, "Two.aspx" },
                { 3, "Three.aspx" }
            };
        

        并使用类似的:

            Response.Redirect(links[id_table]);
        

        【讨论】:

          【解决方案6】:

          另一种选择是将页面存储在表格中,选择要重定向到的页面。

          【讨论】:

            猜你喜欢
            • 2016-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-20
            • 1970-01-01
            相关资源
            最近更新 更多