Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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
C# 单一责任vs封装_C#_Encapsulation_Solid Principles_Single Responsibility Principle - Fatal编程技术网

C# 单一责任vs封装

C# 单一责任vs封装,c#,encapsulation,solid-principles,single-responsibility-principle,C#,Encapsulation,Solid Principles,Single Responsibility Principle,我正试图对单一责任有更多的了解。如果我尝试表示一个可以添加、删除、更新和检索的客户,那么在过去,我的客户类将拥有所有的add、remove、update和get方法。这有助于将真实世界中客户的行为封装在一个类中。我是否只负责将我的客户类分解为AddCustomer类、delete customer类、update customer类和Get customer类,甚至可能是Get all customer类 不,它不一定是这样的,因为SRP意味着只有一个原因可以让您的类进行更改。 你的问题很一般,

我正试图对单一责任有更多的了解。如果我尝试表示一个可以添加、删除、更新和检索的客户,那么在过去,我的客户类将拥有所有的add、remove、update和get方法。这有助于将真实世界中客户的行为封装在一个类中。我是否只负责将我的客户类分解为AddCustomer类、delete customer类、update customer类和Get customer类,甚至可能是Get all customer类

不,它不一定是这样的,因为SRP意味着只有一个原因可以让您的类进行更改。 你的问题很一般,所以我的回答也差不多。 例如,我忍不住想知道为什么客户应该能够添加自己。。。 SRP是一个关于如何表述类责任的问题,是关于分层的问题,它不应该关心如何准确地实现这些责任的细节。它必须停留在自己的抽象层上

另见

但请注意,改变的原因非常重要,而不仅仅是它只应对一件事负责。多个操作可能属于同一个操作,因此您仍然有一个更改的理由


您可能需要查看整个完整的首字母缩略词。

在您描述的场景中,您不需要将
Customer
类拆分为多个Add/Update/Delete Customer类-事实上,这几乎肯定会使您的系统更难理解

顺便说一句,我可能是错的,听起来你在使用类似于模式的东西;这个模式本身并没有错,但它违反了SRP,而且它不是最可测试的模式,所以我倾向于建议您采用另一种方法

单一责任原则 SRP声明一个类应该有一个(而且只有一个)改变的理由。但是如果你考虑一下你目前拥有的,你的
Customer
类已经有了两个职责,因此已经有了两个可能的改变原因

  • 在您正在实现的任何应用程序域中表示客户的数据和行为
  • 保存自己的数据(即所有CRUD操作)
因此,如果基础数据库发生更改,则需要更新处理持久性的Customer类方法,如果所需的Customer行为发生更改,则必须更新Customer类以实现新的行为

它有多大帮助 当您遇到这种情况时,您的
Customer
类总是有可能最终使用混合代码,将业务逻辑和数据库持久性逻辑纠缠在一个高度耦合的混乱中,这样以后您就会发现很难对一个方面进行更改而不在另一个方面造成问题。 我去过那里,那里一点也不好玩,所以一定要记住这一点;这就是SRP的真正意义所在——避免经典的“情况”

从这里到哪里去
  • 如果您真的想遵循*中的“S”,那么我建议您从模式开始,以处理
    Customer
    类与数据库之间的实际持久性(您创建的
    存储库
    类本身当然会遵守SRP,因为它只涉及数据库的CRUD,不包含与
    客户
  • 一旦您对这种方法感到满意,如果您愿意,您可以继续使用类似于模式的东西,一个很好的例子是,您可以在这里阅读关于模式的内容(您需要两者)。但是一个好的、简单的存储库模式也没有错

*这可能不是绝对可以证明的东西,但我个人发现,坚持可靠原则的代码往往是非常可测试的,非常容易理解和更改,而且非常健壮。再说一次,这就是我,所以YMMV!

简而言之,您不需要为每个客户CURD操作创建多个类这些操作的变更来源是相同的。请按照我下面的解释进行

单一责任原则鼓励我们以这样一种方式设计我们的系统,即任何类别都只有一个变更原因。因此,要正确实施SRP,我们需要理解“变更原因”在这里的含义

任何系统的变更原因/来源都是业务。例如,业务部门有以下部门来管理客户

  • 客户管理
  • 客户活动管理
  • 客户模式
  • 客户订单管理
  • 这意味着变更的来源可以来自这些部门中的任何一个。如果在上述示例中必须正确实施SRP,则应为每个部门创建四个类

    客户管理

    class Customer{    
       private String firstName;
       private String lastName        
       public getCustomerFullName(){
          return firstName+ " "+ lastName
        }
     }
    
     class Campaign{
          private String code;
          private String details
        }
    
    class Order{
      private Customer customer;
    
      public Order(Customer customer){
       this.customer=customer;
      }
      public List<Orders> getCustomerOrders(){
    
      }
    }
    
    客户活动管理

    class Customer{    
       private String firstName;
       private String lastName        
       public getCustomerFullName(){
          return firstName+ " "+ lastName
        }
     }
    
     class Campaign{
          private String code;
          private String details
        }
    
    class Order{
      private Customer customer;
    
      public Order(Customer customer){
       this.customer=customer;
      }
      public List<Orders> getCustomerOrders(){
    
      }
    }
    
    客户模式

    class CustomerRepository{
    
         CustomerRepository(Customer customer){
    
         }   
         public void create(){        
         }   
         public void update(){         
         }    
         public void delete(){         
         }   
      }
    
    客户订单管理

    class Customer{    
       private String firstName;
       private String lastName        
       public getCustomerFullName(){
          return firstName+ " "+ lastName
        }
     }
    
     class Campaign{
          private String code;
          private String details
        }
    
    class Order{
      private Customer customer;
    
      public Order(Customer customer){
       this.customer=customer;
      }
      public List<Orders> getCustomerOrders(){
    
      }
    }
    
    类顺序{
    私人客户;
    公共秩序(客户){
    这个。客户=客户;
    }
    公共列表getCustomerOrders(){
    }
    }
    
    回答您最初的问题CURD操作的更改源是系统的架构设计器。因此,与CURD操作相关的所有方法都可以存在于同一个类中,并且不会违反SRP。简而言之,要根据SRP设计类,提前了解更改源非常重要


    可以找到进一步的解释。但这是付费视频。

    Imo,是的,请看一下这个关于这个主题的精彩文章,以及如何解决这个问题。感谢您的详细回复,因此有效的方法是创建addcustomerrepository、deletecustomerrepository、UpdateCustomerRepository和getcustomerrepository