Scala Cake Pattern的不良方面作为依赖项注入

时间:2018-10-29 21:21:38

标签: scala dependency-injection dependency-management

让我们看下面的非常简单的蛋糕图案示例:

trait PrintSomething{

  def printSomeThing(s:String):Unit
}

trait PrintSomethingToConsole extends PrintSomething{

  override def printSomeThing(s: String): Unit = println("Print To Console!!!")
}

trait PrintSomethingToLog extends PrintSomething{

  override def printSomeThing(s: String): Unit = println("Print To Log!!!")
}

class MyAction{

  self:PrintSomething =>

  printSomeThing("This is it")
}

new MyAction with PrintSomethingToConsole
new MyAction with PrintSomethingToLog

我在一些博客中看到这种模式的坏处正在打破 Open-Close PrincipleInterface Segregation Principle

据我了解,无论注入了哪种printSomething特性,都可以重写MyAction中的PrintSomething方法并修改功能:

class MyAction{
    self:PrintSomething =>

    override def printSomeThing(s: String): Unit = println("I just Broke Open-Close Principle!!!!! ")
  }

我对吗?

但是我不明白如何违反这里的Interface Segregation Principle。有人可以详细说明吗?

1 个答案:

答案 0 :(得分:1)

我认为与开放-封闭原则没有任何冲突。您所有的类和特征都可以进行扩展,而封闭则可以进行修改。而且,由于它们只有一个方法,所以接口隔离原理实际上并不适用!

即使您在printSomeThing类中重写MyAction,您仍然没有违反任何一个原则。所有对象保持打开状态以进行扩展(可以扩展它们),并关闭状态以进行修改(不能更改其行为)。 PrintSomethingToLog的实例将始终打印到日志;您不能修改它以打印到控制台。

PrintSomething的实例可能具有printSomeThing的不同实现,但这仅仅是通过继承实现的多态性。这并不意味着PrintSomething是开放的,因为PrintSomething是一个接口,而不是一个具体的类,并且您不能更改该接口。