我们如何确定一个对象';OOP中的责任是什么?
我刚开始学习OOP,我发现很难决定功能属于哪里。让我们使用一个我们如何确定一个对象';OOP中的责任是什么?,oop,design-patterns,dao,Oop,Design Patterns,Dao,我刚开始学习OOP,我发现很难决定功能属于哪里。让我们使用一个down投票,以便为我们的示例: 当我们强制转换时,事务中必须发生以下情况: 减少投票者的rep和downloves计数 减少收件人的重复次数 降低post得分 所以 我们如何确定哪个动作属于哪个对象 这样的功能在哪里?在DAO层、服务层还是实际对象本身 当对象彼此交互时,它变得越来越棘手,例如在我的示例中。通常很难决定什么函数属于什么对象等等…这不是一个容易回答的问题,听起来更像是一个设计模式问题,而不是OOP问题本身。在SO的情况
down
投票,以便为我们的示例:
当我们强制转换时,事务中必须发生以下情况:
rep
和downloves
计数重复次数
得分
当对象彼此交互时,它变得越来越棘手,例如在我的示例中。通常很难决定什么函数属于什么对象等等…这不是一个容易回答的问题,听起来更像是一个设计模式问题,而不是OOP问题本身。在SO的情况下(我根据他们站点的假设设计模式进行假设),设计模式的所有“层”都涉及到您所谓的“事务”(我假设您使用它的方式不是DB术语)。UI层或视图接受“否决票”,并向处理业务规则的层发出看似ajax的请求,这决定了当对用户投下“否决票”时实际发生的情况。在这一点上,业务层向数据层请求在某处更新数据库,以更新用户的分数、声誉等。这也可以使用web服务执行稍微不同的操作,谁知道目前的情况。就面向对象而言;我确信在所有的层次、脚本和其他语言中,到处都有很多OOP,但我可以想象,在你的例子中,投票时不传递“用户”类对象也是如此;没有必要
下面是非常流行的MVC设计模式,例如:这不是一个容易回答的问题,听起来更像是一个设计模式问题,而不是OOP问题本身。在SO的情况下(我根据他们站点的假设设计模式进行假设),设计模式的所有“层”都涉及到您所谓的“事务”(我假设您使用它的方式不是DB术语)。UI层或视图接受“否决票”,并向处理业务规则的层发出看似ajax的请求,这决定了当对用户投下“否决票”时实际发生的情况。在这一点上,业务层向数据层请求在某处更新数据库,以更新用户的分数、声誉等。这也可以使用web服务执行稍微不同的操作,谁知道目前的情况。就面向对象而言;我确信在所有的层次、脚本和其他语言中,到处都有很多OOP,但我可以想象,在你的例子中,投票时不传递“用户”类对象也是如此;没有必要 下面是非常流行的MVC设计模式,例如:看看OO设计、耦合和内聚的原则 OO可以在许多地方使用,但不限于您的业务层。您可以编写面向对象的Javascript 我会对您的示例进行建模,使其域与此类似(在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--;
}
}
看看OO设计、耦合和内聚的原则
OO可以在许多地方使用,但不限于您的业务层。您可以编写面向对象的Javascript
我会对您的示例进行建模,使其域与此类似(在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,但我可以做出一些推论。代码是在单独的类文件中表示单独的片段,还是仅在一个投票类中表示行为,其中对象被实例化和更改?在我的示例中,我忽略了第四个操作必须是将投票写入投票表。在传统的三层体系结构(表示层/业务层/数据访问层)中,它属于业务层,这是典型的域代码(如DDD;顺便说一句,有些人说DDD是OOP正确完成的)。不存在持久性(写入表),因为它是DAL关心的问题——对于业务而言,它实际上并不重要,如果您正在写入sql DB、文档DB,甚至所有内容都在RAM中,只要是2050年,并且您可以保证不会以这种方式丢失任何数据。这只是一个很好的分离关注点的做法。谢谢。说这种行为属于VoteService,公平吗?我试图理解您的示例代码属于哪里。我不知道C,但我可以做出一些推论。代码是在单独的类文件中表示单独的片段,还是仅在一个投票类中表示行为,其中对象被实例化和更改?在我的示例中,我忽略了第四个操作必须是将投票写入投票表。在传统的三层体系结构(表示层/业务层/数据访问层)中,它属于业务层,这是典型的域代码(如DDD;顺便说一句,有些人说DDD是OOP正确完成的)。没有波斯