集約を分解して永続化するための設計


下記の質問に関連します。  
[特定のパッケージやjarに対してのみ公開する可視性設定は可能か？](https://ja.stackoverflow.com/questions/28771/%e7%89%b9%e5%ae%9a%e3%81%ae%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%82%84jar%e3%81%ab%e5%af%be%e3%81%97%e3%81%a6%e3%81%ae%e3%81%bf%e5%85%ac%e9%96%8b%e3%81%99%e3%82%8b%e5%8f%af%e8%a6%96%e6%80%a7%e8%a8%ad%e5%ae%9a%e3%81%af%e5%8f%af%e8%83%bd%e3%81%8b)

DDDにおける集約は、その内部状態（集約に含まれるエンティティやEnum型フィールド等）は公開せず、ユースケース上必要となるメソッドのみを外部に公開します。  
しかし、永続化層ではその内部状態を調べてデータベースのテーブルにマッピングしなければなりません。  
永続化のために全ての内部状態を`public`メソッドで公開するのは避けたいので、何らかの制約のもとで内部状態を取得する仕組みを求めています。

目標とする隠蔽のレベルですが、最低限、「うっかり呼んでしまった」を防げれば良いと考えています。  
`public`メソッドになっていると、その集約オブジェクトの設計（どの`public`メソッドが“真の”`public`なのか）に関する知識が無ければ、「うっかり」呼んでしまいますが、何か特別な手続きを踏む必要性を取り入れれば、「うっかり」は防げます。

この条件下では、どのようなクラス設計が良いでしょうか。  
何か応用可能なデザインパターンなどありませんか？




インターフェースと実装クラスに分ければ良いのではないでしょうか。

> ユースケース上必要となるメソッドのみを外部に公開します。

この部分を公開用インターフェースのメソッドとして定義して、

> その内部状態（集約に含まれるエンティティやEnum型フィールド等）は公開せず、

この部分は実装クラスのpublicメソッドにします。

外部にはインターフェースを渡せば、キャストしない限り実装クラスのpublicメソッドをうっかり呼び出すという事は起こりません。

[code]

    public interface Hoge {
        //公開したいメソッド
        public void xxx();
    }
    
    public class HogeImpl implements Hoge {
        @Override
        public void xxx() {
        }
    
        // 公開したくないメソッド
        public void yyy() {
        }
    }
    
[/code]




インターフェースと実装クラスに分ければ良いのではないでしょうか。

> ユースケース上必要となるメソッドのみを外部に公開します。

この部分を公開用インターフェースのメソッドとして定義して、

> その内部状態（集約に含まれるエンティティやEnum型フィールド等）は公開せず、

この部分は実装クラスのpublicメソッドにします。

外部にはインターフェースを渡せば、キャストしない限り実装クラスのpublicメソッドをうっかり呼び出すという事は起こりません。

[code]

    public interface Hoge {
        //公開したいメソッド
        public void xxx();
    }
    
    public class HogeImpl implements Hoge {
        @Override
        public void xxx() {
        }
    
        // 公開したくないメソッド
        public void yyy() {
        }
    }
    
[/code]

