2009-06-10 46 views
0

因此,我有一个主要目的是管理客户的应用程序。我的问题是,我不确定如何将与客户相关的所有内容捆绑在一起?为了这篇文章,让我们假装一个客户可以有无限数量的电子邮件。下面是我在设想:与多个实体关联的客户类别

class Customer { 
    private int id; 
    private String name; 
    private List<Email> emails = new List<Email>(); 

    public Customer(id, name) { 
    this.id = id; 
    this.name = name; 
    } 

    public addEmail(Email email) { 
    emails.Add(email); 
    } 

    public getEmails() { 
    return emails; 
    } 
} 

class Email { 
    string email; 

    public Email(email) { 
    this.email = email; 
    } 
} 

Customer newCustomer = new Customer(123, "Dummy Customer"); 
newCustomer.addEmail(new Email("[email protected]")); 

我的目标实现这个设计,因为这样一来,说我需要关联到公司的代表,我可以简单地增加一个列表成员的客户。另外,我尝试了谷歌搜索,但我不确定这个问题被称为什么。

这里有一些事情我不确定:

  • 如何坚如磐石的是这样的设计?
  • 当我将新实体添加到客户类中时,它是否会在它负责的方面变得有点大?

谢谢。

+1

它是一种great article了很多时间,因为你问的问题,并得到了三个好答案。您至少应该投出一个或多个答案,并且最好将其中一个答案标记为“正确”。 – abelenky 2009-06-11 06:00:24

回答

0

您的设计看起来不错。

如果客户需要多个电子邮件地址,比让Customer类包含一个Email对象列表更有意义。

唯一的问题是它不强制唯一性,因为多个客户不应共享一个电子邮件地址。 (或者他们可以吗?鲍勃,迈克和苏珊都可以发邮件[email protected] ??)

+0

在输入数据库之前,电子邮件的唯一性由提交表单处理。 – lengtche 2009-06-10 21:12:59

0

我同意ablensky。 有关您将如何开发此课程以及遇到的问题的更多信息将有助于获得更具体的答案。

供参考:你使用的OO功能是组合,如果这是任何帮助。

0

你的命名是有问题的。 “电子邮件”实际上是一个电子邮件地址,还是电子邮件的文本?从你的使用,这显然是一个地址,所以你可能想要右键单击 - >重构 - >重命名。

为什么你打扰“添加电子邮件”方法或“获取电子邮件”方法?只公开一个公共getter属性。

下面是我可能会这样做。

class Customer 
{ 
    int id_; 
    string name_; 
    public IList<EmailAddress> EmailAddresses{get; private set;} 

    public Customer(int id, string name) 
    { 
     id_ = id; 
     name_ = name; 
     EmailAddresses = new List<EmailAddress>(); 
    } 
} 

var newCustomer = new Customer(123, "Dummy Customer"); 
newCustomer.EmailAddresses.Add(new EmailAddress("[email protected]")); 
+0

顺便说一句,如果你所有存储在“EmailAddress”对象中的是一个字符串,只需使用字符串类即可。不要仅仅创建一个新的类型来保存一个字符串。如果没有明确的“电子邮件”,你是否预计人们会误用这些数据?一定要清楚地说明你的变量/属性,这不应该发生。 – dss539 2009-06-10 21:53:24

0

同意,你的设计是好的,从数据构建你的对象是没有问题的,因为你有。

如果你想要小心的是,你不希望你的对象包含任何业务逻辑或数据访问等,那么它将不仅仅是代表自己的责任。

看一看单一职责原则在这里是从Object导师