2

2つのボタンがあり、それぞれが2つの異なる実装(選択されているかどうかに関係なく)を実行できるため、合計で4つの可能な実装になります。すべてをコーディングした後、実装ごとに20行以上のコードがあり、それぞれで1つまたは2つの変数しか異なっていないことに気付きました。これをクリーンアップして、各実装で個別の小さなメソッドを呼び出し、一貫性のない変数をパラメーターとして渡すことにしました。

コードを再利用しているので、これがより良い方法だと思います。ただし、私のメソッドの1つでは、5つの異なる引数を渡す必要があり、正しい条件でメソッドを実装します。

メソッドにこれだけ多くのパラメーターを含めることは悪い習慣ですか?

4

6 に答える 6

3

多くのパラメータを持つことは必ずしも悪いことではありません。

クラスを作成して、すべてのパラメーターを 1 つのオブジェクトにグループ化するパターンがあります。もう 1 つの方法は、すべてのパラメーターを 1 つの構成パラメーターとしてディクショナリーを使用することです。一部の Apples クラスはこれを行います (たとえば、ナビゲーション バーのタイトル フォントの構成)。

個人的には、コードの繰り返しは、多数のメソッドが互いに呼び出し、複数のパラメーターを持つよりも悪いと思います。

于 2012-06-20T17:24:53.377 に答える
2

重複する行をたくさん削除できるのであれば、この方法で問題はないと思います。1行または2行を削除する場合は、努力する価値がない可能性があります。

実際、必要な数の引数を渡すことができます。達成することを行う他の方法があるかもしれませんが、コードがなければ、5つの引数は一見有効に見えます。

于 2012-06-20T17:23:43.107 に答える
2

免責事項: 私は目的 c について zilch を知っています

問題のコードを見ずに言うのは難しく、あなたが何をしているかに完全に依存します. 5 つのパラメーターを持つメソッドを最初から使用するのは悪い習慣であると言うのは、少し推測に過ぎませんが、メソッドのパラメーターの数をできるだけ少なくすることは確かに良い習慣です。

このメソッドが内部の「ヘルパー」メソッドのように聞こえる (API の公開されたコンポーネントではない) という事実は、他の方法よりも余裕を与えますが、通常、メソッドがパラメータの難解な組み合わせに基づいて、さまざまなことを行っています。

冗長なコードを作成しないと再構築できないほど長いシグネチャを持つメソッドに出くわした場合、私は通常、次のいずれかを行います。

  • 攻撃的な方法をいくつかのより簡潔な方法でラップします。例として、「実装」ごとにメソッドを作成し、その目的に必要な引数のみを受け入れる目的を示す適切な名前を付けることができます。次に、内部のより臭いメソッドに委譲します。臭いメソッドは、コード全体に散在するのではなく、「実装固有の」ラッパーでのみ使用されます。代わりに適切な名前のラッパーを使用すると、開発者はパラメーターの意味を解読しなくても意図を理解できます。

  • メソッドが必要とするデータをカプセル化するクラスを作成します。メソッドの動作がシステムまたはサブシステムの状態に依存する場合は、その状態をカプセル化してください。私はこれを「XXContext」型クラスでよく行います。これで、メソッドはこのコンテキスト データを検査および分析し、適切なアクションを実行できます。これはリファクタリングにも適しています。将来、メソッドがそのタスクを達成したり、新しい機能を実装したりするためにさらに多くの情報を必要とする場合は、メソッドを使用するすべてのコードを変更する代わりに、このデータを引数オブジェクトに追加できます。変更を利用する必要があるコードのみが、コンテキスト データに適切な値を提供する必要があります。

于 2012-06-20T17:48:54.630 に答える
2

一般的に「悪い習慣」である特定の数のパラメーターはありません。メソッドには、必要な数のパラメーターが必要です。とはいえ、パラメーターの数が多いということは、より良い設計が可能である可能性があることを示している場合があります。たとえば、オブジェクトが毎回メソッドに値を渡すのではなく、メンバー変数の値を追跡する必要があることに気付く場合があります。

于 2012-06-20T17:25:05.627 に答える
2

Objective-Cのデフォルトメソッドの中には、次のような4つのパラメータも持っているものがあるため、5つのパラメータを使用しても問題ないと思います

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(updateConvMenu:)
                                 notificationName:@"NSConvertersChanged" 
                                           object:converterArray];

より明確にするために私たちができることは、コードにより良いフォーマットを与えることです

于 2012-06-20T17:26:35.977 に答える
1

これは、明確に答えるのが本当に難しい主観的な質問の1つです。

Objective Cメソッドのパラメーターの数は気にしません。呼び出されているAPIをより明確にすることができるからです(そして、パラメーターは素晴らしく、タイプセーフでもあります)。

これらの多くの関数を少数の関数(または他のすべての関数から呼び出される「基本」関数)にまとめることができれば、それはおそらく、よりわかりやすく、読みやすいコードになります。さらに、その「基本」関数を更新すると、機能の変更は、アクションを呼び出すすべての方法で検出されます(もちろん、これは良いことでも悪いことでもあります)。

于 2012-06-20T17:23:17.810 に答える