Dependency injection 二传手和接球手真的打破了SRP吗?

Dependency injection 二传手和接球手真的打破了SRP吗?,dependency-injection,solid-principles,single-responsibility-principle,Dependency Injection,Solid Principles,Single Responsibility Principle,我最近读到他们如何明确地打破了SRP。现在我完全糊涂了,因为我用setter和getter编写了很长一段时间的单个类 另外,我也做过,但这与SRP 嗯,乍一看,能手和二传手都没有打破单一责任原则,因为他们的逻辑只“属于”当前类别。他们可以访问/写入“服务于”单一目的的类成员。好的 但是等等,让我们先定义基本术语: 数据访问=设置器和获取器 数据处理=数据处理、CRUD等操作、验证等 如果是这样,那么我们在一个类中有两个不同的职责,从而打破了SRP 让我们假设一下,为了不破坏SRP,我们将在不同

我最近读到他们如何明确地打破了SRP。现在我完全糊涂了,因为我用setter和getter编写了很长一段时间的单个类

另外,我也做过,但这与SRP

嗯,乍一看,能手和二传手都没有打破单一责任原则,因为他们的逻辑只“属于”当前类别。他们可以访问/写入“服务于”单一目的的类成员。好的

但是等等,让我们先定义基本术语:

数据访问=设置器和获取器

数据处理=数据处理、CRUD等操作、验证等

如果是这样,那么我们在一个类中有两个不同的职责,从而打破了SRP


让我们假设一下,为了不破坏SRP,我们将在不同的类中定义数据访问和数据操作

class DA { // <- Data Access
  public string getName() {
      return this.name;
  }

  public string setName(name) {
     this.name = name;
  }
}

class DataHandler {
     public DataHandler(da) { // <- Inject an instance of DA
         this.da = da;
     }

     public bool validate() {
          // validation stuff
     }
}

class DA{/setter和getter会破坏SRP吗?

setter和getter不是重点。SRP的重点是一个类应该只有一个职责

表示域对象是一项很大的责任。这样做的对象通常称为“数据对象”。由于语言设计或约定,数据对象通常有setter和getter,但它们本身并不是一项单独的责任;它们只是管道

将数据对象进出持久存储区是另一项重要职责。执行此操作的对象通常称为“数据访问对象”(DAO).DAO不是数据对象,可能不需要为其管理的数据对象类型的属性使用setter和getter,尽管我可以想象一个非常糟糕的框架需要它们。与DAO一样,其他类型的对象也需要使用数据对象(显示它们、序列化和反序列化它们、对它们执行计算等)并且不是数据对象本身可能不需要镜像数据对象的setter和getter

因此,拥有setter和getter是一个标志,表明您的对象是一个数据对象。如果它是一个数据对象,同时也是一个DAO或有其他重大责任,那么它可能确实违反了SRP

旁注:您提到了验证。在典型的应用程序中,验证(至少是单个数据对象的验证)属于数据对象本身,因为表示域对象和强制实现域对象属性之间的单个正确性和关系的责任几乎相同

即使我只有一个setter和getter,我也应该创建另一个DA类吗?

一般来说,是的。重点不是属性的数量;重点是表示和访问是两个不同的职责,属于不同的类

class DA { // <- Data Access
  public string getName() {
      return this.name;
  }

  public string setName(name) {
     this.name = name;
  }
}

class DataHandler {
     public DataHandler(da) { // <- Inject an instance of DA
         this.da = da;
     }

     public bool validate() {
          // validation stuff
     }
}
典型的应用程序有许多域对象,因此,如果将域对象与其访问分离是有意义的,那么对所有域对象(甚至是单属性对象)一致地进行分离也是有意义的

依赖注入总是答案吗?


这取决于您的体系结构和框架。您可能有不可变的数据对象和DAO,它们的方法将它们作为参数;那里没有DI(尽管您可以将DAO注入到使用它们的更高级别组件中)。您可能有DAO,它们是用数据对象实例化的,或者有DAO引用的数据对象实例化的(我见过但不喜欢的两种模式);您可能需要DI。无论哪种方式,它与讨论的其余部分都没有多大关系。

::您可能应该编辑。如果您违反了SRP,您肯定应该使用DI。组合而不是扩展,以及所有这些。如果您查看我之前的评论(以及我的pastebin答案)你可能知道我是从哪里来的。即使他们没有破坏SRP,他们仍然不是干净的IMHO。问题是命名,如果你有一个名为“name”的getter setter,你在函数名中就不再有动词了。你可以使用“getSetName”,但它有两个动词,并尖叫“不止一件事”.我还认为,由于名字的怪异,它打破了最不令人惊讶的原则。