Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们如何确定一个对象';OOP中的责任是什么?_Oop_Design Patterns_Dao - Fatal编程技术网

我们如何确定一个对象';OOP中的责任是什么?

我们如何确定一个对象';OOP中的责任是什么?,oop,design-patterns,dao,Oop,Design Patterns,Dao,我刚开始学习OOP,我发现很难决定功能属于哪里。让我们使用一个down投票,以便为我们的示例: 当我们强制转换时,事务中必须发生以下情况: 减少投票者的rep和downloves计数 减少收件人的重复次数 降低post得分 所以 我们如何确定哪个动作属于哪个对象 这样的功能在哪里?在DAO层、服务层还是实际对象本身 当对象彼此交互时,它变得越来越棘手,例如在我的示例中。通常很难决定什么函数属于什么对象等等…这不是一个容易回答的问题,听起来更像是一个设计模式问题,而不是OOP问题本身。在SO的情况

我刚开始学习OOP,我发现很难决定功能属于哪里。让我们使用一个
down
投票,以便为我们的示例:

当我们强制转换时,事务中必须发生以下情况:

  • 减少投票者的
    rep
    downloves
    计数
  • 减少收件人的
    重复次数
  • 降低post
    得分
  • 所以

  • 我们如何确定哪个动作属于哪个对象
  • 这样的功能在哪里?在DAO层、服务层还是实际对象本身

  • 当对象彼此交互时,它变得越来越棘手,例如在我的示例中。通常很难决定什么函数属于什么对象等等…

    这不是一个容易回答的问题,听起来更像是一个设计模式问题,而不是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正确完成的)。没有波斯