【问题标题】:How do we determine an object's responsibility in OOP?我们如何确定对象在 OOP 中的职责?
【发布时间】:2011-07-12 01:36:54
【问题描述】:

我刚开始学习 OOP,我发现很难确定功能的归属。让我们在 SO 中使用down 投票作为我们的示例:

当我们强制转换时,事务中必须发生以下情况:

  1. 减少投票者的repdownVotes 计数。
  2. 减少收件人的rep
  3. 减少帖子score

所以...

  1. 我们如何确定哪个动作属于哪个对象?
  2. 这样的功能在哪里?在 DAO 层、服务层还是实际对象本身?

当对象相互交互时变得越来越棘手,例如在我的示例中。通常很难确定什么函数属于什么对象等等......

【问题讨论】:

    标签: oop design-patterns dao


    【解决方案1】:

    看看SOLID OO 设计、耦合和内聚原则。

    OO 可以在很多地方使用,它不限于例如您的业​​务层。您可以编写面向对象的 Javascript。

    我会为您的示例 SO 域建模,类似于此(在 C# 中)。这是理想主义的 OO 代码,在现实世界中会做出一些妥协,例如为我的 ORM 公开字段。我要展示的内容-每个对象都对其数据负责,其他任何人都无法直接更改它;他们必须通过调用其中一个公共方法来要求该对象做某事。

    public class User
    {
        private int _reputation;
        private int _downvotes;
    
        public void Downvote(Post post)
        {
            DecreaseReputation();
            IncrementDownvotes();
            post.Downvote();
        }
    
        public void RegisterDownvote()
        {
            DecreaseReputation();
        }
    
        private void DecreaseReputation()
        {
            _reputation--;
        }
    
        private void IncrementDownvotes()
        {
            _downvotes++;
        }
    }
    
    public class Post
    {
        private int _score;
        private User _poster;
    
        public void Downvote()
        {
            DecreaseScore();
            _poster.RegisterDownvote();
        }
    
        private void DecreaseScore()
        {
            _score--;
        }
    }
    

    【讨论】:

    • 谢谢。说这种行为属于 VoteService 是否公平?我试图了解您的示例代码属于哪里。我不懂 C#,但我可以做出一些推论。代码是在单独的类文件中表示单独的 sn-ps,还是仅表示对象被实例化和更改的单个 Vote 类中的行为?在我的示例中,我没有提到第四个动作必须也是将投票写入投票表。
    • 在传统的三层架构中属于业务层(表现层/业务层/数据访问层),这是典型的Domain代码(如在DDD中;顺便说一句,有人说DDD是OOP做得对)。没有持久性(写入表),因为它是 DAL 的关注点 - 对于业务而言,这真的不重要,如果您正在写入 sql DB、文档 DB,甚至将所有内容都放在 RAM 中,只要它是一年2050,您可以保证不会丢失任何数据。这只是分离您的关注点的好习惯。
    【解决方案2】:

    这不是一个容易回答的问题,听起来更像是一个设计模式问题,而不是 OOP 问题本身。在 SO 的情况下(我根据他们网站的假定设计模式做出假设),设计模式的所有“层”都涉及您所谓的“事务”(不是数据库术语,我假设你使用它的方式)。 UI 层或视图接受“否决票”并向处理业务规则的层发出看似 ajax 的请求,该层决定了对用户投“反对票”时实际发生的情况。此时,业务层向数据层发出请求,以更新某处的数据库,以更新用户的分数、声誉等。这也可能使用 Web 服务执行稍有不同,谁知道 SO 的幕后内容是什么.至于面向对象;我相信引擎盖下到处都有很多 OOP,可能在所有层、脚本和其他语言中,但我想在你的例子中,SO 没有传递“用户”类对象时投票;没必要。

    这是非常流行的 MVC 设计模式,例如:http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2018-03-14
      • 2014-01-25
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      相关资源
      最近更新 更多