我不确定在哪里放一些方法。
假设我想发送电子邮件。
我应该选择以下哪个选项:
email = new Email("title", "adress", "body");
email.send();
或
email = new Email("title", "adress", "body");
Postman.send(email);
因为电子邮件如何自行发送?拥有处理所有电子邮件的中心对象并不是更好,因为他可以管理在特定时间发送所有电子邮件,排序邮件,删除邮件等内容。
此外,如果我想删除用户,我该怎么做:
user.delete();
或
administrator.delete(user);
请分享您对如何知道放置方法的想法。
答案 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
}
}
我不太清楚对象如何完全添加/删除自身,因此在集合级别拥有该功能对我来说是有意义的。除此之外,我会说它应该被封装在它所要求的类中。