Я читал о подходе OO «свободный интерфейс» в Java , JavaScript и Scala , и мне нравится его внешний вид, но мы изо всех сил пытались понять, как согласовать его с более основанным на типах / функциональным подходом в Scala.
Чтобы дать очень конкретный пример того, что я имею в виду: я написал клиент API, который можно вызывать следующим образом:
val response = MyTargetApi.get("orders", 24)
Возвращаемое значение из get ()
- это Tuple3
тип, называемый RestfulResponse
, как определено в моем объекте пакета :
// 1. Return code
// 2. Response headers
// 2. Response body (Option)
type RestfulResponse = (Int, List[String], Option[String])
Это отлично работает - и я действительно не хочу жертвовать функциональной простотой возвращаемого значения кортежа - но я хотел бы расширить библиотеку различными вызовами «беглых» методов, возможно, примерно так:
val response = MyTargetApi.get("customers", 55).throwIfError()
// Or perhaps:
MyTargetApi.get("orders", 24).debugPrint(verbose=true)
Как я могу объединить функциональную простоту get ()
, возвращающую типизированный кортеж (или аналогичный) с возможностью добавить к моему API дополнительные «плавные» возможности?