2

私はクラスを持っています:

    public class Person
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public string Email { get; private set; }
    public string Telephone { get; private set; }
    public Address Address { get; private set; }

    public Person(string firstName, string lastName)
    {
        //do null-checks
        FirstName = firstName;
        LastName = lastName;
        Address = new Address();
    }

    public void AddOrChangeEmail(string email)
    {
        //Check if e-mail is a valid e-mail here
        Email = email;
    }

    public void AddOrChangeTelephone(string telephone)
    {
        //Check if thelephone has correct format and valid symbols
        Telephone = telephone;
    }

    public void AddOrChangeAdress(Address address)
    {
        Address = address;
    }

コンストラクターにないプロパティはオプションです。つまり、個人は電子メール、住所、または電話を必要としません。ただし、クラスのユーザーに、最初に必要な情報を提供せずにオブジェクトを作成する機会を提供し、その後、情報を追加するために使用するメソッドを見つける必要があります。

質問:

  1. それらにそのオプションを与えるために3つの追加のオーバーロードを作成するのは正しいですか?
  2. オプションのプロパティでパブリックセッターを許可し、そこで検証を行う必要がありますか?
  3. その人が結婚して姓を変更した場合、姓を変更するための追加のメソッドが必要ですか、それともこのセッターも公開して、コンストラクターでそれらを要求する必要がありますか?
4

3 に答える 3

4
  1. いいえ。
  2. はい
  3. 公開します。

書式設定ロジックや検証などのメソッドにさらに多くのコードが含まれると仮定するとAddOrChange、次のようになります。AddOrChangeそれ以外の場合は、メソッドを完全に削除します。

public class Person
{
    private string _email = string.empty;
    private string _telephone = string.empty;
    private Address _address = new Address();

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { 
        get { return _email }
        set { AddOrChangeEmail(value); }
    }
    public string Telephone { 
        get { return _telephone;}
        set { AddOrChangeTelephone(value); }
     }
    public Address Address { 
        get { return _address;  }
        set { AddOrChangeAddress(value); }
    }

    public Person(string firstName, string lastName)
    {
        //do null-checks
        FirstName = firstName;
        LastName = lastName;
    }

    private void AddOrChangeEmail(string email)
    {
        //Check if e-mail is a valid e-mail here
        _email = email;
    }

    private void AddOrChangeTelephone(string telephone)
    {
        //Check if thelephone has correct format and valid symbols
        _telephone = telephone;
    }

    private void AddOrChangeAddress(Address address)
    {
        _address = address;
    }
}

このクラスを操作するには、次のいずれかを実行できます。

Person p = new Person("Tom", "Jones");
p.Telephone = "9995551111";

また

Person p = new Person("Tom", "Jones") { Telephone = "9995551111", Email="spamme@ms.com" }
于 2012-10-19T16:25:52.983 に答える
3

AddOrChangepublic setter を持つ単純なプロパティと同等であるため、これらのメソッドは必要ありません。

public class Person
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public Email Email { get; set; }
    public Telephone Telephone { get; set; }
    public Address Address { get; set; }

    public Person(string firstName, string lastName)
    {
        //do null-checks
        FirstName = firstName;
        LastName = lastName;
    }
}
  1. 人の作成中にユーザーが必要なデータ以外に何かを提供したい場合は、クラス初期化子を使用できます。また、コンストラクターにいくつかのオプションのパラメーターを追加することもできます。

    var bob = new Person("Bob", "Uncle") { Address = someAddress };

  2. 転居しても構わないのであれば、パブリックセッターを使って住所を変更してみませんか?もちろん、アドレスが有効かどうかを確認する必要があります。また、転居がビジネス プロセスである場合 (つまり、誰かをホテルに転居させる場合)、ドメイン サービスでこの操作を実行すると便利です (移動先の部屋が空で準備ができているかどうかを確認します)。

  3. 名前の変更を許可しても問題ありません。通常、名前はそのようなエンティティの ID ではないため、変更される可能性があります。

また、メールと電話の値オブジェクトを導入しました。メールアドレスが有効かどうかを確認するのは、人の責任ではないと思います。それを Email クラスに移動します。電話番号と住所も同じです。

于 2012-10-19T16:24:04.773 に答える
1

多くの追加/変更メソッドとコンストラクターのオーバーロードは DDD の結果ですか?

いいえ、多くの更新方法は DDD の結果ではありません。

コード

クラスPersonは、2 つの更新メソッドのみを持つように書き直すことができます。

class Person

    public function Rename(FirstName as Name, LastName as Name) as Person

    public function ChangeContacts(
        Address as Maybe(of Address), 
        Phone as Maybe(of Phone), 
        Mail as Maybe(of MailAddress)) as Person
end class

RenameNameメソッドは、特別なタイプの 2 つの必須パラメーターを受け入れます。名前の検証チェックは、クラスに渡されるときではなく、名前が作成されるときに行われPersonます。

ChangeContactsメソッドは 3 つのオプション パラメータを受け入れますが、いずれも省略できます。特別なMaybeタイプは、それらがオプションであることを示します。Special AddressPhoneおよび型は、これらのパラメーターが既に有効であり、クラスMailAddressで再度検証する必要がないことを示します。Person

使用事例

人が結婚して姓が変わる

Person = Person.
    Rename(Person.FirstName, LastNameAfterMarriage)

人が新しい電話番号を購入する

Person = Person.
    ChangeContacts(Person.Address, NewPhoneNumber, Person.Mail)

電話番号を紛失した人

Dim NewPhoneNumber = Maybe.Create(Nothing)
Person = Person.
    ChangeContacts(Person.Address, NewPhoneNumber, Person.Mail)

パターンは、古い値 + いくつかの新しい値で更新メソッドを呼び出すことです。

于 2016-01-04T09:22:58.713 に答える