26/07/08 03:17:29.77 n/AiM/7+.net
それは間違いでそのためにクラスなどのメソッドを直接生やしてはいけない
まず最初にその前提となる依存性逆転もモックもクラスなどから完全に独立したインターフェースなどの抽象のみに依存する形で構築することで達成される
つまり「インターフェースのみ使う側」と「実装してインターフェースのみ公開する側」を全ての階層や関係性で達成する
モックは互いに片方をダミーにして入れ替える
592:デフォルトの名無しさん
26/07/08 07:29:02.17 YUnnK2DK.net
まあ、UT考えたらインターフェースの方が楽だからなぁ
なんて邪道かなぁ?
593:デフォルトの名無しさん
26/07/08 10:10:12.31 032zapuD.net
そこは全ての言語で同じ結論になってる
古い言語は仕方ないが新たな言語Go Nim Rust Zigなどはクラスを完全に捨てて言語仕様から外した
そして言語毎に異なるがインターフェース相当を用いる
つまりクラスは不要なもの
594:デフォルトの名無しさん
26/07/08 11:17:21.84 2VwKSqwX.net
>>593
全然同じ結論じゃねーよ
Nimはクラス相当あるしクラス相当からクラス相当への実装継承もある
Zigはクラス相当どころかインターフェース相当も捨ててる
嘘も大概しろな
595:デフォルトの名無しさん
26/07/08 11:30:41.94 IfhGTTfA.net
>>594
Zigは構造的インターフェース
型が異なっても同じインターフェースなら使える点で同じ
596:デフォルトの名無しさん
26/07/08 11:37:11.60 3P4UxoLe.net
classではないものを便宜上classと呼んでclassだと思い込んでるだけの共同幻想
597:デフォルトの名無しさん
26/07/08 11:38:40.14 3P4UxoLe.net
RustのTraitは実質interface
598:デフォルトの名無しさん
26/07/08 11:40:32.73 FFwmK7p4.net
>>589-590
別にそんなものがなくてもプログラミング言語の大前提として、変数への書き込みと変数からの書き出しは逆の構文になるわけだから、他のメソッドがないのにクラスに格納してsetter/getterを設ける必要はないし、そうでないと区別がつかないならそちらの方が問題
599:デフォルトの名無しさん
26/07/08 11:41:16.67 XRhwYd5D.net
>>594
Nimに実装継承はないよ
Nimのオブジェクト継承は実装継承ではない
実装継承になりうるメソッド継承がそもそも存在しないんだよ
全く別実装のオーバーロードになる
フィールド継承はあるけどこれも実装継承ではない
600:デフォルトの名無しさん
26/07/08 11:43:39.54 FFwmK7p4.net
>>593
Nim は他より生まれた時期も少し古いし、立ち位置や思想も違う
Go / Rust / Zig は C / C++ の影響を強く受けているが、Nim は Python の影響を強く受けている
601:デフォルトの名無しさん
26/07/08 11:54:07.02 3kNQZQgh.net
>>600
そのモダンな4つの言語は背景も思想も言語仕様も全くバラバラなんだけど
「クラスがない」
「実装継承がない」
という点だけは完全に一致してるんだよ
つまりクラスと実装継承は悪手であることが判明した共通の認識がプログラミング言語界にある
Javaの産みの親のジェームズ・ゴスリンでさえもJavaを再設計できるなら実装継承つまりクラス継承を外すと言ってるくらい共通の認識
602:デフォルトの名無しさん
26/07/08 11:55:51.78 FFwmK7p4.net
ただ、設計思想としては最近の言語はどれも
合成/委譲 >>>>> 実装継承
であることは共通している
そもそも >>500 にもあるように実装継承はオブジェクト指向の邪魔になることが多い
603:デフォルトの名無しさん
26/07/08 11:56:47.59 FFwmK7p4.net
>>601
クラスがないことが共通点というのは少し言い過ぎ
他は >>602 に書いたけど
604:デフォルトの名無しさん
26/07/08 11:59:37.14 FFwmK7p4.net
強いて言えばクラスという名称はないけど、そこはあまり重要じゃなくてその後の設計がどうかって部分が大きい
605:デフォルトの名無しさん
26/07/08 12:04:54.37 FFwmK7p4.net
>>568
正しい意味でメッセージパッシングをしているなら、それは厳格に適用された方がいいし、適用できないならそのやり方自体があっていない
オブジェクト指向について一番重要なことは、何にでも使える万能薬ではなく、特定の構造を改善する特効薬だということ
606:デフォルトの名無しさん
26/07/08 12:07:55.88 SErvtKUw.net
今どきクラス継承(実装継承)を常用してるプログラマーは下手プログラマー
インターフェース継承を用いた方が疎結合の良いプログラムになる
607:デフォルトの名無しさん
26/07/08 12:42:51.19 DzG1nXb9.net
>>593
GoやRustではメソッド生やせる構造体がクラス相当
つまりクラスは必要なもの
608:デフォルトの名無しさん
26/07/08 12:43:52.52 DzG1nXb9.net
>>597
RustのTraitをインターフェース相当と呼べるなら
メソッドを生やせる構造体は間違いなくクラス相当と呼べる
609:デフォルトの名無しさん
26/07/08 12:50:11.72 DzG1nXb9.net
>>606
今はインターフェースのデフォルト実装という形で実装継承が常用されている
つまりインターフェース継承は実装継承批判者が言うところの「密結合」になっている
610:デフォルトの名無しさん
26/07/08 12:51:25.67 lLJlQgVi.net
>>607
バカだな
クラスと命名されてるものにはクラス継承すなわち悪の実装継承があるだろ
クラスと命名されてないものには悪の実装継承がない
明確な区別がある
611:デフォルトの名無しさん
26/07/08 12:55:47.00 +Q+JwoGf.net
>>609
インターフェースのみを用いるデフォルト実装は実装継承ではないです
なぜなら親は具体的な型ではないからです
つまりそのインターフェース継承する子たちに共通の内部構造は存在しません
つまり実装継承でない明瞭な証拠です