13

私は最近、関数型プログラミングで遊んでいますが、副作用、なぜそれらを封じ込めるべきかなどのトピックについてはかなり良い治療法があります.OOPが使用されているプロジェクトでは、いくつかの戦略をレイアウトするリソースを探しています副作用および/または状態を最小限に抑えます。

これの良い例は、Web アプリケーションの状態を最小化するための戦略を提供する本RESTful Web Servicesです。他にどんな存在?

別の OOP アナリスト/デザイン パターンの本を探しているのではないことを思い出してください (ただし、適切なカプセル化と疎結合は副作用を回避するのに役立ちます) むしろ、トピック自体が状態/副作用であるリソースを探しています。

いくつかのコンパイルされた回答

  • 主に状態を気にする OOP プログラマーは、並行性のためにそうするので、Java Concurrency in Practice を読んでください。[まさに私が探していたもの]
  • TDD を使用して、副作用をより目立たせます[私はそれが好きです。例: セットアップが大きくなればなるほど、テストを実行するために必要な状態が増えます = 良い警告です]
  • コマンドとクエリの分離 [良いことです。関数の引数を変更することによる、一般的に混乱を招く副作用を防ぎます]
  • メソッドが行うことは 1 つだけです。オブジェクトの状態を変更する場合は、わかりやすい名前を使用して単純明快にします。
  • オブジェクトを不変にする [私はこれが本当に好き]
  • 値をメンバー変数に格納するのではなく、パラメーターとして渡します。[これはリンクしません。それは関数プロトタイプを乱雑にし、Clean Code や他の本によって積極的に落胆させられていますが、状態の問題に役立つことは認めます]
  • 値を保存して更新する代わりに、値を再計算します[これもとても気に入っています。私が取り組んでいるアプリでは、パフォーマンスは小さな問題です]
  • 同様に、回避できる場合は状態をコピーしないでください。1 つのオブジェクトにそれを保持する責任を持たせ、他の人がそこにアクセスできるようにします。[基本的な OOP 原則、良いアドバイス]
4

4 に答える 4

7

オブジェクト指向の世界では、このトピックに関する最新の資料はあまり見つからないと思います。単純に、オブジェクト指向プログラミング (および最も命令的なプログラミング)が状態と副作用に依存しているからです。たとえば、ロギングを考えてみましょう。これは純粋な副作用ですが、自尊心のある J2EE アプリケーションではどこにでもあります。Hoare のオリジナルの QuickSort は、ピボットの周りで値を交換する必要があるため、変更可能な状態に依存していますが、それでもどこにでもあります。

これが、多くの OO プログラマーが関数型プログラミングのパラダイムに頭を悩ませる理由です。彼らは「x」の値を再割り当てしようとしますが、それができないことを発見し (少なくとも、彼らが働いてきた他のすべての言語でできる方法では)、手を上げて「これは無理だよ!" 最終的に、彼らが忍耐強くなれば、再帰とカリー化、および map 関数がループの必要性をどのように置き換えるかを学び、落ち着きます。しかし、学習曲線は非常に急勾配になる場合があります。

最近、状態を回避することに最も気を配っている OO プログラマーは、並行性に取り組んでいるプログラマーです。この理由は明らかです。スレッド間の同時実行を管理しようとすると、変更可能な状態と副作用が大きな頭痛の種になります。その結果、オブジェクト指向の世界で私が見た状態の回避に関する最良の議論はJava Concurrency in Practice です。

于 2009-07-27T14:12:24.377 に答える
5

ルールは非常に単純だと思います。メソッドは 1 つのことだけを行うべきであり、その意図はメソッド名で明確に伝えられるべきです。

メソッドは、データのクエリまたは変更のいずれかを行う必要がありますが、両方を行うことはできません。

于 2009-07-27T13:48:52.053 に答える
4

私がするいくつかの小さなこと:

  • 不変の状態を好み、比較的良性です。たとえば、Java では、メンバー変数を final にして、可能な限りコンストラクターに設定します。

  • 値をメンバー変数に格納するのではなく、パラメーターとして渡します。

  • 値を保存して更新する代わりに、値を再計算します (それが十分に安価に実行できる場合)。これにより、データの更新を忘れてデータの不整合が発生するのを防ぐことができます。

  • 同様に、回避できる場合は状態をコピーしないでください。1 つのオブジェクトにそれを保持する責任を持たせ、他の人がそこにアクセスできるようにします。

于 2009-07-27T14:53:09.583 に答える