推荐的参数顺序

时间:2011-01-24 14:27:36

标签: .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)

正如您所看到的,它需要更多的重载才能使其正确,但对交易或连接的强调似乎对我来说更清楚。

如果你是我,你会选择什么样的路径?是否有设计指南规定应如何处理此类情况?是否需要处理过多的重载?

1 个答案:

答案 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
)