自动重构代码以避免无参数构造函数

时间:2013-06-17 13:51:06

标签: c# refactoring immutability automated-refactoring

我有一个具有无参数构造函数的类,我想删除(或私有)

class C
{
    string A { get; set; }
    int B { get; set; }
    public C() { }    //Problem
    public C(A a, B b)
    {
        A = a;
        B = b;
    }
}

问题是,代码库中充斥着数百种表达式,例如new C {A = a, B = b}new C() { B = b, A = a },在每种可能的变体,字段排序等方面(我不知道括号)是可选的,直到今天)。 是否有任何自动修复代码以使用2参数构造函数的方法?这些变化是微不足道的,但我想如果必须手动完成,我会疯了。 我的例子有5个或6个参数,并不是所有都是必需的等等。

(动机是使类不可变。隐藏无参数构造函数和公共setter是第一步)

我在正则表达式上取得了一些成功(Notepad ++的正则表达式支持似乎在4次捕获后停止),但是编写一个复杂的正则表达式来一次修复6个项目实际上并没有给我带来太大的帮助。 / p>

3 个答案:

答案 0 :(得分:1)

您可以使用在函数调用中显式指定named arguments的功能(包括构造函数)来轻松修复此

具体来说,您可以替换

 C() { B = b, A = a }

 C(B: b, A: a)

并且构造函数将正常运行。无论参数的顺序如何,这都可以工作,只要它们都是指定的或可选的。


您可以尝试完全不同的方法:

完全按照C的要求做。然后创建一个CBuilder类,它具有与C相同的所有属性,但只有一个方法:

public C Convert()
{
   return new C(this.A, this.B);
}

然后,您只需要在new C() {...};上执行查找/替换并将其更改为(new CBuilder() {...}).Convert();,这将是单个正则表达式替换。

这并没有立即解决问题,但它确实允许您自由重构,并且您可以制定每次使用CBuilder的内容时制定的策略,您用C代替该实例。渐渐地,您将重构所有代码,但它不会阻止您前进。

答案 1 :(得分:0)

建议:也许你可以使用命名参数。

新C {A = 5,B =“tt”}最终​​相当于新C(A:5,B:“tt”)

所以你可以将所有出现的“A =”替换成“A:”和“B =”变成“B:” 将A暂时重命名为NewNameForANotCollidingWithAnything可以更容易,这样您就可以进行大规模的盲目自动化和安全替换。

然后将“new C {...}”替换为新的“C(...)”//这是最困难的部分(我没试过)

希望它能让你更接近你所需要的......

答案 2 :(得分:-1)

完全删除无参数构造函数。编译器将在其所有用途上失败,您可以切换到使用2参数版本。