2011-07-12 20 views
1

我刚开始学习OOP,我发现很难确定功能属于哪里。让我们用一个down投对于本例:我们如何确定对象在OOP中的责任?

当我们投一个,下面的交易必须发生:

  1. 递减选民的repdownVotes计数。
  2. 减少收件人的rep
  3. 减少后score

所以......

  1. 我们如何确定哪些行为属于哪个对象?
  2. 这种功能在哪里?在DAO层,服务层,还是实际的对象本身?

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

回答

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

谢谢。这种行为属于VoteService是否公平?我试图了解你的示例代码属于哪里。我不知道C#,但我可以做出一些推论。代码是否在单独的类文件中表示单独的片段,或者仅在单个Vote类中的对象被实例化和更改的行为?在我的例子中,我忽略了提到第四个动作必须是将投票写入投票表。 – Mohamad

+0

它属于传统3层体系结构(表示层/业务层/数据访问层)中的业务层,这是典型的域代码(如DDD;顺便说一句,有人说DDD是OOP做对了)。没有持久性(写入表格),因为它是DAL的关注点 - 对于业务来说,如果您正在写入sql DB,文档数据库,或者甚至将所有内容都放在RAM中,那么它就是非常重要的,只要它是年2050,你可以保证没有数据会以这种方式丢失。这只是将您的疑虑分开的良好做法。 – driushkin

1

这不是一个简单的问题,听起来更像是一个设计模式问题,而不是一个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

相关问题