创建一次使用的变量是一种好习惯吗?

Edw*_*uay 22 variables refactoring coding-style

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

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);
}
Run Code Online (Sandbox Code Playgroud)

这段代码:

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));
}
Run Code Online (Sandbox Code Playgroud)

如果它只使用一次,你就不需要创建一个变量.

我的回答是,制作曾经使用过的变量是很好的做法,因为它:

  • 作为和减少评论(很清楚"userControlFullName"是什么)
  • 使代码更容易阅读,即更多的代码"读起来像英语"
  • 通过用明确的变量名替换部分语句来避免超长语句
  • 因为你可以将鼠标悬停在变量名上,所以更容易调试,例如在没有调试器的PHP编程的情况下,更容易回显这些变量名来获取它们的值

反对这种方式的论据"更多代码行","不必要的变量"是使编译器的生活更容易但没有显着的速度或资源节省的参数.

任何人都可以想到一个不应该创建曾经使用过的变量名的情况吗?

Hen*_*aul 30

在这种情况下,我是你的意见.可读性是关键.我确信编译器在两种情况下都会产生相同的可执行文件,编译器就像现在一样智能.

但我不会声称"总是使用曾经使用过的变量".例:

String name = "John";
person.setName(name);
Run Code Online (Sandbox Code Playgroud)

是不必要的,因为

person.setName("John");
Run Code Online (Sandbox Code Playgroud)

读得同样好 - 如果不是更好.但是,当然,并非所有案例都是明确的.毕竟,"可读性"是一个主观的术语.


Jon*_*eet 22

你的所有理由似乎都对我有用.

在某些情况下,您实际上必须避免使用中间变量,您需要单个表达式(例如,对于Java/C#中的成员变量初始化),但为了清晰起见,引入额外变量绝对可以适用.显然不要为每个方法的每个参数这样做,但是适度它可以帮助很多.

调试参数特别强大 - 能够跨越 "准备"方法的参数的行,并直接进入方法本身,在调试器中轻松查看参数也是非常好的.


小智 18

你的同事似乎不一致.

一致的解决方案如下所示:

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));
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*olm 6

我完全和你在一起.

如果一个方法需要大量的布尔值,我特别使用它

public void OpenDocument(string filename, bool asReadonly, bool copyLocal, bool somethingElse)
Run Code Online (Sandbox Code Playgroud)

对我来说,这更具可读性:

bool asReadonly = true;
bool copyLocal = false;
bool somethingElse = true;

OpenDocument("somefile.txt", asReadonly, copyLocal, somethingElse);
Run Code Online (Sandbox Code Playgroud)

..than:

OpenDocument("somefile.txt", true, false, true);
Run Code Online (Sandbox Code Playgroud)


kro*_*old 5

由于我使用的编程语言通常不会告诉我异常堆栈跟踪中什么为空,因此我通常尝试使用变量,以便每行不能有超过一个项目为空。实际上,我发现这是我想在一行中放置多少条语句的最重要的限制因素。

如果您从生产日志中得到此语句中的空指针异常,那么您真的有麻烦了:

getCustomer().getOrders().iterator().next().getItems().iterator().next().getProduct().getName()

尽管我同意您的想法,但添加额外的变量可能会在方法中引入额外的概念,并且该概念可能并不总是与方法的总体目标相关。因此,过多添加变量也会增加方法的复杂性并降低易读性。请注意此处“excess”的用法。