interfaceの広さが変わらないwrapperは無意味?
ほんとうに無意味?
内部の引数の種類ごとにラッパーした関数を用意してもインターフェースは何も変わっていなさそう
例えば、5段階のlogを扱う関数があったとして、
内部ではlogの5段階を引数で管理するが、
log :: Level -> Body -> Log
外部向けには、5種類のログ関数を公開する
warnLog :: Body -> Log
errorLog :: Body -> Log
...
このとき、このmoduleにおけるinterfaceの広さとしては何も変わっていない
利用者視点だと、
引数で5つのレベルを指定するか、
moduleが公開している5つの関数のどれを使うか
なので、5個から選択してる点では同じ
logのみを公開すると、それに依存する数は増えるが、
5段階毎に公開すれば、雑に5で割ったぐらいの依存数になる
依存の数を減らしたらそれでokなのか?というのが気になるポイント
後者のほうが個別の変更をしやすいか?
warnLogのinterfaceを保ったまま変更したときに、それはerrorLogに全く影響しない
どういう意図で、関数に分けて公開しましたか?という話か
例えば、1つのログツールだけを使用しているときは、どっちをとっても特に変わらないだろう
しかし、ログツールが2つになったとき、
code:ts
const warnLog = (..) => {
tool1warnLog(..)
tool2warnLog(..)
}
のように増やすことができる
ツールによっては、errorには反応させるが、warnは無視するなどもある
このときその「ログモジュールのinterface」だけを公開することができ、「内部でいくつのログツールを使っているか」というのは隠蔽できる
極論いえば、
任意の関数は1つの関数と複雑な引数で表現できるかmrsekut.icon
numberという型を直接参照せず、、Age, Priceのようなレイヤーを入れる
これは抽象化と言うより、具体化、?
多くのものがnumberに依存するのを避け、使われ方をグルーピングしているような
逆に見て、number = Age | Priceとすれば、
AgeやPriceを抽象化したものがnumberだと捉えられる
calcPriceのwrap
Jotaiのatomを
export atom
export atomValue
export setAtom
に分けて公開することの意義