Я новичок в программировании на Scala. Теперь я озадачен тем, как объявить метод biz асинхронным и функциональным способом, что реализация метода должна включать много сообщений журнала. В качестве плохой практики я пишу код следующим образом:
// trait
trait StoreService {
def create[Config]: Kleisli[Future, Config, Store]
}
// and the interpreter
trait StoreServiceInterpreter extends StoreService {
def create[Config]: Kleisli[Future, Config, Store] = Kleisli {cfg =>
// some implementation ...
log.info("bla bla bla ...")
// some implementation ...
// return a store
Store(...)
}
}
Это плохо, потому что реализация имеет побочный эффект, запишите что-нибудь на место. Итак, я изменяю объявление метода следующим образом:
// trait
trait StoreService {
def create[Config]: Kleisli[Future, Config, Writer[Vector[String], Store]]
}
// and the interpreter
trait StoreServiceInterpreter extends StoreService {
def create[Config]: Kleisli[Future, Config, Writer[Vector[String], Store]] = Kleisli {cfg =>
// some implementation ...
// log.info("bla bla bla ...")
// some implementation ...
// return a store
Writer(Vector("bla bla bla...", Store(...))
}
}
С помощью Writer побочка устранена, но код не ясен:
- Почему писатель вернулся?
Writer[Vector[String], Store]
имеет больше шума, чемStore
, есть ли способ избежать шаблонного кода и остаться без побочных эффектов? - Пишите
log
не ad-hoc! Я должен построить вектор String для хранения сообщения, используя операцию:+
или++
для добавления журнала. Я думаю, что это не специальное ведение журнала, как и записьlog.info(...)
где угодно.