我们如何在OOP中确定对象的责任?

时间:2011-07-12 01:36:54

标签: oop design-patterns dao

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

当我们投出一个时,必须在交易中发生以下事项:

  1. 减少选民的repdownVotes次数。
  2. 减少收件人的rep
  3. 减少帖子score
  4. 因此...

    1. 我们如何确定哪个动作属于哪个对象?
    2. 这些功能会在哪里生活?在DAO层,服务层或实际对象本身?
    3. 当对象彼此交互时变得越来越棘手,例如在我的例子中。通常很难确定哪个函数属于哪个对象等等......

2 个答案:

答案 0 :(得分:4)

看看OO设计的SOLID原理,耦合&凝聚力。

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

答案 1 :(得分:1)

这不是一个容易回答的问题,听起来更像是设计模式问题,而不是OOP问题本身。在SO的情况下(我基于其站点的假定设计模式做出假设),设计模式的所有“层”都涉及您所谓的“事务”(不是DB术语,我假设你正在使用它的方式)。 UI层或视图接受“向下投票”,并且看起来是最有可能处理业务规则的层的ajax请求,该层确定在对用户施加“向下投票”时实际发生的情况。此时,业务层使数据层的请求在某处更新数据库以更新用户的分数,信誉等。使用Web服务也可以稍微改变一下,谁知道这里的内容是什么? 。 OOP;我确信在所有层,脚本和其他语言中都有很多OOP,但我想,在你的例子中,SO不会传递“User”类对象。投票;没有必要。

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