https://twitter.com/mxtnr/status/759409328956776448
Родилась интересная концепция, которая лучше всего может заработать в ФП-языках (но применимо и в таких языках как js).
Пример: есть блок popup2 с параметром mainOffset и дефолтным значением 5, если задан параметр theme=normal, иначе 0
И есть блок tooltip, который композируются над popup2.
Если задан параметр блока tooltip tail: false, он увеличивает mainOffset на 5
Но если mainOffset не задан, то tooltip не знает, что делать.
Приходится копипастить логику про дефолт, а это ужасно.
Ответственность за дефолты должна лежать только на последних звеньях цепи и не должна дублироваться.
Если дефолт поменяется, гарантированно, возникнет неявный баг.
Концепция предлагает посылать не просто, условно, Maybe<T>, а например ValOp<Maybe<T>,T> (или более строго и обощённо: ValOp<Maybe<T>, Operator T) и реализовывать полиморфный popup2, принимающий и Maybe<T>, и ValOp<Maybe<T>,T>.
Примеры вызовов:
tooltip(mainOffset=undefined, tail = false, theme = normal)
// -> popup2(ValOp(undefined, +5), theme = normal) // -> mainOffset == 10
tooltip(mainOffset=10, tail = false, theme = normal)
// -> popup2(ValOp(10, +5), theme = normal) // -> mainOffset == 15
tooltip(mainOffset=20, theme = normal)
// -> popup2(ValOp(20, +0), theme = normal) // -> mainOffset == 20
tooltip(mainOffset=undefined, tail = false, theme = action)
// -> popup2(ValOp(undefined, +5), theme = action) // -> mainOffset == 5
tooltip(mainOffset=20, theme = action)
// -> popup2(ValOp(20, +0), theme = action) // -> mainOffset == 20