有什么理由不重构它,让它更简单
本文关键字:更简单 重构 什么 理由 | 更新日期: 2023-09-27 18:32:05
>我在遗留代码库中遇到了这个问题:
string[] deptNo = UPC.getDept().Split(new Char[] {'.'});
。并认为这会更直接:
string[] deptNo = UPC.getDept().Split('.');
。但是,如果点的表征有可能造成一些"魔术",如果我进行此更改,将导致整个意大利面条屋滑落,则不想更改它。
更新
针对给出的警告:是的,我知道你的意思是,在吃多年的意大利面时需要非常谨慎。对此代码的一个看似无害的更改:
private void comboVendor_SelectedValueChanged(object sender, EventArgs e)
{
try
{
if ((comboVendor.SelectedIndex >= 0) && (cmbVendor.Text != comboVendor.Text))
{
string t = comboVendor.Text;
t = t.Substring(0,maxVendorChar);
t = t.Substring(0,substrLen);
t = t.Trim();
cmbVendor.Text = t;
cmbVendor.Focus();
}
}
catch (Exception ex)
{
Duckbill.ExceptionHandler(ex, "frmInv.comboVendor.SelectedValueChanged");
}
}
。即,将"Trim()"附加到"的实例中。文本",导致错误消息"指定的参数超出有效值的范围",因为"maxVendorChar"不大于被子字符串的字符串的值。所以我不得不将其更改为此以使其工作:
private void comboVendor_SelectedValueChanged(object sender, EventArgs e)
{
int substrLen;
try
{
if ((comboVendor.SelectedIndex >= 0) && (cmbVendor.Text.Trim() != comboVendor.Text.Trim()))
{
string t = comboVendor.Text.Trim();
substrLen = GetLowerInt(t.Length, maxVendorChar);
t = t.Substring(0,substrLen);
t = t.Trim();
cmbVendor.Text = t;
cmbVendor.Focus();
}
}
catch (Exception ex)
{
Platypus.ExceptionHandler(ex, "frmInv.comboVendor.SelectedValueChanged");
}
}
private int GetLowerInt(int first, int second)
{
return first < second ? first : second;
}
在远处,我听到一只乌鸦在呱呱叫"永远",但我不确定他在说什么。
更新 2
每当人们注意到这个项目有多滑时,他们几乎总是建议我重构它;然而,如上所述,有时一点重构会引发一系列震耳欲聋的爆炸声,让我希望我一个人呆得够多了。真正的解决方案是完全重写这个项目,使用更好的方法和至少不太古老的技术。这就是我的愿景;不过,就目前而言,维护模式似乎是当务之急。
如果您正在处理"一个大泥球",那么最好不要管(假设它的行为正确)。
取决于你在寻找的是哲学原因还是技术原因。
没有技术原因。没有魔法,两种说法是一样的。split 的方法参数使用 params 关键字来允许可变数量的参数语法:
public string[] Split(params char[] separator)
有关将 params 关键字添加到方法参数的目的,请参阅此讨论:为什么使用 params 关键字?
从哲学上讲,重构它可能没有任何真正的好处。作为一般规则,您可能不想仅仅因为可以就清理,尤其是在没有测试的情况下。
听起来你需要一些单元测试来让你对重构的代码有信心。最佳做法是在重构之前添加它们。
我们看不到Split()
方法的方法签名,但如果它使用 varargs,那么您的重构在理论上是安全的。
假设getDept()
返回一个字符串,第一种方法的优点是更容易包含新字符作为拆分器。您只需将它们添加到 char 数组中即可。第二种方法修复分隔字符。在第二种方法中,'." 也是一个字符,不像 ".",它是一个字符串。如果该方法getDept()
返回一个具有 Split(char[] splitters)
方法的自定义类,除非该方法的重载为 Split(char splitter)
,否则您将遇到麻烦。在一个完全不相关但很重要的一点上,实现版本控制系统可能是一个好主意,这样当某些事情失败时,你可以"重新滚动"更改(即返回到以前的"提交")。
我认为重构此代码没有任何价值,因为我在这里看不到这项工作的任何附加值。
此外,我也会保留当前代码,因为它允许我在将来添加更多分隔符。