2009-05-06 6 views
1

私は、犬オブジェクトのコレクションを持つPersonクラスを持っているとしましょう。この関係は双方向です。私は、これらのオブジェクトで働いていた場合、今コレクションを含むWebアプリドメインオブジェクトにアイテムメソッドが「追加」と「削除」されるべきですか?

public class Person { 
    private List<Dog> dogs; 
    // getter and setter for dogs 
} 

public class Dog { 
    private Person person; 
    // getter and setter for person 
} 

[OK]を、私は犬を追加し、クライアントが直接コレクションで作業しないように、犬を除去するための人のメソッドを持っているでしょう。

public void removeDog(Dog dog) { 
    dogs.remove(dog); 
    dog.setPerson(null); 
} 

public void addDog(Dog dog) { 
    dog.setPerson(this); 
    dogs.add(dog); 
} 

またはこれらの行に沿ったもの。

サービスレイヤでこれらのオブジェクトを操作する際に私の質問があります。私はaddDogを介して人に新しい犬を追加することができ、自動的に新しい犬を持続させる人を単に保存することができます。しかし、removeDogを介して犬を削除し、その人を保存しても、犬を永続ストレージから自動的に削除することはありません。犬の参照をnullに設定するだけです。

は、だから私のようなもので終わる:これはWebアプリケーションで、人と犬がメモリに保持されていないので

Dog dog = dogDAO.getDogById(int id); 
dogDAO.remove(dog); 

、これは正常に動作し、私はPerson.removeDogと呼ばれることはありません()。この犬を元々参照していた人を次回ロードすると、犬がストレージから取り除かれたため、犬が含まれなくなります。

Person person = personDAO.getPersonById(int id); 
Dog dog = new Dog(); 
dog.setPerson(person); 
dogDAO.save(dog); 

これもまたうまく動作し、Person.addDog()を呼び出すことはありません。

PersonクラスでaddDogメソッドとremoveDogメソッドを使用することに意味がありますか?

答えて

1

これは、手動介入なしでは常に困難です。オブジェクト参照を削除し、古いオブジェクトを削除した後。他のユースケースでは、他のオブジェクトが指すオブジェクト(リスト)を削除するだけです。これも問題であるはずです。これが遅れて受け入れられるなら、それは多くの誤りをカバーするでしょう。

簡単にするために、removeDog()という人にdao remove操作を追加できますが、ユースケースをある人から削除して別の人に追加することはできません。犬をその人から取り除いて、犬を完全に取り除かなければならないことがわかったら、それを執拗さから取り除くという問題は何ですか?あなたは一歩を惜しみません。だから、削除犬を返すことは、あなたに

dogDAO.remove(person.removeDog(dog)) 

アドオンを持つのパターンを持参し、あなたがリストの挙動を模倣するだけでなく、いくつかの余分な機能を持っているだけでなく、できた人に削除されます。あなたのケースでは、それは簡単な設定であり、DAOがどのようにアクセシブルであるか、どこに置いておきたいかによって決まります。

少なくとも1つのユースケースをサポートしたいという印象があります。次に、必須およびオプションのオブジェクトリンクと設定を定義する必要があります。いくつかのプラグマティズム(例えば、永続性のものをオブジェクトに結合するなど)を使用すると、より簡単なオブジェクト指向の設定を行うチャンスが得られます。

1

論理的には、それがどのように行われるのか、犬から人々を追加したり削除したりする方法を持つ理由はありません。あなたの目標は、データモデルが常に一貫した状態にあることです。あなたが犬から人を取り除くことを許可した場合、あなたはデータモデルを一貫性を保つために犬をその人から取り除かなければなりません。その後、再帰を避けなければなりません。

あなたはそれがきれいで明確で曖昧でないように聞こえます。必要に応じて、Dogクラスにコメントを追加して、addPersonメソッドとremovePersonメソッドがないことを目的とし、代わりに人から犬を削除したり、犬をその人に追加したりすることで追加することができます。

完全な対称性または完全な直交性の必要はありません。目標はそれを目的とするのではなく、データモデルをきれいに理解できる形で一貫した状態に保つためです。

関連する問題