クリーンコードのコツ:メソッドの引数は多すぎないようにしよう

クリーンコードのコツ:メソッドの引数は多すぎないようにしようのカバー画像

多くの場合、関数に引数をたくさん追加しがちです。しかし、それは最善の方法ではありません。逆に、関数が多すぎる引数を必要とする場合、それらを意味あるオブジェクトにまとめることが、よりシンプルなコードを書くのに役立ちます。

なぜですか?どうやってやるのですか?引数が多すぎることで起きる主な問題は何ですか?以下のスニペットを見てみましょう:

void SendPackage(
    string name, 
    string lastname, 
    string city, 
    string country,
    string packageId
    ) { }

フルスクリーンモードにする

もし住所や人物について別のフィールドを使う必要がある場合、新しいパラメータを追加して、新しい関数シグネチャに合わせて既存のメソッドをすべて更新する必要があります。

State 引数を追加したらどうなるでしょうか?これは住所の一部ですか(state = "Italy")それとも荷物に関連する何かですか(state = Damaged)?

このフィールドを正確なオブジェクトに保存することは、その意味を理解する助けになります。

void SendPackage(Person person, string packageId) { }

class Person { 
    public string Name { get; set; }
    public string LastName { get; set; }
    public Address Address {get; set;}
}

class Address { 
    public string City { get; set; }
    public string Country { get; set; }
}

フルスクリーンモードにする

パラメータをたくさん使わないもう一つの理由は何ですか?マージコンフリクトを避けるため

たとえば、アリスとボブという2人の開発者がSendPackageメソッドに影響する機能を開発しているとします。アリスは彼女のブランチで新しいパラメータbool withPriorityを追加しています。一方、ボブは彼のブランチでbool applyDiscountを追加しています。そして、アリスとボブはそれぞれのブランチをメインのものにマージします。結果はどうなるでしょうか?当然ながら、コンフリクトが発生します。なぜなら、そのメソッドは今、2つのbooleanパラメータを持ち、それらが最終結果にどの順序で追加されるかがトラブルの原因になり得るからです。さらに問題なのは、SendPackageメソッドの呼び出しが新しい(もしくは2つの)パラメータを持つため、その値は文脈に依存します。そのため、マージ後、ボブが定義したapplyDiscountパラメータの値が、アリスによって追加された値の代わりに使用されるかもしれません。

結論

要約すると、パラメータの数を減らす必要がある理由は何でしょうか?

  • パラメータに文脈と意味を与えるため
  • 位置によるパラメータのエラーを避けるため
  • マージコンフリクトを避けるため

👉 Twitter または下のコメント欄でこの話をしましょう!

🐧

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/bellonedavide/clean-code-tip-dont-use-too-many-method-arguments-41b