我正在研究遗留软件系统,我的任务是将一些旧的COM组件迁移到.NET 3.5。 COM组件最初在MTS中托管,然后在组件服务中托管。在.NET端口中,我们使用ADO.NET事务处理事务,因此方法签名有所改变。
我面临的困境是参数顺序。每种方法都要求您传递SqlConnection或SqlTransaction(取决于方法是否更新数据库)。当然,有些方法可以用不同的参数调用。例如:
Keyword.Load(string description, SqlTransaction transaction)
- 或 -
Keyword.Load(string description, string tag, SqlTransaction transaction)
现在,框架中提供多个重载的大多数方法都如下所示:
A(int arg1)
A(int arg1, string arg2)
A(int arg1, string arg2, DateTime arg3)
值得注意的是,尽管存在重载,参数顺序仍然一致。但是,我真的想强调用户传递连接或事务的要求。通常,这些是指定的最后一个参数。但在我看来,放置它们的最佳位置是参数0:
A(SqlTransaction transaction)
A(SqlTransaction transaction, int arg1)
不幸的是,在这种情况下,在过载的声明中既没有连接也没有事务,并且为你创建一个:
// These overloads create a connection, open it, and start a new transaction.
A()
A(int arg1)
A(int arg1, string arg2)
A(int arg1, string arg2)
A(int arg1, string arg2, DateTime arg3)
// These overloads require that the transaction be passed in, so that the method
// can take part in it.
A(SqlTransaction transaction)
A(SqlTransaction transaction, int arg1)
A(SqlTransaction transaction, int arg1, string arg2)
A(SqlTransaction transaction, int arg1, string arg2, DateTime arg3)
正如您所看到的,它需要更多的重载才能使其正确,但对交易或连接的强调似乎对我来说更清楚。
如果你是我,你会选择什么样的路径?是否有设计指南规定应如何处理此类情况?是否需要处理过多的重载?
答案 0 :(得分:5)
直接来自框架设计指南:
在方法参数的排序和命名方面要保持一致。
编辑:
如果您不想遵循指南,我会将重载分解为单独的方法,如下所示:
A()
A(int arg1)
A(int arg1, string arg2)
A(int arg1, string arg2)
和
AWithTransaction(SqlTransaction transaction)
AWithTransaction(SqlTransaction transaction, int arg1)
AWithTransaction(SqlTransaction transaction, int arg1, string arg2)
AWithTransaction(
SqlTransaction transaction,
int arg1,
string arg2,
DateTime arg3
)
特别是,我会说
Keyword.Load(string description)
Keyword.Load(string description, string tag)
和
Keyword.LoadWithTransaction(SqlTransaction transaction, string description)
Keyword.LoadWithTransaction(
SqlTransaction transaction,
string description,
string tag
)