代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

创建一次使用的变量是好的做法吗?

  •  26
  • Edward Tanguay  · 技术社区  · 16 年前

    我的一位同事重构了这段代码:

    private void btnGeneral_Click(object sender, RoutedEventArgs e)
    {
        Button button = (Button)e.OriginalSource;
        Type type = this.GetType();
        Assembly assembly = type.Assembly;
        string userControlFullName = String.Format("{0}.{1}", type.Namespace, button.Name);
        UserControl userControl = (UserControl)assembly.CreateInstance(userControlFullName);
    }
    

    对于此代码:

    private void btnGeneral_Click(object sender, RoutedEventArgs e)
    {
        Button button = (Button)e.OriginalSource;
        Type type = this.GetType();
        Assembly assembly = type.Assembly;
        UserControl userControl = (UserControl)assembly.CreateInstance(String.Format("{0}.{1}", type.Namespace, button.Name));
    }
    

    • 用作注释并减少注释(很明显“userControlFullName”是什么)
    • 使代码更容易阅读,即更多的代码“读起来像英语”
    • 通过将超长语句的部分替换为清晰的变量名来避免超长语句
    • 更容易调试,因为您可以将鼠标悬停在变量名上,并且在没有调试器的PHP编程的情况下,更容易回显这些变量名以获取其值

    反对这种方式的论点是“更多的代码行”、“不必要的变量”,这些论点是为了使编译器的工作更轻松,但没有显著的速度或资源节约。

    14 回复  |  直到 15 年前
        1
  •  34
  •   Henrik Paul    16 年前

    我同意你对这个案子的看法。可读性是关键。我确信编译器在这两种情况下都会生成相同的可执行文件,编译器和今天一样智能。

    但我也不会声称“总是使用一次使用的变量”。例子:

    String name = "John";
    person.setName(name);
    

    没有必要,因为

    person.setName("John");
    

    读起来同样好——如果不是更好的话。但是,当然,并非所有案件都如此明确。毕竟,“可读性”是一个主观术语。

        2
  •  24
  •   Jon Skeet    16 年前

    你所有的理由在我看来都是合理的。

    为了避免使用中间变量,在需要单个表达式的情况下(例如Java/C#中的成员变量初始化),但在适用的情况下引入额外的变量以提高清晰度是绝对可以的。显然,不要这样做 论证到 方法,但适度会有很大帮助。

        3
  •  19
  •   Edward Tanguay    16 年前

    你的同事似乎不一致。

    private void btnGeneral_Click(object sender, RoutedEventArgs e)
    {
        UserControl userControl = ((UserControl)type.Assembly).CreateInstance(String.Format("{0}.{1}", this.GetType().Namespace, ((Button)e.OriginalSource).Name));
    }
    
        4
  •  6
  •   Peter Lindholm    16 年前

    在这件事上,我完全同意你的观点。

    public void OpenDocument(string filename, bool asReadonly, bool copyLocal, bool somethingElse)
    

    bool asReadonly = true;
    bool copyLocal = false;
    bool somethingElse = true;
    
    OpenDocument("somefile.txt", asReadonly, copyLocal, somethingElse);
    

    OpenDocument("somefile.txt", true, false, true);
    
        5
  •  5
  •   krosenvold    16 年前

    什么

    虽然我同意你的想法,但添加额外的变量可以在方法中引入额外的概念,而这个概念可能并不总是与方法的总体目标相关。因此,过度添加变量也可能 增加 方法复杂性和易读性降低。注意以下用法 过度 在这里。

        6
  •  3
  •   tehvan    16 年前

    我想在某些情况下,它可能会对性能产生影响。特别是在这个例子中:

    for (int i1 = 0; i1 < BIG_NR; i1++)
    {
      for (int i2 = 0; i2 < BIG_NR; i2++)
      {
        for (int i3 = 0; i3 < BIG_NR; i3++)
        {
          for (int i4 = 0; i4 < BIG_NR; i4++)
          {
            int amount = a + b;
            someVar[i1][i2][i3][i4] = amount;
          }
        }
      }
    }
    

        7
  •  2
  •   Fabian Vilers    16 年前

        8
  •  2
  •   Brock Woolf    16 年前

    我认为这是一个基于你希望你的代码有多整洁的判断。我也认为你和你的同事都是正确的。

    在这种情况下,我会根据您提供的代码(出于性能原因)支持您的同事,但正如我之前所说,这确实取决于使用它的环境,我认为您的立场是完全可以接受的。

    我想指出的是,为曾经使用过的参数创建变量可能毫无意义,除非它们是常量变量或需要在许多地方使用的东西。

        9
  •  2
  •   Greg M Greg M    16 年前

    创建一个新变量意味着读者还需要了解一个概念。(考虑极端情况:int b=a;c=b;)如果一个方法非常复杂——需要分解——那么额外的概念是值得付出的代价,那么你应该全力以赴,把它分成两个方法。通过这种方式,您可以获得有意义的名称和较小的尺寸。(对于你的原始方法来说,它更小:如果就像你说的那样,那么人们通常不需要阅读辅助方法。)

    这是一种概括,特别是在一种有很多添加新方法的样板的语言中,但你不会经常不同意这种概括,以至于值得在你的风格指南中省略。

        10
  •  2
  •   Michael Borgwardt    16 年前

    原则上我完全赞同你的同事,但在这种情况下我不同意。

        11
  •  1
  •   Dan Byström    16 年前

    如果变量被使用了多次。因此,您将立即让眼睛向下扫描代码,看看它是否在更多地方使用。函数越长,你就越需要查看是否能找到它。

        12
  •  0
  •   Hao Wooi Lim    16 年前

    我过去就是这么编码的。如今,我试图尽量减少中间变量。如果中间变量是不可变的,那么使用它是完全可以的。

        13
  •  0
  •   Tristan Warner-Smith    16 年前

    List<string> someStrings = new List<string>();
    for (int i = 0; i < 1000; i++)
    {
        string localString = string.Format("prefix{0}", i);
        someStrings.Add(localString);
    }
    

    而不是:

    List<string> someStrings = new List<string>();
    string localString = string.Empty;
    for (int i = 0; i < 1000; i++)
    {
        localString = string.Format("prefix{0}", i);
        someStrings.Add(localString);
    }
    

    因此,在许多情况下,真的没有性能上的理由不使用它。

        14
  •  -1
  •   Karl    16 年前

    同意

    “使代码更容易阅读,也就是说,你的代码中有更多“读起来像英语”

    卡尔