我刚刚开始学习OOP,我发现很难确定功能属于哪里。让我们在SO中使用down
投票作为我们的例子:
当我们投出一个时,必须在交易中发生以下事项:
rep
和downVotes
次数。rep
。score
。因此...
当对象彼此交互时变得越来越棘手,例如在我的例子中。通常很难确定哪个函数属于哪个对象等等......
答案 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