Назначение паттерна, в котором объект расширяет одноименный признак - объект Live extends Live
Я пытаюсь Zio.
Я не понимаю, почему Live
добавляется как Trait
, а затем object
предоставляется, например:
object Live extends Live
Этот узор встречается в разных местах, например zio.console.Console
.
Есть ли причина или есть случаи, когда в этом есть смысл?
2 ответа
То, что вы видите в ЗиО является использование шаблона под названием Самоотверженный Черта.
Чтобы реализовать паттерн самоотверженности, вы просто предоставляете объект-компаньон для характеристики, которая сама смешивается с этой чертой.
trait Greeting {
def greet() { println("hi there") }
}
object Greeting extends Greeting
Затем у пользователя библиотеки есть выбор: смешать Greeting
:
object MixinExample extends Application with Greeting {
greet()
}
или импортировать членов Greeting
сопутствующий объект, например:
import Greeting._
object ImportExample extends Application {
greet()
}
Просто как дополнение к ответу Кшиштофа Атласика.
Как упоминалось в комментарии jq170727, вы найдете здесь эти два случая: Introduction
-a-database-module
Object
:
В худшем случае, если у нас мало времени и нам нужно отправить код сегодня, может быть, мы решим предоставить производственную базу данных везде, где мы вызываем InvitFriends.
inviteFriends(userId).provide(DatabaseLive)
В этом случае вместо использования DefaultRuntime, поставляемого с ZIO, мы можем определить нашу собственную среду выполнения, которая предоставляет модуль производственной базы данных):
val myRuntime = Runtime(DatabaseLive, PlatformLive)
Trait
:
Когда у вас несколько сред выполнения.
val myRuntime =
Runtime(
new DatabaseLive
with SocialLive
with EmailLive, PlatformLive)