このコードは、オープン・クローズの原則に違反していますか?

Raghavendra Mダニ:

私は以下のコードは、オープンクローズドの原則に違反しているかどうかを知りたいです。

Animal親クラスであるDogが、Animalヘルプというジャクソンの注釈を持っているObjectMapper(デ)のクラスをシリアル化。拡張誰でもAnimal編集に上の注釈のみ存在していますAnimal確認してください(デ)シリアライズを行うために意図したとおりにそのままクラスを残して動作します。

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME, 
  include = JsonTypeInfo.As.PROPERTY, 
  property = "type")
@JsonSubTypes({ 
  // all subclasses
  @Type(value = Dog.class, name = "dog")
})
public abstract class Animal {
    // fields, constructors, getters and setters
}

public class Dog extends Animal {

}
マイケルZiober:

理論的な観点

開放/閉鎖原則全体のようなSOLID IS Utopia我々は継続的にその方向で私たちのコードをアップグレードする必要がありますが、これは不可能ですので、おそらく我々はそこに終わることは決してありません。どのように古典参照するには、以下の記事ましょう読み取りgettersannotation議論の余地ことができ構築します。

  1. プリンタの代わりにゲッター
  2. アノテーションは大きな間違いです

実用的な観点

すべての実用的なプログラマのように私の代わりに新しい自分を何かを実現するための課題を解決するための優れたツールを使用したいです。私はにシリアライズ与えられたモデルに尋ねていたときJSONのファイル私はそれがあるかどうかをチェックしています:

  1. オープンソース
  2. 速いです
  3. アクティブな開発中
  4. 使いやすいです

私たちが話しているときJackson、それの注釈、私が思うに、我々は理論と実践の間に黄金の真ん中の道を見つけることができます。そして、これがあるおかげMixIn機能。あなたはそれがシリアライズされる仕方からモデルを分離することができますJSONもちろん、あなたが変更する必要が基底クラス拡張する新しいクラスを追加するときMixIn interface、注釈としたが、これは我々が支払う必要が価格です。

編集またはなぜ私が質問に答えるのを忘れて?

申し訳ありませんが、私は上記の例に違反するかどうかの質問に答えるのを忘れOpen/Closed principleたりありません。まず、から定義を取得Wikipedia記事

それは、コンパイルされたライブラリに保存され、ベースライン、およびクライアントクラスで使用することができるので、クラスは、閉じられています。しかし、それはすべての新しいクラスは、新機能を追加し、親としてそれを使用するかもしれないので、また開いています。子孫クラスが定義されている場合、オリジナルを変更するか、そのクライアントを邪魔する必要はありません。

上記の例では、違反When a descendant class is defined, there is no need to change the original部分を。私たちが使用している場合でもMixIn、アプリケーションの他の部分を変更する必要があります。さらに、あなたのソリューションを使用している場合はannotations、それらの背後に隠されている何とか機能を設定する必要があるので、あなたがこの部分に違反する例99.99%インチ

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=181297&siteId=1