You Don't Need Class
ほとんどの場合にクラスを使う必要がないように感じる クラスを使うことが目的化していて、何も恩恵を受けられていないように感じ始めた
データ型を定義できてそれに関連する関数をまとめられるというだけでも十分な恩恵の気がする
これが本質で継承は方法論の一つでしかないと思う
継承しか見ていないと必須のように思い込んでしまうバグがある
クラスを使うとき別に継承を使う必要はない。使うときは考え抜いた末に使う基素.icon
クラスが無くても十分コードが書けるというのをLISPから教わった LISPやるまではJavaとかPythonとかの経験しかなかったからOOP信者になりかけてたkuuote.icon
こういうエントリ皆立てる世の中になったのみる度に関数型言語流行ってくれてよかったと思うrtree.icon
クラスの恩恵が受けられるケース?
ただし作りがひどいと「それ外で状態持ったほうが良くない?」になる
状態遷移(メソッドが自分自身のフィールドを書き換える)がない場合はカリー化でもよさそう。mgn901.icon 多くのオブジェクトが作られるとき
1つ程度なら大して問題にならないけど、何個もあると"どれが何なのか"が分かりずらくなってしまう
多態性を実現するとき
データ+関数の組み合わせだと、同じネームスペースで関数名が衝突してしまって同じにできない
nominal typeがあって、その型に対してoverloadできるような言語は例外
むしろそんな言語にはクラスがない気もする
そもそも同じ名前で異なる処理をするべきではないという過激的な考え方もできそう
特定の性質を満たすデータだけ受け取るようにすればある程度は実用的じゃないかな
特定の条件さえ満たしていれば、どんな実装であっても同じ処理を適用できるようにする
add = arr => arr[0] + arr[1]には[1, 2]、['a', 'b']を渡しても意味のある処理ができる
これも一種の多態性じゃないか?(どっちかというと多相?)
頭悪い人がプログラミングするとき
こういう概念つくって、こういうの持たせて、こいつとこいつをやりとりさせて、みたいな感じで少しずつ構築していける
頭いい人は手続き的にガッと書いたり、構造体+αくらいの「まとめる力」で上手くやれるけど
設計レベルで概念的に「理解しやすいように」つくれるから本当に助かっているsta.iconyosider.icon
クラス含めて、OOPのおかげで、自分で書いた数千行以上のコードも扱えるようになった
手続きとか単純にまとめる機能だけでは1000~2000くらいでギブだった(学生時代どうしてもこの壁を越えられなかった)
認知資源を減らしたいとき
クラスつくれば隠蔽できる
しやすい
処理の共通化が(意識的に)妨げられてしまう
データと関連する関数が1つのクラスにまとめられたものとして提供されるから手を入れずらくなってしまう
これは目的の一つだから目的が達成されている基素.icon
得にクラスを使っている側から見ると、クラスは"完成したもの"として見えてしまう
同じ処理は関数にまとめるという原則がままならくなってしまう
どういう意味だろう?基素.icon
クラスに手を付けられない/付けずらい場合のほかに、メソッドに書くほど汎用的な処理じゃない場合とか
「クラスをどう使うか」に囚われてしまう
専門的で大きな機能を作ってしまいやすくなる?
もちろんクラスを使っても移譲したりして、小さな機能を組み合せることはできるけど、少し複雑になってしまう
状態や関連関数を合わせたオブジェクトよりも、関数自体を組み合せるほうがシンプル
な時もあるけど、常にってことじゃないですような?基素.icon
class-free オブジェクト指向なるものが
JavaScriptのことかな?
Javascriptもclassある
prototypeは結局クラスとあんまり変わらないような気が
いやメソッドをあと付けできるという点では違うか
それを言えばRubyはクラスでもメソッドを後付けできるのでプライベート変数の意味がないbsahd.icon
そもそもオブジェクト指向の必要条件ってなんだろう
クラスがないGo,Rust(のドキュメント)でもオブジェクト指向と言っているから、おそらくクラスは必要条件ではない GoとかRustとかってクラスみたいなの無いんですか? 増井俊之.icon
構造体にメソッドを付けられる
オブジェクト指向とは何ぞや? みたいな議論が昔は盛んでしたね 増井俊之.icon 1980年代ぐらい?
OOPSLAが超にぎわってたし、日本でもWOOCという学会やってたりした でも最近は流行してない...
1990年のOOPSLAに行ってみたら賑わいっぷりに超驚いた 増井俊之.icon
classよりprototypeがイイ! みたいな論文が1980年代に出てたりしたし
prototypeはメモリ消費量を抑えられるwho.icon
prototypeのclass構文がいいかも