我想知道您对我持观望态度的编码风格问题的看法。我知道可能没有明确的答案,但我想看看是否存在对一个方向或另一个方向的强烈偏好。
我正在研究一个在很多地方添加 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。
我的 neatnik 想把它改成:
{
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();
...
}
出于某种原因,我觉得这样做有点脏。你认为这不好吗?如果你认为这很糟糕,为什么?如果它很好,为什么?
编辑:请注意,这只是众多示例中的一个(有点人为的)示例。请不要固执于这样一个事实,即这恰好表明一个记录器类的接口(interface)考虑不周。这与我的问题无关,而且我无权自行改进类(class)。
最佳答案
他们两个都很可怕。两者都不做。
你在这里制作了我称之为“high maintenance class”的东西。高维护类有一个契约(Contract),上面写着“我要求你给我一堆资源,你必须知道我什么时候用完它们并适本地清理它们”。这个契约意味着类的用户必须知道类是如何实现的,从而违反了最初激发创建类的封装和抽象原则。
您可以通过您的评论来判断:这是使用连接的地方,我知道不会再次使用该连接。你怎么知道?你只知道如果那是类的记录契约(Contract)。这不是一个强加给类消费者的好契约。
一些改进方法:
1) 使记录器成为一次性的。完成后让它清理连接。不利的一面是记录器保持连接的时间超过了必要的时间。
2) 使 InsertData 将连接作为参数。调用者仍然可以负责清理连接,因为记录器没有保留它。
3) 创建第三类“Inserter”,它是一次性的,并在其构造函数中获取日志和连接。插入器在处理时处理连接;然后调用者负责处理插入器。
关于c# - 关于 C# "using"语句的样式/可读性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2878565/