Igb*_*man 7 c# coding-style using-statement
我想知道你对我所涉及的编码风格问题的看法.我意识到可能没有明确的答案,但我想看看在一个方向或另一个方向是否有强烈的偏好.
我正在通过一个解决方案using在很多地方添加语句.我常常会遇到这样的事情:
{
log = new log();
log.SomeProperty = something; // several of these
log.Connection = new OracleConnection("...");
log.InsertData(); // this is where log.Connection will be used
... // do other stuff with log, but connection won't be used again
}
Run Code Online (Sandbox Code Playgroud)
其中log.Connection是OracleConnection,它实现了IDisposable.
在我的neatnik想要改变它:
{
using (OracleConnection connection = new OracleConnection("..."))
{
log = new log();
log.SomeProperty = something;
log.Connection = conn;
log.InsertData();
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,简洁的爱好者和稍微快速完成工作的人希望这样做:
{
log = new log();
log.SomeProperty = something;
using (log.Connection = new OracleConnection("..."))
log.InsertData();
...
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我觉得这样做有点脏.你认为这不好吗?如果你认为这很糟糕,为什么?如果它很好,为什么?
编辑:请注意,这只是一个(有点人为)的例子.请不要注意这一事实表明记录器类具有经过深思熟虑的界面.这与我的问题无关,无论如何我都无法自己改进课程.
他们都很可怕.他们两个都不做.
你在这里做我称之为" 高维护级 "的东西.高维护级别的合同中写道:"我要求你给我一大堆资源,你需要知道我什么时候完成它们并适当地清理它们".这个契约意味着该类的用户必须知道该类是如何实现的,从而违反了封装和抽象的原则,这种原则首先激发了创建一个类.
您可以通过评论告诉我:这是连接的使用位置,我知道连接不会再次使用.你怎么知道?您只知道如果这是该类的合同.这不是强加给班级消费者的好合同.
一些方法可以使这更好:
1)使记录器一次性使用.完成连接后清理连接.这样做的缺点是记录器保持连接的时间超过了必要的时间.
2)使InsertData将连接作为参数.调用者仍然可以负责清理连接,因为记录器没有保持连接.
3)制作第三类"插入器",它是一次性的,并在其构造函数中记录日志和连接.插入器在处理时处理连接; 然后呼叫者负责处理插入器.
我同意理想情况下log它本身应该实现IDisposable,但我们假设这是不可能的,并解决OP实际提出的问题。
第二种方法更好,因为它可以用更少的代码来完成同样的事情。在这里引入额外的变量没有任何好处connection。
另请注意,您可以在块之外进行其他初始化using。这在这里并不重要,但如果您“使用”一些非常昂贵的资源,则可能很重要。那是:
log = new log();
log.SomeProperty = something; // This can be outside the "using"
using (OracleConnection connection = new OracleConnection("..."))
{
log.Connection = conn;
log.InsertData();
...
}
Run Code Online (Sandbox Code Playgroud)