在我的程序的顶部,我有一个看起来像这样的代码段
var XXXAssembler = new XXXAssembler(ctx);
XXXAssembler.LoadXXX();
var YYYAssembler = new YYYAssembler(ctx );
YYYAssembler.LoadYYY();
var ZZZAssembler = new ZZZAssembler(ctx);
ZZZAssembler.LoadZZZ();
在上面的逻辑中,我使用每个变量一次来调用相应的加载器,我不在其他任何地方使用变量。
我可以将代码更改为此
new XXXAssembler(ctx).LoadXXX();
new YYYAssembler(ctx ).LoadYYY();
new ZZZAssembler(ctx).LoadZZZ();
这减少了代码的大小,但我想也认为它简化了代码。我可以看到变量用于调试的有用性,但我不认为这是一个很好的理由。其他人可能不同意。
不可变版本是否被视为不良编码风格?
答案 0 :(得分:8)
除非您打算使用分配给Assembler变量的对象,否则不需要它。
我会说摆脱它,清理代码,然后如果你需要它,你可以把它带回来。
答案 1 :(得分:3)
new XXXAssembler(ctx).LoadXXX();
绝对没问题,只要你没有使用其他地方new XXXAssembler(ctx)
返回的引用。
答案 2 :(得分:3)
如果你问我,代码的大小并不重要。唯一的问题是,当你在1年后看到代码时,要知道它是如何做它需要做的,以及如何重写/重用/等。
答案 3 :(得分:2)
正如您所提到的,将创建的对象分配给变量的唯一技术原因是您需要使用它或在某处查看它。如果您确信自己永远不需要这样做,则无需创建新变量,并且可以稍微缩短代码。
但我会提出两个警告:
(1)我经常发现我需要在返回之前查看方法的输出,或者在我调试时查看由新语句创建的对象的实例。所以有时候不要这样做:
public MyObject ReturnSomeObject()
{
return new MyObject();
}
我会这样做:
public MyObject ReturnSomeObject()
{
var myObject = new MyObject();
return myObject;
}
我可以在调试器中查看它。它使我的代码变得混乱,但是当我试图弄清楚为什么会出现其他问题时它会非常有用。
(2)如果你发现你可以经常做你正在描述的那种事情,你可能想要更难看一下你的课程的结构。一个类有一个方法可以返回任何内容并且不会以任何你感兴趣的方式修改类的内部状态,这有什么意义呢?举个例子,假设您的各种LoadXXX()方法应该返回某种状态代码,或者修改对象的某些状态属性,或者返回指向它们加载的文件的指针,或者, something < / em>的。如果他们这样做,但你不打算去看它 - 好吧,这是另一个问题。如果这些方法确实不需要修改对象内部状态的任何方面,那么你应该强烈地看待它们是静态的:它允许你每次调用它时都避免运行类构造函数,它更清楚地表达了它们的意图,如果你做决定他们需要在将来某个时候修改对象状态,它允许编译器通知你可能的不一致。
这里没有什么比这更难的,只是一些准则。
答案 4 :(得分:0)
如果你再也不打算使用Object了,但对于这种情况,我没有看到给它们命名的重点。它为你的代码添加了不必要的混乱线条。
答案 5 :(得分:0)
我认为不分配变量就好了。我在很多情况下这样做,例如对于某些单元测试模拟new Mock<IInterfaceToMock>.Object
或回调函数SomeFunctionAcceptingCallback(args, new CallbackHandler())
。