Реализовать новую функцию со слабой связью - PullRequest
0 голосов
/ 05 апреля 2020
trait paymentTasks{
  def calculatePayment()
  def getData()
}

 class paymentcalculator{
    override def calculatePayment() ={
    //Implementation }

    }
    override defGetData() ={
    }
   }

Как мне вызвать метод, чтобы сохранить код менее зависимым и не хотеть использовать новое ключевое слово

 class MyApp{
   val payment = new paymentcalculator
   //I don't want to instantiate like this wants this to be decoupled

 }

Пожалуйста, предложите, как мне это реализовать, также могут появиться новые изменения в будущем быть сделано без изменения существующего кода. Также предложите, если это будет более эффективно

1 Ответ

2 голосов
/ 05 апреля 2020

Если вы хотите выбрать время компиляции, просто поместите код в object

trait PaymentTasks {
  def calculatePayment()
  def getData()
}

object PaymentCalculator extends PaymentTasks {
  def calculatePayment() = ???
  def getData() = ???
}

class MyApp {
  val payment = PaymentCalculator.calculatePayment()
}

Если вы хотите выбрать время выполнения, то лучше всего использовать внедрение зависимостей и создайте объект платежа на верхнем уровне и передайте его в код, который требует его.

object SimplePaymentCalculator extends PaymentTasks

object ComplexPaymentCalculator extends PaymentTasks

class MyApp {
  def myImplementation(tasks: PaymentTasks) = {
    val payment = tasks.calculatePayment()
  }

  val payment =
    if (???) {
      SimplePaymentCalculator
    } else {
      ComplexPaymentCalculator
    }

  myImplementation(payment)
}
...