Рекомендуемый порядок параметров - PullRequest
3 голосов
/ 24 января 2011

Я работаю над устаревшей системой программного обеспечения, и мне было поручено перенести некоторые старые компоненты COM в .NET 3.5. Компоненты COM изначально размещались в MTS, затем в Component Services. В порту .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 Ответ

5 голосов
/ 24 января 2011

Прямо из Руководства по проектированию платформы:

Будьте последовательны в порядке и именах параметров метода.

Редактировать:

Если выне хочу следовать указаниям, я бы разбил перегрузки на отдельные методы, например, так:

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
)
...