我刚开始学习OOP,我发现很难确定功能属于哪里。让我们用一个down
投对于本例:我们如何确定对象在OOP中的责任?
当我们投一个,下面的交易必须发生:
- 递减选民的
rep
和downVotes
计数。 - 减少收件人的
rep
。 - 减少后
score
。
所以......
- 我们如何确定哪些行为属于哪个对象?
- 这种功能在哪里?在DAO层,服务层,还是实际的对象本身?
当对象互相交互时,例如在我的示例中,它变得越来越棘手。通常很难确定哪个功能属于什么对象等等......
我刚开始学习OOP,我发现很难确定功能属于哪里。让我们用一个down
投对于本例:我们如何确定对象在OOP中的责任?
当我们投一个,下面的交易必须发生:
rep
和downVotes
计数。rep
。score
。所以......
当对象互相交互时,例如在我的示例中,它变得越来越棘手。通常很难确定哪个功能属于什么对象等等......
看看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--;
}
}
这不是一个简单的问题,听起来更像是一个设计模式问题,而不是一个OOP问题本身。在SO的情况下(我根据他们网站的假设设计模式作出假设),设计模式的所有“层”都与您称之为“交易”有关(不是我假设的DB术语你使用它的方式)。 UI层或View接受“反对票”,并且对于处理业务规则的层做出最有可能的ajax请求,这决定了当针对用户投下“反对票”时实际发生的事情。此时,业务层会请求数据层更新某处的数据库以更新用户的分数,声誉等。使用Web服务也可能会执行一些稍微不同的操作,他们会知道SO中的内容。就OOP而言;我确信在所有层,脚本和其他语言中都有很多OOP,但我可以想象,在你的例子中,SO并没有围绕“User”类对象传递投票;没有必要。
这里是例如非常流行的MVC设计模式:http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
谢谢。这种行为属于VoteService是否公平?我试图了解你的示例代码属于哪里。我不知道C#,但我可以做出一些推论。代码是否在单独的类文件中表示单独的片段,或者仅在单个Vote类中的对象被实例化和更改的行为?在我的例子中,我忽略了提到第四个动作必须是将投票写入投票表。 – Mohamad
它属于传统3层体系结构(表示层/业务层/数据访问层)中的业务层,这是典型的域代码(如DDD;顺便说一句,有人说DDD是OOP做对了)。没有持久性(写入表格),因为它是DAL的关注点 - 对于业务来说,如果您正在写入sql DB,文档数据库,或者甚至将所有内容都放在RAM中,那么它就是非常重要的,只要它是年2050,你可以保证没有数据会以这种方式丢失。这只是将您的疑虑分开的良好做法。 – driushkin