我的一位同事重构了这段代码:
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编程的情况下,更容易回显这些变量名来获取它们的值
反对这种方式的论据"更多代码行","不必要的变量"是使编译器的生活更容易但没有显着的速度或资源节省的参数.
任何人都可以想到一个不应该创建曾经使用过的变量名的情况吗?
在这种情况下,我是你的意见.可读性是关键.我确信编译器在两种情况下都会产生相同的可执行文件,编译器就像现在一样智能.
但我不会声称"总是使用曾经使用过的变量".例:
String name = "John"; person.setName(name);
是不必要的,因为
person.setName("John");
读得同样好 - 如果不是更好.但是,当然,并非所有案例都是明确的.毕竟,"可读性"是一个主观的术语.
你的所有理由似乎都对我有用.
在某些情况下,您实际上必须避免使用中间变量,您需要单个表达式(例如,对于Java/C#中的成员变量初始化),但为了清晰起见,引入额外变量绝对可以适用.显然不要为每个方法的每个参数都这样做,但是适度它可以帮助很多.
调试参数特别强大 - 能够跨越 "准备"方法的参数的行,并直接进入方法本身,在调试器中轻松查看参数也是非常好的.
你的同事似乎不一致.
一致的解决方案如下所示:
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)); }
我完全和你在一起.
如果一个方法需要大量的布尔值,我特别使用它
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);
..than:
OpenDocument("somefile.txt", true, false, true);