Скажем,
class ClientFunc {
def client(s: String): Future[Service] = ....
def m1(s: String) = {
client(s).map( ...... )
}
...//there are multiple such methods like m1 in this class which
depends on "def client".
}
Теперь нам нужно добавить еще одного клиента того же типа, с другой реализацией, и мы хотим использовать его вместе с существующим, основываясь на требованиях.
Таким образом, есть два способа решения этой проблемы.Решение первое: использование наследования, например, сделать метод клиента абстрактным в родительском и предоставить дочерние классы и clientB для реализаций, для двух разных клиентов.
class clientA extends ClientFunc {
def client(s: String): Future[Service] = ....
}
class clientB extends ClientFunc {
def client(s: String): Future[Service] = ....
}
Использование как обычно,
clientAInstance.m1("str")
and
clientBInstance.m1("str")
Какдля каждого случая использования я должен использовать clientA и clientB одновременно, поэтому мне нужно внедрить обоих клиентов в сервис.
Другое решение: сделать "def m1" как функции более высокого порядка и передать в него клиента, сохранить класс ClientFunc как есть, добавить еще одну функцию для другого клиента, например (def clientB),
class ClientFunc {
def clientA(s: String): Future[Service] = ....
def clientB(s: String): Future[Service] = ....
def m1(s: String, cl:String => Future[Service]) = {
cl(s).map( ...... )
}
}
Теперь, когда мне нужно позвонить, я просто позвоню, как,
ClientFuncInstance.m1("str", ClientFuncInstance.clientA)
and
ClientFuncInstance.m1("str", ClientFuncInstance.clientB)
нет необходимости вводить ClientFunc два раза.
Вопрос в том, какой из них предпочтительнее в Scala/ функциональное программирование?& Зачем?если есть какой-нибудь другой способ, пожалуйста, предложите