classのInterface
implementsとかの話はしていない
もっと一般的な言葉通りの「クラスのインターフェース」の話
あまりまとまっていないmrsekut.icon
用語の定義
public interface
その1つのclass内のpublicなmethodの集合
private interface
その1つのclass内のprivateなmethodの集合
Interfaceとして明示しているかどうかは問題としていないmrsekut.icon
型としてのInterfaceはこの辺に書く
public interfaceの意義
classの主要な責任を明示する
外部から実行されることが想定される
気まぐれに変更されない
安定である
他者がそこに依存しても安全
テストで完全に文書化されている
private interfaceの意義
実装の詳細に関わる
他のオブジェクトから送られてくることは想定されていない
どんな理由でも変更されうる
他者がそこに依存するのは危険
てすとでは、言及さえされないこともある
メッセージの受けては省略された形でないといけない
受け手が明示された状態では呼び出されるべきではない
地味によくわからんが、外部のobjectのことを知るなってことだよね?
a_trip.fun_factorを送ることはしてはいけません、ってそもそも不可能なんじゃないのか?Rubyができるだけか。よくわからん
安定度合いで比較する
publicなmethodの方が安定している
変更されづらい
良いインターフェース
「どのように」よりも、「何を」になっている
名前は、考えられる限り、変わり得ないものである
オプション引数として、ハッシュを取る
public/privateといキーワードは、
安定/不安定の区別を明示する
外部から見える/見えないを明示する
これら2点は全く異なる観点である
とりわけRubyがややこしいんだよな..mrsekut.icon
型としてのInterfaceはいくつかの機能を包含しているものだと思う
「型としてのInterface」自体にpublic Interfaceを全部明示するとは限らないので。
利用者目線である
利用者に使用できるものの許可を示す
利用者の考えることを減らす側面もある
react hooksとか
必要な振る舞いのみを定義した型を使う
classのpropertyや関数の引数の型の話につながる
実装者目線という感じがする
実装者目線で、他の物にできるだけ依存を減らすために使う
「同じclassを利用者によって提供するinterfaceを変える」という場合もあるはず
実体は同じclassだとしてもInterfaceを変えることで、利用者の行動に制限をかけられる
implements的側面もある
強制力的な側面
implementsの部分はかなり本質から外れていると思う
「implementsが必ず必要になる状況」って別にそんなにないのでは?とすら思う
OOPの文脈でInterfaceを説明するときって、ここを推し過ぎだと思う
ポリモーフィズムのためにやる、というのは言っていることはわかるが、実際それが上手く機能するのってめちゃくちゃ難しくないか?と思う
同じような挙動をするmethodの名前や型を強制することでその揺れを防ぐ
これが機能するためには、似たような挙動のmethodを持つclassが、少なくとも2つ以上無いと意味ない
「Interface」という名前から多少ズレていると思うmrsekut.icon
型クラス的意味合いならわかる
あれぐらい抽象的でそのプロダクト内で一般的なものなら意味があると思う
Ordを実装しているなら等価比較ができる、など
参考
日をあけて再読しよう(それにしてもRubyがわからんmrsekut.icon)
Rubyの特殊な部分を知ってから読んだほうがいい
それを前提に書かれてある
Rubyには明示的なInterfaceみたいな機能はない
private methodにもアクセスできる