Плохие стороны Scala Cake Pattern как внедрение зависимостей - PullRequest
0 голосов
/ 30 октября 2018

Давайте посмотрим на следующий очень простой пример торта:

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 Principle и Interface Segregation Principle.

Насколько я понимаю, в MyAction есть возможность переопределить метод printSomething и изменять функциональность независимо от того, какая черта PrintSomething была введена:

class MyAction{
    self:PrintSomething =>

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

Я прав?

Однако я не понимаю, как я могу нарушить Interface Segregation Principle здесь. Кто-нибудь может уточнить?

1 Ответ

0 голосов
/ 30 октября 2018

Я не вижу конфликта с принципом открытого-закрытого. Все ваши классы и черты открыты для расширения и закрыты для модификации. А поскольку у них есть только один метод, принцип разделения интерфейса на самом деле не применяется!

Даже если вы переопределите printSomeThing в вашем MyAction классе, вы все равно не нарушили ни один из этих принципов. Все объекты остаются открытыми для расширения (вы можете расширить их) и закрытыми для модификации (вы не можете изменить их поведение). Экземпляр PrintSomethingToLog всегда будет печататься в журнале; Вы не можете изменить его для печати на консоли.

Экземпляр PrintSomething может иметь различные реализации printSomeThing, но это просто полиморфизм через наследование; это не означает, что PrintSomething открыт для модификации, потому что PrintSomething - это интерфейс, а не конкретный класс, и вы не можете изменить интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...