При определении API, доступного для клиента, предпочтительной отраслевой практикой является следующее:
a) Определение набора явных методов API, каждый из которых имеет очень узкое и конкретное назначение, например:
SetUserName <name>
SetUserAge <age>
SetUserAddress <address>
b) Определение набора из более обобщенных методов API, основанных на параметрах, например:
SetUserAttribute <attribute>
enum attribute {
name,
age,
address
}
Мое мнение:
В пользу (a)
Для логических методов (например, EnableFoo) я бы определенно предпочел вариант (а), поскольку намерения намного более ясны, в будущем для него менее вероятно потребуются расширения, и он сделает более читабельный код.
Например, метод с именем EnableDisableFoo, который принимает логический параметр, указывающий, следует ли включать или отключать, не очень понятен и не имеет связной цели.
Когда есть несколько вариантов, проблема усложняется.
В пользу (b)
Опция (b) - отличный способ обеспечить расширяемость в API, но за счет удобства использования. С опцией (a) само имя метода API дает достаточно информации, чтобы указать, что он делает. С опцией (b) пользователь должен найти и имя метода и соответствующее перечисление / параметр для использования. Теоретически это делает вариант (b) хуже с точки зрения удобства использования - но, возможно, использование меньшего количества методов - это хорошо, поэтому даже это не совсем верно.
Другие мысли
Необходимо соблюдать хороший баланс между удобством использования и расширяемостью, и они часто расходятся друг с другом. Но я хотел бы думать, что есть более объективный способ проанализировать это, нежели полагаться на мнение дизайнера API.
У кого-нибудь есть мысли по этому поводу?