对象的方法可以自行处理吗?

时间:2010-10-26 09:41:36

标签: javascript python ruby oop design-patterns

我不确定在哪里放一些方法。

假设我想发送电子邮件。

我应该选择以下哪个选项:

email = new Email("title", "adress", "body");
email.send();

email = new Email("title", "adress", "body");
Postman.send(email);

因为电子邮件如何自行发送?拥有处理所有电子邮件的中心对象并不是更好,因为他可以管理在特定时间发送所有电子邮件,排序邮件,删除邮件等内容。

此外,如果我想删除用户,我该怎么做:

user.delete();

administrator.delete(user);

请分享您对如何知道放置方法的想法。

5 个答案:

答案 0 :(得分:8)

我不同意阿森尼。电子邮件可以发送自己,这正是代码应该存在的位置。这就是方法:可以对对象执行的操作。

但请注意,您的方法并非互不兼容。电子邮件的send操作可以轻松地包含将自己添加到邮递员发送队列的代码,如果您确实想要规范操作,那可能是个好主意。但是,没有理由不为电子邮件类使用send方法。

答案 1 :(得分:3)

作为电子邮件的所有合理方法应该在电子邮件类中,以方便您班级的用户。但是电子邮件对象不应包含除与电子邮件本身内容相关的任何字段(单一责任原则)。

因此,我建议:

class Email
  def email(postman)
    postman.send(self)
  end
end

在静态类型语言中,postman参数的类型肯定是一个接口。

答案 2 :(得分:2)

使用第二种方法让类管理器处理对象(电子邮件或用户)。这遵循single-responsibility-principle.

答案 3 :(得分:1)

在Ruby中我会这样做:

email = Email.deliver(recipient, subject, message)

correspoding类看起来像这样:

class Email
  def self.deliver(recipient, subject, message)
    # Do stuff to send mail
  end
end

这很干净且易于使用。

关于删除问题:删除要删除的对象。所以@user.delete最好。如果您想注册删除用户的管理员:@user.delete_by(@admin)

答案 4 :(得分:1)

我同意丹尼尔。

按照你的第一个例子,很多常见的小部件也会像你提到的那样有一个“集合”管理器,但它们并不一定。选项卡小部件可以显示/隐藏其自己的选项卡之一,而无需为每个选项卡指定新的选项卡类。

我认为应该封装功能。然而,删除用户的示例是略微不同的情况。在User类上使用delete方法可以执行清除自己的内部变量,设置等操作,但不会删除对自身的引用。我发现删除方法更适合基于集合的类。我本身不会将删除方法放在管理类上,而是放在用户“集合”类上。

function Users(){
    var users = [];
    this.add = function(user){
        // add user code
        users.push(new User(user));
    }
    this.remove = function(user){
        // remove user code and remove it from array
    }
}

我不太清楚对象如何完全添加/删除自身,因此在集合级别拥有该功能对我来说是有意义的。除此之外,我会说它应该被封装在它所要求的类中。