7

我想知道您对我持保留态度的编码风格问题的看法。我意识到可能没有明确的答案,但我想看看在一个方向或另一个方向上是否有强烈的偏好。

我正在经历一个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
}

其中 log.Connection 是一个 OracleConnection,它实现了 IDisposable。

我内心的整洁想将其更改为:

{
    using (OracleConnection connection = new OracleConnection("..."))
    {
        log = new log();
        log.SomeProperty = something;
        log.Connection = conn;
        log.InsertData();
        ...
    }
}

但是喜欢简洁和快速完成工作的人想要这样做:

{
    log = new log();
    log.SomeProperty = something; 
    using (log.Connection = new OracleConnection("..."))
        log.InsertData();
    ...
}

出于某种原因,我觉得这样做有点脏。你认为这很糟糕吗?如果你认为这很糟糕,为什么?如果很好,为什么?

编辑:请注意,这只是众多例子中的一个(有点做作)。请不要拘泥于这样一个事实,即这恰好表明一个记录器类具有一个经过深思熟虑的接口。这与我的问题无关,无论如何我也无权改进课程本身。

4

5 回答 5

5

他们都很可怕。两者都不做。

你在这里做我所说的“高维护课程”。高级维护班有一份合同,上面写着“我需要你给我一堆资源,你需要知道我什么时候用完它们并适当地清理它们”。这种契约意味着类的用户必须知道类是如何实现的,从而违反了最初激发创建类的封装和抽象原则。

您可以通过您的评论来说明这一点:这是使用连接的地方,我知道不会再次使用连接。你怎么知道?你只知道那是类的书面合同。这不是一个强加给一个类的消费者的好合同。

一些使之变得更好的方法:

1) 使记录器成为一次性的。完成后让它清理连接。不利的一面是记录器保持连接的时间超过了必要的时间。

2) 使 InsertData 将连接作为参数。调用者仍然可以负责清理连接,因为记录器不会保留它。

3)制作第三类“插入器”,它是一次性的,并在其构造函数中获取日志和连接。插入器在处理连接时处理连接;然后调用者负责处理插入器。

于 2010-05-20T23:25:35.237 回答
2

我会听听你的整洁。我个人更喜欢他的方式。

于 2010-05-20T23:25:26.543 回答
2

我同意理想情况下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();
    ...
}
于 2010-05-20T23:33:52.403 回答
1

两种使用方式using是完全等价的。无论哪种方式,您最终都会得到一个仍在范围内但已释放连接的日志。最好将日志设为一次性并让其 dispose 方法处理其连接,将日志放在 using 语句中,而不是连接本身。

于 2010-05-20T23:28:24.600 回答
0

如果log实现 IDisposable,则做第二个选择,因为大括号是显式的。在某些情况下,您可以使用多个using语句:

using (Graphics g = ...)
using (Pen p = new Pen ...)
using (Font f = new Font ...)
{



}

您只需使用一套牙套就可以摆脱困境。这避免了疯狂的缩进。

于 2010-05-20T23:27:53.250 回答