0

副作用を避けるために: メソッド内でパラメーター オブジェクトの属性値を変更したくありません。結果を表し、それを返す新しいものを作成することを好みます。

副作用を回避することは、マルチスレッド環境でのみ重要ですが、それでも実践することをお勧めします。f(X)=Y は、引数として受け取ったオブジェクトと結果として与えたオブジェクトの両方を比較できるので便利です。

つまり、IN パラメーター オブジェクトのすべての属性を、作成した OUT の新しいインスタンス オブジェクトにマップする必要があります。これにより、次のようなコードが作成されます。

groundCertResult.setExpirationDate(pGroundCertificate.getExpirationDate());
groundCertResult.setValidationDate(pGroundCertificate.getValidationDate());
groundCertResult.setId(pGroundCertificate.getId());

私のメソッドで多くの行を作成できること:$

行を追加するだけで、それほど多くの値をマッピングせずに行うこともできます

//use findByID without mapping that much 
final GroundCertificate groundCertResult =
    groundCertificateDao.findById(pGroundCertificate.getId());

しかし、これはDBへのアクセス、およびより多くの処理に終わります。

オブジェクトを別のオブジェクトにマップするために、リフレクションを使用して一般的な方法を実行しますか? それはパフォーマンスの面でコストがかかります。

あなたは何を選びますか?プロジェクトのニーズに応じて。保守性、拡張性を考慮して...

4

2 に答える 2

1
  1. CloneableObject.clone(). _ オブジェクトの浅いコピーで十分な場合は、追加のコードを記述する必要はありません。Object.clone()あなたのためにそれをします。
  2. このアプローチが本当に必要/必要であることを確認してください。それ以外の場合にどのような副作用が発生するかがわからない場合は、コードを確認して確認してください。
  3. 一貫性を保ちます。実装にコピー操作と変更操作を混在させないでください。
  4. 将来、あなたまたは誰かがあなたのGroundCertificate.
于 2011-10-27T17:15:33.713 に答える
0

これは、マルチスレッド環境で優れているだけではありませんが、問題を引き起こす副作用のリスクが大幅に軽減されます。

副作用は、コードが実際に何をするかについての推論を難しくします。状態を変更できるすべての場所を特定する必要があります。すべてを調べてそれらの場所を特定しない限り、それを行う方法はありません。「離れた場所での不気味なアクション」。

Apache のBeanUtilsのように、さまざまなタイプの Bean プロパティのコピーを行うライブラリがいくつかあります。効率の観点から価値があるかどうかは、状況によって異なります。

これは「純粋な」アプローチではありませんが、元のオブジェクトが変更されていることが明らかである限り、変更されたパラメーター オブジェクトを返すことに激しく反対しているわけでもありません。多くの場合、パラメータ オブジェクトをその値に戻します。そうでないときは、ある種のコピー機能を連鎖させることによって、コードがどちらかを示すようにしています。

最終的に、私にとっては明晰さがすべてであり、そうせざるを得ないときはできる限り純粋さよりも明快さを優先しますが、それは安全です.

于 2011-10-27T17:00:07.667 に答える