【问题标题】:Can an object's methods act on itself?对象的方法可以作用于自身吗?
【发布时间】:2011-04-30 15:52:25
【问题描述】:

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

假设我想发送一封电子邮件。

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

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

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

因为电子邮件如何发送自己?拥有一个处理所有电子邮件的中心对象不是更好吗,因为这样他就可以管理诸如在特定时间发送所有电子邮件、分类邮件、删除邮件等事情。

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

user.delete();

administrator.delete(user);

请分享您对如何知道将方法放在何处的想法。

【问题讨论】:

    标签: javascript python ruby oop design-patterns


    【解决方案1】:

    我不同意 Arseny。一封电子邮件可以自行发送,而这正是代码应该存在的地方。这就是方法的含义:可以对对象执行的操作。

    但是,请注意,您的方法并非互不兼容。电子邮件的send 操作很容易只包含将自身添加到邮递员发送队列的代码,如果您确实想规范这些操作,那可能是个好主意。但这没有理由不为电子邮件类提供 send 方法。

    【讨论】:

      【解决方案2】:

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

      因此,我建议这样做:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          在 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)

          【讨论】:

            【解决方案5】:

            我同意丹尼尔的观点。

            在您的第一个示例之后,许多常见的小部件也将具有您提到的“集合”管理器,但它们不一定。选项卡小部件可以显示/隐藏它自己的选项卡之一,而不必为每个单独的选项卡指定一个新的选项卡类。

            我认为功能应该被封装。但是,删除用户的示例略有不同。在 User 类上有一个 delete 方法可以做一些事情,比如清除它自己的内部变量、设置等,但它不会删除对自身的引用。我发现删除方法更适合基于集合的类。我本身不会将 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
                }
            }
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-09-04
              • 1970-01-01
              • 2010-11-15
              • 1970-01-01
              • 1970-01-01
              • 2011-06-26
              • 2012-03-05
              • 1970-01-01
              相关资源
              最近更新 更多