2009-06-16 6 views
13

私のアプリケーションでは、他の多くのアプリケーションと同様に、何人もの人物を表すContactというエンティティがあります。最も基本的なレベルでは、これはビジネスの連絡先を表すために使用されます。ただし、会社の従業員を代表するために使用することもできます。特別な種類の従業員もいくつかあります(Managerというものがあります)。基本クラスからサブクラスにオブジェクトを変換することはこれまで有効ですか

これは理にかなった継承関係としてモデル化しようとしています。従業員は連絡先のような名前と住所だけでなく、多くの雇用関連属性も持っています。マネージャには、マネージャ固有の属性もいくつかあります。

従業員が昇進したときに問題が発生します。基本クラスEmployeeを継承クラスManagerに変換してもよろしいですか?それは間違っていると感じる。私はManagerの専門のコンストラクタでそれをやると思います。

さて、NHibernateはこの種の動作をサポートしていますか?従業員を取得し、従業員からマネージャを作成してからマネージャを保存するのと同じくらい簡単ですか?

答えて

5

あなたのビジネスモデルがあなたのドメインに合っている限り、あなたは正しいことをやっています。ある種のいくつかのワークフロー・プロセスの内部

Manager Promote(Employee employee) 
{ 
    var manager = new Manager(); 
    //promote your employee to a manager here 
    return manager; 
} 

:あなたのようなものを持っていなければならないよう

しかし、それは私に聞こえます。

NHibernateに関しては、ORMロジックをビジネスドメインと混在させているようです。従業員をマネージャーに昇格させることは、ビジネスドメインの構築であり、ビジネスモデルに属するものです。しかし、NHibernateがあなたの従業員とあなたのマネージャをあなたのDBにどのようにマッピングするかは、それらをマッピングする方法を除いて、あなたのビジネスモデルとは関係ありません。しかし、これは間違いなく従業員をマネージャに昇進させる方法とは関係ありません。

+0

NHibernateの質問は、NHibernateが基本型として取り出されたときにオブジェクトをサブクラスとして保存することに文句を言うかどうかを調べることでした。 –

2

私は個人的に、その中のすべての基本的なものと役割のリストを持つ基本クラスを持っています。
各ロールには独自のプロパティと機能があります。
利点は2つある:

  • それはそれはあなたの人々はあなたが作ることなく、複数の役割を持つことができるようになります/人から
  • に役割を与えるか、または取るのは簡単だ「組み合わせクラス」

あなたはinherritanceと一緒に行く単一inherritanceで行く場合は、すぐに「ManagerProgrammer」、「ProgrammerStockManager」のようなクラスをごレンダリングされます、「ProgrammerSupport」

16

私はinheriの上に組成物といいよこの場合、覚えておいてください。あなたが継承を守るならば、あなたはすべての昇進や降格で、またあなたが連絡先を雇うか従業員が退去して、定期的な連絡先になるたびにクラスを変更します。

連絡先には役割があると言うだけで簡単です。連絡先に管理者ロールを追加して管理者ロールを昇格させ、ロールを削除して起動することができます。

+1

これは正解であるとマークされています – Pierreten

0

やあ、

あなたは別の派生型に1型から派生したクラスを変換する必要が見つけた場合、それは最初の設計に問題があることを香りです。

ここで気になるのは、マネージャオブジェクトを間違って表していることです。

基本クラスに戻って、基本クラス(連絡先)にEmployeeオブジェクトとManagerオブジェクトの両方の共通要素が含まれている点をオブジェクト指向で考えます。派生オブジェクトは基本クラスの特殊化だけです。

この場合、従業員のインスタンスのマネージャではありませんか?

ManagerクラスとEmployeeクラスの両方に、EmployeeタイプのreportsToデータメンバーが必要です。

現時点で唯一の違いは、マネージャオブジェクトに、独自のdirectReportsであるEmployeeオブジェクトのコレクションが追加されていることです。これはおそらく、Employeeオブジェクトのコンテナへのポインタとして実装する必要があります。

ManagerオブジェクトからEmployeeオブジェクトを分離する必要がある動作の特殊化は考えられません。

ええと、おそらく、その中に連絡先の詳細を含む基本クラスのPersonを作成してください。

編集:申し訳ありませんが、私は十分にはっきりしていなかったと思います。私が説明したのは、あなたのContactクラスから直接派生した2つの別々のクラスにつながるわけではないので、実行時に元の質問だったEmployeeのインスタンスをManagerに変更する必要があります。

つまり、Contactクラスから直接継承した2つの派生クラスEmployeeとManagerを持つ必要はありません。

企業で雇用されている人々の両方のインスタンスではありませんか?なぜマネージャーと従業員を区別するのですか?マネージャーになれば従業員はもはや従業員ではありませんか?

2つの派生クラス、マネージャーと従業員を持つことは、完全に間違っています。あなたは "isa"と "have a"の関係で物事を分解しようとしましたか?そうすれば、基本的な構造が間違っていることがわかります。

従業員の "isa"という連絡先は意味がありません。 「従業員の可能性が高い」「人と人」には「連絡先の詳細のセット」があります。

多分Managerクラスを従業員の特殊化として派生していますか?従業員は "isa"人です。マネージャー "isa" "人"である従業員。

HTH

歓声、

+0

本当に役に立たないのは残念です。あなたは私がマネージャーを間違って代理していると言って、私が提案していることを正確に記述するように言います。 –

+0

申し訳ありません。あなたはまだ私が何を持っているか説明しています。 Contact - > Employee - > Managerからの継承。人と連絡先との意味の違いは偶然である。問題はこの継承です。従業員を従業員(Manager)のサブクラスに変換しても問題ありません。 –

2

はい、それは有効です。マネージャーの

  • staticメソッド::あなたが使用することができ、実装に関してはマネージャー
  • 工場またはサービスクラス

public static Manager Promote(Employee employee) { ... }

  • 専門コンストラクタ私はそれらのいずれかのアプローチが良いことだと思います溶液。個人的には、実世界をよく表しているので、私は専門的なコンストラクターソリューションが好きです。あなたは既存の従業員から新しいマネージャーを作成しています。

  • +1

    従業員降格(マネージャーマネージャー)と従業員雇用(連絡先)とマネージャーHireAsManager(連絡先)を忘れないでください。 –

    0

    ContactはEmployeeの属性です。ワーカー(従業員)は役割、マネージャーは役割です。 WorkerとManagerはどちらも従業員ですが、ロールを持っています。役割はIS IN関係、従業員はAM A関係、および連絡先はHAS A関係です。 従業員HAS A連絡先(1-1の関係)従業員1人の連絡先(2つの電話機などがあれば1-Mだが私は逃げる) 従業員IN IN役割(MM関係)多くの従業員多くの役割 従業員はA関係者) - 多くの従業員、すべての従業員タイプ。

    あなたは役割を変更しています。

    関連する問題