最近、私は自分のAPIを開発しており、そのAPI設計への投資に興味を持ち、API設計を改善する方法に強い関心を持っています。
数回登場した側面の1つは(私のAPIのユーザーによるものではなく、トピックに関する私の観察中の議論による)です。
たとえば、談話レポについてはGitHubでのこの議論を参照してください。
foo.update_pinned(true, true);
(パラメータ名、ドキュメントなどを知らずに)コードを見るだけでは、何をしようとしているのか推測できません。2番目の引数はどういう意味ですか?推奨される改善策は、次のようなものにすることです。
foo.pin()
foo.unpin()
foo.pin_globally()
そして、それは物事を明確にします(2番目の引数はfooをグローバルに固定するかどうかでした、私は推測しています)、この場合、後者は確かに改善されることに同意します。
ただし、コードを見ただけでは何をしているのかわからない場合でも、異なるが論理的に関連する状態を設定するメソッドが、個別のメソッド呼び出しではなく、1つのメソッド呼び出しとしてより適切に公開される場合があると思います。(したがって、パラメータ名とドキュメントを調べて調べる必要があります-個人的には、APIに不慣れな場合は常に何をしてもかまいません)。
たとえばSetVisibility(bool, string, bool)
、FalconPeerで 1つのメソッドを公開し、次の行を確認するだけです。
falconPeer.SetVisibility(true, "aerw3", true);
あなたはそれが何をしているのか分からないでしょう。falconPeer
論理的な意味での「可視性」を制御する3つの異なる値を設定しています。パスワードのみで参加要求を受け入れ、検出要求に応答します。これを3つのメソッド呼び出しに分割すると、APIのユーザーは、「可視性」のすべての側面を設定するために1つのメソッドを公開するだけで他のユーザーに設定を忘れさせる「可視性」の側面を設定することになります。さらに、ユーザーが1つのアスペクトを変更する場合、ほとんどの場合、別のアスペクトを変更する必要があり、1回の呼び出しで変更できます。
setSize(10, 20)
のように読みやすいではありませんsetSize(width=10, height=20)
かrandom(distribution='gaussian', mean=0.5, deviation=1)
。彼らは強制という名前のパラメータのブール値を持つ言語では、列挙型/名前付き定数を使用したとまったく同じ情報量を伝えることができることが可能なAPIで良いです。
update
方法で多くの設定をグループ化できますfoo.update(pinned=true, globally=true)
。または:foo.update_pinned(true, globally=true)
。したがって、あなたの質問への答えは言語機能も考慮に入れるべきです。言語Xの優れたAPIは言語Yには向かないかもしれませんし、逆もまた同様です。