Mik*_*fer 3 .net parameters coding-style overloading
我正在研究遗留软件系统,我的任务是将一些旧的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)
正如您所看到的,它需要更多的重载才能使其正确,但对交易或连接的强调似乎对我来说更加清晰.
如果你是我,你会选择什么样的道路?是否有设计指南规定应如何处理此类情况?是否需要处理过多的重载?
直接来自框架设计指南:
在方法参数的排序和命名方面要保持一致.
编辑:
如果您不想遵循指南,我会将重载分解为单独的方法,如下所示:
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
)
| 归档时间: | 
 | 
| 查看次数: | 153 次 | 
| 最近记录: |