一个对象的方法是否可以作用于自己?

问题描述:

我不知道在哪里放一些方法。一个对象的方法是否可以作用于自己?

假设我想发送电子邮件。

我应该选择哪一个下列选项:

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

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

因为如何邮件发送自己?是不是更好有一个*对象,处理所有的电子邮件,因为然后他可以规范的事情,如在特定时间发送所有电子邮件,排序邮件,删除邮件等。

此外,如果我想删除一个用户,我应该怎么办:

user.delete(); 

administrator.delete(user); 

请分享你如何知道在哪里放置方法的想法。

我不同意阿森。一个电子邮件可以发送自己,而这正是代码应该生活的地方。那是什么方法:可以在对象上执行的操作。

但是请注意,您的方法并不相互矛盾。一封电子邮件的send操作可能很容易包含将其自身添加到邮递员发送队列的代码,如果您想要规范操作,那可能是个好主意。但是,没有理由不对电子邮件类使用send方法。

使用第二种方法让班级经理处理对象(电子邮件或用户)。这跟随single-responsibility-principle.

在Ruby中我可以这样做:

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

把对应的类会是这个样子:

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

这是干净的,易于使用。

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

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

因此,我建议这样的:

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

在静态类型语言,邮递员参数的类型应该绝对是一个接口。

我同意丹尼尔。

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

我相信功能应该被封装。然而,删除用户的例子稍有不同。在User类上有一个删除方法可以完成像清除自己的内部变量,设置等,但不会删除对自身的引用。我发现删除方法更适合基于集合的类。我本不会把删除方法放在管理类上,而是放在用户“集合”类上。

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 
    } 
} 

我不太怎么看一个对象可以完全添加/删除自身,它是有道理的我有在收藏级别的功能。除此之外,我会说它应该被封装在它所指的类中。