エアコン吸気と排気吸気剤とセッターは有害とされています


エアコンの吸気と排気
Javaプログラマーは習慣的に「getters」と「setters」でクラスを修飾し、なぜこのようにすべきか、あるいはそうすべきかを疑う人はほとんどいないほど根強い.最近、そうしないほうがいいと思います.Javaコードを書くときは避け始めました.このブログの文章では、原因を説明します.しかし、まず、迅速な歴史の授業を行います.
JavaBeans
Gettersおよびsettersは、1996年末に最初にリリースされ、1997年8月に1.01版に更新されたJavaBeans仕様に起源しています.最初のアイデアは、アプリケーションを構成するために構築モジュールとして使用できるオブジェクトの作成を可能にすることです.この考え方は過ぎ去り、「ユーザー」はあるコンストラクタツールを使用して接続し、JavaBeansコンポーネントのセットをカスタマイズしてアプリケーションとして機能することができます.たとえば、AWTアプリケーションのボタンはBeanになります(AWTはJava UIライブラリSwingの前身です).さらに、JavaBeansの中には、通常のアプリケーションのように、それらを複合ドキュメントに組み合わせることができるものもあります.そのため、スプレッドシートbeanはWebページに埋め込むことができます.
次の規則に従うと、オブジェクトはJavaBeanです.
  • 失敗できないゼロパラメータのコンストラクション関数を持つ必要があります.
  • getterメソッドとsetterメソッドでアクセスおよび変更できるプロパティがあります.
  • は、Fooと呼ばれるbeanの任意の属性について、アクセサメソッドをgetFooと呼ばなければならない.ブール特性の場合、吸気剤はisFooと称される.
  • Fooのsetterメソッドは、setFooと呼ばれる必要があります.
  • Beanは、各プロパティにgetterとsetterを同時に提供する必要はありません.setterを持たないgetterを持つプロパティは読み取り専用です.setterがあり、getterがないプロパティは書き込みのみです.

  • この仕様は多くの異なる例を説明しているが、JavaBeansはパケットだけでなく動作を有するオブジェクトと見なされていることが上述の説明から明らかである.この考え方はすでに人々の視線を薄めているが,JavaBeanは大きく忘れられているにもかかわらず,Javaにおけるgetterとsetterメソッドの慣用は依然として存在する.
    隠喩は間違っている
    「取得」と「設定」の概念は自然なようですが、これは正しいですか?JavaBeansはクエリーを表すために「get」を使用することを約束しています.これは副作用のない操作ですが、現実世界ではgettingは状態を変える動作です.もし私が本を棚に下ろすと、本は棚に上がらなくなります.これは純粋な学問にすぎないと反対するかもしれませんが、このような誤解は私たちがオブジェクトを編纂してインタラクティブにする方法を誤って考えることを奨励すると思います.たとえば、Thermometerクラスがある場合、Java開発者の多くは、次のように温度を読み出すためにコードを作成します.
    Temperature t = thermometer.getTemperature();

    確かに、温度を「取得」するのは温度計の仕事ですか?いいえ!温度計の役割は温度を測定することです.私はどうしてそのために努力しますか?これは、温度計の操作説明である「取得」が必要であるためです.しかし、私たちは温度計にここで何もしたくない.それはすでにその仕事(温度を測定する)をしていて、私たちはその現在の読数がどれだけあるか知りたいだけです.読書は私たちが完成した.したがって、このように記述すると、コードはより自然になります.
    Temperature t = thermometer.reading();

    これはもっと責任を責任に帰すと思います.ただし、アクセサが必要かどうかは必ず考慮してください.
    オブジェクトはデータ構造ではありません
    getterとsetterでクラスを書く習慣は私たちの符号化方式に微妙な影響を及ぼしている.オブジェクトにアクセスして必要なデータを取得し、処理し、結果を使用してオブジェクトの考えを更新し、オブジェクトが自分で処理を実行するのではなく、オブジェクトにアクセスする必要があります.すなわち、オブジェクトをパケットと見なすことを奨励します.getterでデータを抽出し、setterで更新します.同時に、データを操作するコードは他の場所にあります.
    我々の符号化習慣がオブジェクトを純粋なデータ構造と見なす傾向にある場合、ORMフレームワークは積極的に実施される.さらに悪いことに、Springフレームワークを使用している場合は、Java開発者であれば可能です.デフォルトでは、すべてのbeanが単一の例として作成されます.(困ったことにSpring beanはJavaBeansとは関係ありません).したがって、動作しないデータ構造上で動作する単一のオブジェクトからなるシステムがあります.コードとデータを区別してよく知られているプログラミングスタイルのように聞こえる場合は、プロセスプログラミングと呼ばれています.
    これがいいことかどうか考えてみましょう.結局、Javaはオブジェクト向けのプログラミング言語であるべきです.OOの大きな利点は,オブジェクトクラスを記述でき,その名前とインタラクションが問題ドメインを反映することである.基本的なプログラミング構造や元のデータ型の背後にあるグローバルを曖昧にすることなく、解決すべき問題のコードを作成できます.林を通して木を見るのに役立ちます私たちはこの点を放棄すべきではない.
    どうすればいい
    できる限りget and setの作成を中止します!これは適切な方法ですが、IDEの機能を停止してgetterとsetterを生成する必要があります.これは、エラー操作を迅速に実行するための便利な方法にすぎません.オブジェクトに属性を公開する必要がある場合は、その属性に名前を付けるだけで、その属性を公開する必要があるかどうかを確認します.なぜそうするのか尋ねる.オブジェクト自体にタスクを委任できますか?たとえば、通貨の金額を表すクラスがあり、取引の山を要約したいとします.
    Amount total = new Amount(transactions.stream()
            .map(Transaction::getAmount)
            .mapToDouble(Amount::getValue)
            .sum());
    getValueアクセサの代わりに、なぜAmountクラスにadd()メソッドを与えずに和を求めてくれないのですか?
    Amount total = transactions.stream()
            .map(Transaction::getAmount)
            .reduce(Amount.ZERO, Amount::add);

    これはメリットをもたらします.通貨の金額を二重精度で表す考えに興味があるかもしれません.そう、BigDecimalのほうがいいです.第2の例は、内部表現がよりよくカプセル化されているため、この問題をより容易に修復することができる.私たちは1つの場所でそれを変更するだけです.
    オブジェクトのデータを取得して、オブジェクトが何かに等しいかどうかをテストしたいかもしれません.この場合、オブジェクトにequals()メソッドを実装し、等しいかどうかをテストすることを考慮してください.Mockitoを使用してスパイを作成する場合は、パラメータキャプチャを使用する必要はありません.代わりに、等値のオブジェクトを例として作成し、verify文に直接渡すことができます.
    アクセサを作成する必要がある場合があります.たとえば、データベースにデータを永続的に格納するには、データの元の表現にアクセスする必要があります.本当に命名規則の取得/設定に従う必要がありますか?「これがJavaで完了する方法です」と答えた場合は、JavaBeans仕様を振り返って読むことをお勧めします.仕様に従ってJavaBeanを作成して使用していますか?オブジェクトが約束に従うフレームワークまたはライブラリを使用していますか?
    トランスミッタを作成する必要がある回数は減少します.関数式プログラミングは現在、ブームのように業界全体を席巻しているが、不変データの原理は良い原則である.OOプログラムにも適用されるはずです.ステータスを変更する必要がない場合は、ステータスを変更しない必要があるので、付与関数メソッドを追加する必要はありません.新しいステータスが発生するコードを作成すると、できるだけ新しいインスタンスに戻って新しいステータスを表します.たとえば、BigDecimalインスタンスの算術方法では、独自の値は変更されません.その結果を表す新しいBigDecimalインスタンスが返されます.現在、このプログラミング方式を実行可能にするには、十分なメモリと処理能力があります.またSpringフレームワークは,注入依存法のsetter法を必要とせず,構造関数パラメータにより注入することも可能である.実際、この方法はSpringドキュメントで推奨されている方法です.
    いくつかのテクノロジーでは、クラスがJavaBeansの約束に従うことが確実に要求されています.まだビューレイヤのJSPページを作成している場合は、ELおよびJSTLは、モデルオブジェクトに応答するためにgetterメソッドを有することを望む.オブジェクトとXMLをシーケンス化/逆シーケンス化するライブラリに必要な場合があります.ORMフレームワークに必要な場合があります.これらの理由でデータ構造の作成を余儀なくされた場合は、アーキテクチャ境界の後ろに隠すことをお勧めします.オブジェクトがドメインに漏洩した場合、これらのデータ構造を偽装しないでください.
    結論
    他の言語で働いているプログラマーと話しているとき、Javaを批判するのをよく耳にします.彼らは「太羅y」や「テンプレートが多すぎる」と言った.Javaにはもちろん欠陥がありますが、これらの批判をもっと深く尋ねると、言語の内在的な実践ではなく、特定の実践に対して発見されます.やり方は変わらないのではなく、時間が経つにつれて発展し、悪いやり方は解決されます.Javaでgetとsetを勝手に使うのはよくないと思いますが、諦めたらもっと良いコードを書きます.
    翻訳:https://www.javacodegeeks.com/2018/03/getters-and-setters-considered-harmful.html
    エアコンの吸気と排気