1

次のクラスを検討してください。

public class Person
{
    public String FirstName;
    public String LastName;
    public DateTime DateOfBirth;
    public StaffType PersonType;
}

そして、次の 2 つのメソッドとメソッド呼び出し:

public void DoSomethingWithPersonType(Person person)
{
    TestMethod(person.PersonType);
}

(によって呼び出されDoSomethingWithPersonType(person);ます)

public void DoSomethingWithPersonType(StaffType personType)
{
    TestMethod(personType)
}

(によって呼び出されDoSomethingPersonType(person.PersonType);ます)。

どちらの方法がより効率的ですか? どちらもお互いに「効率的」ですか? とにかく渡された参照は1つだけなので、違いはありませんか? または、渡された参照が何らかの形で異なりますか?

私が質問する理由は、現在のプロジェクトで最初のメソッド シグネチャを選択したためです。また、後で「人」の他のフィールドを使用する必要が生じる可能性があるため、それを実行しました。したがって、より簡単にスケーラブル/適応可能な方法は私が持っているものです-しかし、それはより高価なものですか?

編集: 注 - 言うまでもなく、これらの違いはごくわずかです。そうでなければ、パフォーマンスへの影響が私が行動するのに十分明らかであるシナリオに既に遭遇していたでしょう。それは単に好奇心の問題です。

4

5 に答える 5

8

パフォーマンスに関しては、それらは同一になります。どちらの場合も、単一の参照 (パフォーマンス コストは同じ) を渡し、どちらの場合もPersonType、フィールドの 1 つからオブジェクトを取得しています。

ここでの唯一の違いは、コードの可読性/保守性などの点です。一般に、メソッドは必要な情報のみを受け入れることが最善です。のみが必要な場合はPersonType、 のみを受け入れますPersonType。その方法をより柔軟に使用することができます。( a 以外に aPersonがあるPersonType場合はどうなりますか?) 実際には、 a を受け入れるよりも person タイプ以外のものが必要になると思わPersonれる場合は、適切な場合があります。

また、ここに違いがあるとしても、それは間違いなく小さいことに注意してください. 実行にどれだけの費用がかかるかという点で、細かいことまで考えるべきではありません。最近のコンピューターは高速です。貧弱なアルゴリズムでさえ、実際に実行するのにほとんど時間がかからない傾向があります (人間の観点から)。プログラムの実行に必要以上に時間がかかるようになった場合は、改善点を探し始めます。プロセッサ時間のかなりの割合を占めるコードの領域 (プロファイラーで識別) に注目する必要があります。ネットワーク通信 (データベース呼び出しを含む)、およびその他の IO は、最適化の対象として適している傾向があります。

また、パブリック フィールドを持つことは一般的に悪い習慣と見なされていることにも注意してください。少なくとも、代わりにパブリック プロパティを使用する必要があります。

于 2012-10-04T16:10:58.390 に答える
2

の種類によって多少異なりますStaffTypeが、通常、パフォーマンスの違いはごくわずかです。

クラスの場合StaffType、どちらも参照であるため、違いはありません。の場合は、参照よりも値enumを渡す方がわずかに高速です。StaffType

(StaffTypeが大きい場合struct、通過が遅くなりますが、実際の問題は、struct使用方法ではなく、設計が不適切です。)

したがって、最も意味のあるものを使用する必要があります。通常は、メソッドが実際に何を使用しているかを簡単に確認できるように、できるだけ少ない情報を送信する必要があります。将来の拡張のために値を送信する必要があるStaffTypeか、オブジェクト全体を送信する必要があるかを判断するのは困難ですが、 YAGNIの原則を考慮してください - You Ain't Gonna Need It.Person

于 2012-10-04T16:20:35.467 に答える
2

メソッドのパフォーマンスへの影響に何を渡すかは、コンテキストによって異なります。同じクラスのメソッド間でパラメーターを渡す場合、パフォーマンスへの影響は計り知れないほど小さくなります。RMI を介してメソッドを呼び出す場合は別の問題です

于 2012-10-04T16:12:00.297 に答える
1

おそらく、StaffType は列挙型です。この場合、オブジェクト参照を渡すよりもわずかに効率的であるはずです。enum を使用すると、ガベージ コレクションの作業が少なくなります。

しかし、違いはほとんどありません。この場合、拡張性がはるかに重要であると評価します。

于 2012-10-04T16:14:28.107 に答える
0

効率について言えば、どちらの場合も参照を渡すため、それらは同じです (2 つのクラスについて言えばStaffType、構造体の場合は 2 番目のクラスが遅くなります)。ただし、Best Coding Practicesに関しては、何をしたいかによって異なります。クラスの他のプロパティが必要ない場合はPerson、渡す情報をできるだけ少なくする必要があるため、2 番目のプロパティを使用する必要がありますが、人物オブジェクトでより多くの作業を行う必要がある場合は、最初のソリューションを使用する必要があります。

ただし、メソッドとフレームワークの再利用性について考える必要があります。このメソッドをPerson 型だけでなく、別の「型」にも使用する必要があるとしましょう。別のメソッドを書き直す必要があります。コードレスであるオブジェクト指向プログラミングの目的は消えてしまいます。

于 2012-10-04T16:20:50.617 に答える