データベースのトリガーが悪である場合、JavaまたはC#でプロパティを設定する際に副作用を発揮することも邪悪ですか?
-
29-09-2019 - |
質問
解決
ここで穀物に反対します...
プロパティは副作用をトリガーしてはなりません。それが方法の目的です。
プロパティが副作用を引き起こすことにより、状況に陥ることがあります。コードは本質的に隠されています。プロパティが何らかのプロセスを開始したり、何か他のものをひっくり返すことを期待することはめったにありません。これを文書化する必要がある場合、それは明らかではなく、無視されることになります。
ただし、メソッドを呼び出すと何かが起こると予想されます。
@Astanderの例を挙げると、彼は「価格」を変更する行為は異なるプロパティ「コスト」を変更するはずだと言います。ただし、後で「割引」と呼ばれる新しいプロパティを追加した場合はどうなりますか?価格と金額のプロパティに関するコードは変更する必要があります。これはあまり発見できません。
ただし、コストがそれ自体を計算した場合は..すべてがより良いです。
他のヒント
必ずしもそうではありません、いいえ。あなたが持っている場合 Price
また Amount
プロパティ、そしてあなたはそれを変えます、それは Cost
それに応じて変更する必要がありますか?
それとも、この投稿であなたが念頭に置いていた何か違うことはありますか?
いいえ。多くのプロパティは、副作用をトリガーすることができます。
例:子供が親に含まれている2つの視覚要素を想像してください。 parent.visible = falseを設定することは、おそらくchild.visible = falseを設定する必要があります。
多くの場合、これらの副作用は、イベント(System.Windows.Formsにはプロパティチェンジ付きイベントがいっぱい)またはインターフェイス(InotifyPropertyChangedなど)を介して明示的になります。
プロパティと同じくらい便利な場合、チーム環境で日々のコーディングに不確実性を導入します。これは、誰もが必ずしも同じ方法でプロパティの目的と適切な使用を解釈するわけではありません。
これは、発生する多くの問題の1つです。
- プロパティセッターには、非自明な副作用がある場合。
- 彼らは潜在的に集中的な処理を行うべきですか?
- パブリックフィールドにはまだ場所がありますか、それともすべてのフィールドがプライベート/保護され、プロパティを介してアクセスする必要がありますか?これは、リフレクションを使用するときに影響を与える可能性があります。タイプのフィールドコレクションを検索する必要がないことを知るのが便利です。
最終的に、上記の2ポイントは、副作用や潜在的に費用のかかる操作が文書化されている限り、それほど重要ではないと思います。
より多くの仮定がコードの複雑さを安全に減らすことができますが、そのゲインは追加の通信オーバーヘッドによってある程度否定されます。チームの全員が同じページにあり、同じページにとどまる限り、それは機能します。
プロパティが解決するよりも多くの問題を引き起こすと思うことがあります。
場合によります。確かに副作用があります。それはユーザーを驚かせ、それらのIMOを避けるのが最善です。
読者の視点から同じように見えるので、私はフィールドのように非常に同じように振る舞うことを好みます(とにかくC#で)。プロパティが非自明な副作用を持っている場合、私はプロパティよりも方法を好みます。
上記のChrisのコメントに加えて、トリガーが少し不正であると考えられていることに貢献した別の側面があることに同意します。
これにより、それが非常に簡単に忘れられ、デバッグが非常に難しくなります。
人々(そして私はそのうちの1人であり、確かに唯一のものではありません)は問題をデバッグしようとして何時間も費やし、フローから終了します(見かけの終了IEデータベース手順 / DMLクエリ)。トリガーでした - それらが本質的に背景操作であるためです。
また、トリガーの適切なロギングはこの種の問題を簡単に回避することになるはずですが、 いつもの ロギングはデータベースレイヤー自体では決して行われないため、トラブルシューティングのこの側面をもう少し複雑にします。