C# 大量的添加/更改方法和构造函数重载是DDD的结果吗?
我有一门课:C# 大量的添加/更改方法和构造函数重载是DDD的结果吗?,c#,domain-driven-design,domain-model,C#,Domain Driven Design,Domain Model,我有一门课: 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 Add
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;
}
构造函数中不包含的属性是可选的,即此人不需要电子邮件、地址或电话。但是,我想给类的用户一个创建对象的机会,而不必首先提供所需的信息,然后再找出用于添加信息的方法
问题:
AddOrChange
相当于带有公共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;
}
}
var-bob=新人(“bob”,“叔叔”){Address=someAddress}代码>
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";
或
大量的添加/更改方法和构造函数重载是DDD的结果吗
不,许多更新方法不是DDD的结果
代码
您的Person
类可以重写为只有两种更新方法:
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
Rename
方法接受特殊Name
类型的两个必需参数。名称的验证检查是在创建名称时进行的,而不是在将名称传递到Person
类时进行的
ChangeContacts
方法接受三个可选参数,其中任何一个都可以不存在。SpecialMaybe
类型表示它们是可选的。特殊的地址
、电话
和邮件地址
类型表示这些参数已经有效,无需在人员
类中再次验证它们
用例
此人结婚并更改姓氏
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)
丢失电话号码的人
Person = Person.
ChangeContacts(Person.Address, NewPhoneNumber, Person.Mail)
Dim NewPhoneNumber = Maybe.Create(Nothing)
Person = Person.
ChangeContacts(Person.Address, NewPhoneNumber, Person.Mail)
模式是用旧值+一些新值调用更新方法。完全不同意。。。属性的语义与我的2美分不同:Setter说,某些依赖项或数据可以更改。如果您想为更改流程命名,则由您决定。例如,使用方法
重新定位而不是地址的setter
。但是除了我们已经知道的以外,AddOrChange
没有带来任何新的东西。这只是糟糕的方法名称,我仍然认为应该有用于此的命令方法,只有其他名称。。当前域语言中的动词名称。。否则就不是很DDD了all@RogerAlsing你真的认为属性不应该用在DDD应用程序中吗?你的属性语法有点不正确;您需要创建一个支持字段,并从属性中手动设置/返回它。@Servy:完全正确。这就是我复制/粘贴和快速键入的结果。固定。电子邮件和电话应该是像地址一样的有价值的对象。他们将自己进行验证。此人不应该关心验证它们,有效的电子邮件或电话是其他对象可以使用的对象,它们应该始终处于有效状态。@MikeSW谢谢。您可能是对的,这将是一个优雅的解决方案,为类似的字段使用更多的值类型,以便可以反复使用。