私は以下のコードは、オープンクローズドの原則に違反しているかどうかを知りたいです。
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 {
}
理論的な観点
開放/閉鎖原則全体のようなSOLID IS Utopia
。我々は継続的にその方向で私たちのコードをアップグレードする必要がありますが、これは不可能ですので、おそらく我々はそこに終わることは決してありません。どのように古典参照するには、以下の記事ましょう読み取りgetters
とannotation
議論の余地ことができ構築します。
実用的な観点
すべての実用的なプログラマのように私の代わりに新しい自分を何かを実現するための課題を解決するための優れたツールを使用したいです。私はにシリアライズ与えられたモデルに尋ねていたときJSON
のファイル私はそれがあるかどうかをチェックしています:
- オープンソース
- 速いです
- アクティブな開発中
- 使いやすいです
私たちが話しているとき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%インチ