前スレ
オブジェクト指向はオワコン?
https://mevius.5ch.io/test/read.cgi/tech/1721393540/
オブジェクト指向はオワコン? part2
レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん
2026/08/13(木) 14:38:03.02ID:pdAcKRXu2026/08/13(木) 14:52:49.47ID:lo6KubsW
メッセージパッシング自体はもちろん片方向
AからBへメッセージを出した時
それに対してBは何もしなくてもいいし
Aにメッセージを出してもいいし
Cにメッセージを出してもいい
メッセージパッシングをたまたま関数呼び出しで実装する時
AからBへのメッセージと
それに対するBからAへのメッセージを
まとめて関数呼び出しとその戻り値で実装してもよい
しなくてもよい
そのように往復を関数呼び出しで実装する時
その戻りは同期にも非同期にも成り得る
現実にはどちらも対応できないと困る
AからBへメッセージを出した時
それに対してBは何もしなくてもいいし
Aにメッセージを出してもいいし
Cにメッセージを出してもいい
メッセージパッシングをたまたま関数呼び出しで実装する時
AからBへのメッセージと
それに対するBからAへのメッセージを
まとめて関数呼び出しとその戻り値で実装してもよい
しなくてもよい
そのように往復を関数呼び出しで実装する時
その戻りは同期にも非同期にも成り得る
現実にはどちらも対応できないと困る
3デフォルトの名無しさん
2026/08/13(木) 20:17:42.08ID:pdAcKRXu 雨の日は傘を差しても良いし差さなくても良いみたいな話だな
2026/08/13(木) 20:47:27.20ID:/OzuP8IN
小さなサンプルプログラムみたいなものならいざ知らず
ある程度規模のある実用的なソフトウエアシステムを
わざわざアクターモデルで記述する何てめんどくさいこと今どきあるの?
おれは聞いたことがないし、そんな回りくどいやりかた、やれと言われてもしたくないわ
ある程度規模のある実用的なソフトウエアシステムを
わざわざアクターモデルで記述する何てめんどくさいこと今どきあるの?
おれは聞いたことがないし、そんな回りくどいやりかた、やれと言われてもしたくないわ
2026/08/13(木) 20:50:46.65ID:uT1tL5il
Goルーチン楽だよ
非同期アレルギーの爺さん婆さんには無理かな
非同期アレルギーの爺さん婆さんには無理かな
2026/08/13(木) 20:56:31.72ID:pb5y8T8i
なんじゃと!フガフガ
6809のアセンブラでコルーチンを記述していたこのワシに向かって何という暴言
まだまだ、若いもんには負けん!
そこに直れ、根性叩き直してくれるわ
喝っー
6809のアセンブラでコルーチンを記述していたこのワシに向かって何という暴言
まだまだ、若いもんには負けん!
そこに直れ、根性叩き直してくれるわ
喝っー
2026/08/13(木) 20:59:20.13ID:sSd0uIXu
冗談さておき、むかしコルーチンを記述しやすかった言語があったけど
あれなんだったっけな
Mofula-2 だったっけ、Occam だったっけ、
忘れちまったわい
あれなんだったっけな
Mofula-2 だったっけ、Occam だったっけ、
忘れちまったわい
8デフォルトの名無しさん
2026/08/13(木) 20:59:28.53ID:3yw+gA4E >>5
自分でデバッグもできないコード書いてトンズラする馬鹿
自分でデバッグもできないコード書いてトンズラする馬鹿
2026/08/13(木) 21:26:19.35ID:DgufQVX8
Modula-2っすかね。Lilithマシンもあったなぁ。
10デフォルトの名無しさん
2026/08/13(木) 21:49:49.92ID:pdAcKRXu アクターモデルは仕事でもプライベートでも使ったことない、必要としたことがないんだよな、どういうケースにハマるんだろうと思ってAIに聞いてみた
一般的なエンタープライズアプリはDBにデータを永続化して終わるからアクターが必要になることはないんだってさ、DBやキューを使って短命な処理の連続にしたほうが単純で性能が良いそう
アクターモデルはオンラインゲームのNPCとかIoTデバイスなど長寿命の処理に向いてるそう
ソフトウェアよりミドルウェアに近いものなんかね
一般的なエンタープライズアプリはDBにデータを永続化して終わるからアクターが必要になることはないんだってさ、DBやキューを使って短命な処理の連続にしたほうが単純で性能が良いそう
アクターモデルはオンラインゲームのNPCとかIoTデバイスなど長寿命の処理に向いてるそう
ソフトウェアよりミドルウェアに近いものなんかね
11デフォルトの名無しさん
2026/08/13(木) 21:52:36.06ID:pdAcKRXu12デフォルトの名無しさん
2026/08/13(木) 22:20:01.05ID:beXELhsO 世も末じゃ
2026/08/13(木) 22:30:09.16ID:mqqnxowM
2026/08/13(木) 22:41:40.15ID:thl5TbU4
静的で同期なmthod callで済むことをわざわざ動的で非同期に書けば書ける、
実装のしやすさ、動作の把握・理解のしやすさ、視認性、メンテ性、テストデバッグのしやすさなど
すべての面でディメリットばかり増える。
静的に書けるものはなるべく静的に、同期で書けるものはなるべく同期でかく
というのがプログラミングの鉄則であり基本セオリー
それでも動的で非同期な記述がオブジェクト指向のメッセージパッシングにあたる一環というならばw
そのせいでオブジェクト指向の欠点:視認性の悪さ、scopeやextentの把握しにくさが
動的非同期によりまた一つ増えるだけのような気がする
実装のしやすさ、動作の把握・理解のしやすさ、視認性、メンテ性、テストデバッグのしやすさなど
すべての面でディメリットばかり増える。
静的に書けるものはなるべく静的に、同期で書けるものはなるべく同期でかく
というのがプログラミングの鉄則であり基本セオリー
それでも動的で非同期な記述がオブジェクト指向のメッセージパッシングにあたる一環というならばw
そのせいでオブジェクト指向の欠点:視認性の悪さ、scopeやextentの把握しにくさが
動的非同期によりまた一つ増えるだけのような気がする
2026/08/13(木) 22:45:38.03ID:51v2ue8P
なぜ各プログラミング言語が非同期に対応したのか理解できてないやつがいるな
2026/08/13(木) 22:50:01.83ID:oaHWRr6T
2026/08/13(木) 22:55:34.62ID:2XNZo5jp
>>10
今は知らんけど少し前ならニコニコ(Erlang/Elixir)とかPaypal(Akka/Scala)とか中核の処理でアクターモデル使ってた
最近だとSwiftがネイティブにアクターモデルをサポートしてるからiOSアプリやmacOSアプリで普通に使われてる
今は知らんけど少し前ならニコニコ(Erlang/Elixir)とかPaypal(Akka/Scala)とか中核の処理でアクターモデル使ってた
最近だとSwiftがネイティブにアクターモデルをサポートしてるからiOSアプリやmacOSアプリで普通に使われてる
2026/08/13(木) 22:57:23.60ID:2XNZo5jp
goroutineはオブジェクトでもなければアクターでもないから
ハル夫に騙されちゃダメだぞ
ハル夫に騙されちゃダメだぞ
2026/08/13(木) 22:58:49.32ID:BKmH7OZR
もちろん非同期は必要で、その時にオブジェクト指向プログラミングをどうするか?という話なんでしょ。
2026/08/13(木) 23:07:30.09ID:s6EvJTr+
そもそもオブジェクト指向の定義は?
2026/08/13(木) 23:17:41.17ID:oaHWRr6T
前にも書いたけど、絶対必須要件はオブジェクトscopeを持つこと
あとは言い方極端だがおまけみたいなもの
継承とかアクセス修飾とかカプセル化とかポリモフィズムや多態などは
あったりなかったり
あとは言い方極端だがおまけみたいなもの
継承とかアクセス修飾とかカプセル化とかポリモフィズムや多態などは
あったりなかったり
2026/08/13(木) 23:17:43.26ID:IyRGUpbW
>>20
オブジェクトがメッセージパッシングし合って内部状態を更新
オブジェクトがメッセージパッシングし合って内部状態を更新
2026/08/13(木) 23:19:02.25ID:oaHWRr6T
2026/08/13(木) 23:27:52.87ID:mWXZfEjI
>>23
クラスがそうしてるよ
クラスがそうしてるよ
2026/08/13(木) 23:32:36.24ID:OBTyeVRS
>>24
そういう使い方もできるけど
そのためのものではなかったんだよ。
それがそういう(ある面害のある)使われ方ばっかされるようになっちゃって
流行っちゃって、よみにくいくそコードが大量生産されて
あれ?おかしいなって気が付く人が増えて来た←いまここ
そういう使い方もできるけど
そのためのものではなかったんだよ。
それがそういう(ある面害のある)使われ方ばっかされるようになっちゃって
流行っちゃって、よみにくいくそコードが大量生産されて
あれ?おかしいなって気が付く人が増えて来た←いまここ
2026/08/13(木) 23:37:07.12ID:p75qjYLo
クラスは害悪とよく聞くけどそんなに重症なの?
2026/08/13(木) 23:51:45.92ID:OBTyeVRS
残念ながら変な使い方を乱用・濫用するとプログラムをややこしくわかりにくくさせる
上手く律した使い方が人間には難しい特賞の仕組みなのかもしれん
上手く律した使い方が人間には難しい特賞の仕組みなのかもしれん
2026/08/13(木) 23:52:08.70ID:OBTyeVRS
特徴な
2026/08/14(金) 00:13:32.03ID:UF3wd4nI
上にも書いたけど、プログラム記述の鉄則・大セオリーは
・静的でよい物はなるべく静的に。どうしても動的にしなければならないところだけ動的に。
・同期でよい物はなるべく同期に。どうしても動的にしなければならないところだけ動的に。
それに加えて
・extentが独立な状態変数は、どうしてもそうしなければならないもの以外、なるべく状態変数にしない
知恵を絞ってそういったセオリーを編み出して、複雑化大規模化するプログラムを開発しやすくしわかりやすさ管理しやすさを大切にし
なんとかてにおえるようにしようとしてきた
ところがオブジェクト指向の変なやり方の流行はそれを台無しにしてしまったんだよ
特にextentとscope。
C言語で明確化された、ネストしたシンプルで分かりやすく
そしてextentと対応付きやすいscopy
これがソフトウエア開発にどのくらい役に立ったか
これもダメにしちゃった
・静的でよい物はなるべく静的に。どうしても動的にしなければならないところだけ動的に。
・同期でよい物はなるべく同期に。どうしても動的にしなければならないところだけ動的に。
それに加えて
・extentが独立な状態変数は、どうしてもそうしなければならないもの以外、なるべく状態変数にしない
知恵を絞ってそういったセオリーを編み出して、複雑化大規模化するプログラムを開発しやすくしわかりやすさ管理しやすさを大切にし
なんとかてにおえるようにしようとしてきた
ところがオブジェクト指向の変なやり方の流行はそれを台無しにしてしまったんだよ
特にextentとscope。
C言語で明確化された、ネストしたシンプルで分かりやすく
そしてextentと対応付きやすいscopy
これがソフトウエア開発にどのくらい役に立ったか
これもダメにしちゃった
2026/08/14(金) 00:22:55.55ID:UF3wd4nI
クラスとか継承というものがさ、有効な場面てのはあるよ
それはそんなに多くのシーンではないと個人的には考えているけどあることはあるよ。
でもそういう有用なシーンに上手く絞って、律した使い方をし、有効な特徴だけを
上手くひきだすことができたかというと、どうも人間にはできなかったみたいで、
使い方に自由度があったり、ちょとした便利機能があれば近視眼的によさそうだと使ってみたり
よく言えば応用、悪く言えば濫用が止まらない。害のある面をコントロール抑制できない。
そしてオブジェクト指向とは、といえば、皆それぞれ変な妄想が膨らんで止まらない
便利かな点はあるかもしれないけど、害を性h¥魚できない。sれだったらもういっそ止めちゃったほうがましって
考えも出てくるわけよ
それはそんなに多くのシーンではないと個人的には考えているけどあることはあるよ。
でもそういう有用なシーンに上手く絞って、律した使い方をし、有効な特徴だけを
上手くひきだすことができたかというと、どうも人間にはできなかったみたいで、
使い方に自由度があったり、ちょとした便利機能があれば近視眼的によさそうだと使ってみたり
よく言えば応用、悪く言えば濫用が止まらない。害のある面をコントロール抑制できない。
そしてオブジェクト指向とは、といえば、皆それぞれ変な妄想が膨らんで止まらない
便利かな点はあるかもしれないけど、害を性h¥魚できない。sれだったらもういっそ止めちゃったほうがましって
考えも出てくるわけよ
2026/08/14(金) 00:24:24.74ID:UF3wd4nI
>>29 書き間違えた
・同期でよい物はなるべく同期に。どうしても動的にしなければならないところだけ動的に。
↓
・同期でよい物はなるべく同期に。どうしても非同期にしなければならないところだけ非同期に。
・同期でよい物はなるべく同期に。どうしても動的にしなければならないところだけ動的に。
↓
・同期でよい物はなるべく同期に。どうしても非同期にしなければならないところだけ非同期に。
2026/08/14(金) 00:25:29.70ID:UF3wd4nI
まあいいや、君らに話したところで、チャント話が理解できて
通じる人はたぶん殆どいないだろう
ノシ
通じる人はたぶん殆どいないだろう
ノシ
2026/08/14(金) 00:29:11.17ID:UF3wd4nI
>>26
クラスの何がまずいかについては、個人的考えだけれど
クラスとそのインスタンスは、込み入った依存のための「ハブ」のような役目をする使われ方がされがちな点かな
クラスってAPIのようなインターフェースにはいまいち使いにくいし
クラスの何がまずいかについては、個人的考えだけれど
クラスとそのインスタンスは、込み入った依存のための「ハブ」のような役目をする使われ方がされがちな点かな
クラスってAPIのようなインターフェースにはいまいち使いにくいし
34デフォルトの名無しさん
2026/08/14(金) 00:29:35.16ID:fikISMHq 俺はわかるよ、オブジェクト指向迷路を良く見ているからね
35デフォルトの名無しさん
2026/08/14(金) 00:55:55.74ID:fikISMHq サブタイピングと継承が一致しないことが致命的な気がする、プログラム意味論と実装メカニズムが乖離してるんよな、サン・マイクロシステムズでJavaを書いてた人でさえVectorを継承してStackを作ってる、継承を使えば実装が一見簡単に見えるのが認知を歪ませる原因のように思う、オッカムのカミソリで考えるとシンプルな方が正しいと思えてしまうからね、見た目のシンプルさに惑わされるんだと思う
2026/08/14(金) 01:04:45.47ID:UF3wd4nI
局所的に要素だけ見ると一見きれいなんだよ
近視眼的と言ってもいいかな
でもそれがシステム全体的でみると意外とややこしさを生み出しちゃっている
Javaがその典型だ
近視眼的と言ってもいいかな
でもそれがシステム全体的でみると意外とややこしさを生み出しちゃっている
Javaがその典型だ
2026/08/14(金) 03:10:41.44ID:2yA0m3fH
クラス継承というものがあると
どうしても使っちゃう人がいっぱい出てきちゃう
だからGoはクラス継承をなくした
どうしても使っちゃう人がいっぱい出てきちゃう
だからGoはクラス継承をなくした
38デフォルトの名無しさん
2026/08/14(金) 03:36:01.17ID:85jyUaLi オブジェクトとは!とかあほな方向に議論が行きがちだから嫌いなんだよ
2026/08/14(金) 05:05:14.16ID:ENiOjm4o
板違いのクソスレ立てるアホとそこでプログラムの役に立たないオブジェクト指向とズレた頓珍漢議論をするアホども
まともなプログラム一生組めない救われないやつら。今時の小学生の方がよっぽどマシ
まともなプログラム一生組めない救われないやつら。今時の小学生の方がよっぽどマシ
40デフォルトの名無しさん
2026/08/14(金) 05:38:39.81ID:fikISMHq >>39
では君はここに来るんじゃなくて小学校に行ったらどうだろうか
では君はここに来るんじゃなくて小学校に行ったらどうだろうか
2026/08/14(金) 06:36:28.14ID:kBqLUOsM
迷信が信じられて人々に刷り込まれ流行するのと似てるな
42デフォルトの名無しさん
2026/08/14(金) 09:28:27.67ID:85jyUaLi 機能的に継承元としてまとめられるって場合はそこまでひどくないが、初めから抽象概念的に継承ツリー作っておこうって奴はまあ大抵失敗するわな。
43デフォルトの名無しさん
2026/08/14(金) 09:29:12.11ID:+ZJH0FEc C++製の黎明期のゲーム
誰もオブジェクト指向で作ってないしね
誰もオブジェクト指向で作ってないしね
44デフォルトの名無しさん
2026/08/14(金) 13:03:41.19ID:OTw3lE7z + +
/ / ポーン!
C
/ / ポーン!
C
2026/08/14(金) 14:03:10.83ID:j/tRNb4z
クラス継承が失敗した原因は世間でも出尽くしてるもんな。
突き詰めれば、複数から継承したくなるにも関わらず、クラス継承は実装継承だから複数継承すると色んな矛盾が出る。
突き詰めれば、複数から継承したくなるにも関わらず、クラス継承は実装継承だから複数継承すると色んな矛盾が出る。
2026/08/14(金) 14:46:10.55ID:kBqLUOsM
小さなプログラムならいざ知らず
ある程度規模が大きくなると
あちこち定義が分散し飛んで
追っかけきれなくてとてもわかりにくくなるしな
初期CD時は先のこと気にせずがんがん定義し
継承で紐付け依存紡ぎまくって、あとで見て何だこりゃって
ある程度規模が大きくなると
あちこち定義が分散し飛んで
追っかけきれなくてとてもわかりにくくなるしな
初期CD時は先のこと気にせずがんがん定義し
継承で紐付け依存紡ぎまくって、あとで見て何だこりゃって
2026/08/14(金) 14:49:11.75ID:kBqLUOsM
しばらく前まではその視認性の悪化を疑問視したら
OOPS信奉者からOOPSの理解不足勉強不足だと非難されちゃったものんだ
OOPS信奉者からOOPSの理解不足勉強不足だと非難されちゃったものんだ
2026/08/14(金) 14:52:43.06ID:kBqLUOsM
腹を開けてみたらもはや手の施しようがなくて
何もせずまた閉じるしかなかった、みたいな
何もせずまた閉じるしかなかった、みたいな
49デフォルトの名無しさん
2026/08/14(金) 15:17:51.40ID:tX2dbiSP class & polymorphysm よりも
struct & trait で良かった
敢えて糞Java風に言うなら interface
struct & trait で良かった
敢えて糞Java風に言うなら interface
50デフォルトの名無しさん
2026/08/14(金) 15:23:03.44ID:tX2dbiSP Using separate Rust Structs and Traits rather than class inheritance prevents tight coupling and deep,
unmaintainable hierarchies by favoring composition over inheritance.Key Advantages of Structs and TraitsSeparation of Concerns:
Data (fields inside a struct) and behavior (methods inside an impl or trait) are completely decoupled.
No Fragile Base Class Problem:
Changes to a parent class in traditional OOP can break subclasses unexpectedly;
traits define standalone shared behavior without hidden state dependencies.
Flexible Composition:
You combine small, focused traits instead of forcing objects into a rigid "is-a" taxonomy.
Zero-Cost Abstractions:
Using generics with trait bounds lets the compiler optimize dispatch statically with no runtime performance penalty.
Watch this video to better understand how Rust handles polymorphism using traits and dispatch:
Code to the MoonIf you'd like, I can:
Provide a code example comparing a class hierarchy to a trait-based approach.
Explain when to use static dispatch (generics) versus dynamic dispatch (dyn Trait).
Let me know how you want to proceed!
unmaintainable hierarchies by favoring composition over inheritance.Key Advantages of Structs and TraitsSeparation of Concerns:
Data (fields inside a struct) and behavior (methods inside an impl or trait) are completely decoupled.
No Fragile Base Class Problem:
Changes to a parent class in traditional OOP can break subclasses unexpectedly;
traits define standalone shared behavior without hidden state dependencies.
Flexible Composition:
You combine small, focused traits instead of forcing objects into a rigid "is-a" taxonomy.
Zero-Cost Abstractions:
Using generics with trait bounds lets the compiler optimize dispatch statically with no runtime performance penalty.
Watch this video to better understand how Rust handles polymorphism using traits and dispatch:
Code to the MoonIf you'd like, I can:
Provide a code example comparing a class hierarchy to a trait-based approach.
Explain when to use static dispatch (generics) versus dynamic dispatch (dyn Trait).
Let me know how you want to proceed!
51デフォルトの名無しさん
2026/08/14(金) 18:45:52.36ID:eEi1c8Nt どこから動くのか動かすまでわからない
オブジェクト指向すぎるプログラム
オブジェクト指向すぎるプログラム
2026/08/14(金) 19:46:52.72ID:LThgHuK6
>>50
なぜ英語なのか謎だがそういうことだよな
その後半部分
結局サブタイプやクラスの祖先型も含めて抽象型を指定してコーディングしている場合
そのメソッド呼び出しは各々の具象型のメソッドへの動的ディスパッチが基本で遅くなってしまう
だからRustのように指定がなければ常に単相化で高速化しつつ
必要な場合のため動的ディスパッチ利用の指定もできる形が現実解なんだろうな
なぜ英語なのか謎だがそういうことだよな
その後半部分
結局サブタイプやクラスの祖先型も含めて抽象型を指定してコーディングしている場合
そのメソッド呼び出しは各々の具象型のメソッドへの動的ディスパッチが基本で遅くなってしまう
だからRustのように指定がなければ常に単相化で高速化しつつ
必要な場合のため動的ディスパッチ利用の指定もできる形が現実解なんだろうな
53デフォルトの名無しさん
2026/08/14(金) 20:31:09.86ID:85jyUaLi 理想のオブジェクト指向だとメンバー見なくてもメソッド名でどんな動きするかわかるって世界なんだわな。
だからメンバーも継承されても問題ないでしょ?って態度になるわけ。
まあ現実的ではないわな。
だからメンバーも継承されても問題ないでしょ?って態度になるわけ。
まあ現実的ではないわな。
2026/08/14(金) 20:36:41.17ID:b0Pen2Wt
55デフォルトの名無しさん
2026/08/14(金) 20:43:47.27ID:85jyUaLi56デフォルトの名無しさん
2026/08/14(金) 20:56:17.75ID:422O34Cd 抽象型は内部構造を持たないよ
つまりメモリを伴わないから明確に具体型と区別できるね
抽象型の継承は多段になっても大丈夫
つまりメモリを伴わないから明確に具体型と区別できるね
抽象型の継承は多段になっても大丈夫
2026/08/14(金) 21:35:50.11ID:kBqLUOsM
抽象型をわざわざ設けなくちゃならないってコンセプトにそもそも無理があるというか
親子関係ってできれば少ない方が良いんじゃね
親子関係ってできれば少ない方が良いんじゃね
58デフォルトの名無しさん
2026/08/14(金) 21:50:52.77ID:422O34Cd 抽象型を用いてコーディングすると
メリット1
特定の型に依存しないコードになる
つまり抽象的な良いコードにすることが出来る
メリット2
その抽象型を継承する任意の型で同じそのコードが使える
つまりコードの共通化を実現できる
メリット3
テストやデバッグの時にモックやダミーな型に入れ替えても動作する
その抽象型を継承していれば動くため
メリット1
特定の型に依存しないコードになる
つまり抽象的な良いコードにすることが出来る
メリット2
その抽象型を継承する任意の型で同じそのコードが使える
つまりコードの共通化を実現できる
メリット3
テストやデバッグの時にモックやダミーな型に入れ替えても動作する
その抽象型を継承していれば動くため
2026/08/14(金) 22:46:11.79ID:Ezt31ZDh
2026/08/14(金) 23:26:22.37ID:L7BBT3dp
クラスの継承は抽象型からの継承ではないね
変数を持たない抽象クラスなら抽象型になりえるけど
変数を持たない抽象クラスなら抽象型になりえるけど
2026/08/15(土) 00:51:56.36ID:sm2DXHtx
抽象型のメリットは多重継承できることもあるよ
クラスは抽象型じゃないのでNG
クラスは抽象型じゃないのでNG
2026/08/15(土) 10:58:59.93ID:Yv1XFEHU
継承やその類似の仕組みになぜそんなにこだわるのかな
これまで刷り込まれた既成概念で思考停止してない?
これまで刷り込まれた既成概念で思考停止してない?
63デフォルトの名無しさん
2026/08/15(土) 11:00:51.36ID:TQSPkWiN >>62
どうしてだと思う?
どうしてだと思う?
2026/08/15(土) 11:02:24.07ID:Yv1XFEHU
ずーっと下(元)の階層にある機能を何階層も牽き回して
上位階層にまで見せて使わせなければならないってことは、
機能の抽象化レベルを階層に応じて上げられていない
即ち抽象化できてないってことにもなるんよ
適度に界面で切りなよ
上位階層にまで見せて使わせなければならないってことは、
機能の抽象化レベルを階層に応じて上げられていない
即ち抽象化できてないってことにもなるんよ
適度に界面で切りなよ
65デフォルトの名無しさん
2026/08/15(土) 11:04:12.75ID:TQSPkWiN 抽象型は型理論の概念で
クラスだから抽象型ではないとかそういうことではないのよ
クラスだから抽象型ではないとかそういうことではないのよ
2026/08/15(土) 11:04:29.04ID:Yv1XFEHU
>>63
他人のおツムの中で起きているこは(´・ω・`)知らんがな
他人のおツムの中で起きているこは(´・ω・`)知らんがな
2026/08/15(土) 11:05:32.81ID:Yv1XFEHU
>>65
いやそういう話じゃなくて、階層に応じて抽象度あげて界面で区切るべきって話なんだが
いやそういう話じゃなくて、階層に応じて抽象度あげて界面で区切るべきって話なんだが
68デフォルトの名無しさん
2026/08/15(土) 11:07:56.83ID:TQSPkWiN2026/08/15(土) 11:09:01.77ID:Yv1XFEHU
オブジェクト指向の弱点の一つは過剰に紐付けして引き回して依存を張り巡らしたところ
即ちモジュラ利ティーを欠くところにああったと思うけど
その呪縛から逃れられないのかと
即ちモジュラ利ティーを欠くところにああったと思うけど
その呪縛から逃れられないのかと
2026/08/15(土) 11:10:24.03ID:Yv1XFEHU
>>68
お前の好みやオツムの中など知るわけないだろ
お前の好みやオツムの中など知るわけないだろ
71デフォルトの名無しさん
2026/08/15(土) 11:10:34.43ID:TQSPkWiN2026/08/15(土) 11:12:21.76ID:Yv1XFEHU
そりゃそうだ、そう端的に書けばいいだけの話だ
73デフォルトの名無しさん
2026/08/15(土) 11:12:32.98ID:TQSPkWiN >>70
俺の頭の中の話ではなくて一般的な物事の話だよ
俺が何を言ってるかも君はわからずに返信してるね
思考停止と言って批判してる君の思考は止まってるように見えるよ
もうすこし考えてから発言したがいんじゃないかな
俺の頭の中の話ではなくて一般的な物事の話だよ
俺が何を言ってるかも君はわからずに返信してるね
思考停止と言って批判してる君の思考は止まってるように見えるよ
もうすこし考えてから発言したがいんじゃないかな
2026/08/15(土) 11:13:24.09ID:Yv1XFEHU
言っちゃうとさ、抽象型そんなに大事?
2026/08/15(土) 11:18:15.56ID:Yv1XFEHU
実は大して大事じゃないよね、便宜上そういう概念を基にすることもできるということ
クラスとは違う、そうだ。クラスは色々まずかった
まずかったことと<それほど大事でもないもの、それぞれを元に牽きまわしてとか
そういう狭い考え方省みてはってのは俺の意図なんだけれど
それを理解できないで頭に血が昇っちゃったみたいだね
クラスとは違う、そうだ。クラスは色々まずかった
まずかったことと<それほど大事でもないもの、それぞれを元に牽きまわしてとか
そういう狭い考え方省みてはってのは俺の意図なんだけれど
それを理解できないで頭に血が昇っちゃったみたいだね
2026/08/15(土) 11:21:05.63ID:Yv1XFEHU
何でソフトウエア作るときにいちいち抽象型みたいなものいちいち設けて継承したりして書く必要があるのよ
2026/08/15(土) 11:22:53.41ID:Yv1XFEHU
79デフォルトの名無しさん
2026/08/15(土) 11:23:37.06ID:TQSPkWiN2026/08/15(土) 11:23:59.01ID:Yv1XFEHU
型とか階層間を引き回すのやめなよ
2026/08/15(土) 11:25:05.50ID:Yv1XFEHU
82デフォルトの名無しさん
2026/08/15(土) 11:25:50.03ID:TQSPkWiN83デフォルトの名無しさん
2026/08/15(土) 11:27:01.22ID:TQSPkWiN2026/08/15(土) 11:27:18.09ID:Yv1XFEHU
あんたなんか障害あるんじゃない?
85デフォルトの名無しさん
2026/08/15(土) 11:28:12.39ID:TQSPkWiN >>84
それはそっくりそのままお返しするよ
それはそっくりそのままお返しするよ
2026/08/15(土) 11:28:17.21ID:Yv1XFEHU
>>82
あんたの性格に俺がどう関係あるのよw
あんたの性格に俺がどう関係あるのよw
87デフォルトの名無しさん
2026/08/15(土) 11:28:45.25ID:TQSPkWiN まず謝れよ!!!
2026/08/15(土) 11:28:54.59ID:Yv1XFEHU
>>85
お前に言ったんじゃないのに反すなよw
お前に言ったんじゃないのに反すなよw
2026/08/15(土) 11:29:28.68ID:Yv1XFEHU
>>87
お前さんを相手にして時間を無駄にしてすみませんでした
お前さんを相手にして時間を無駄にしてすみませんでした
90デフォルトの名無しさん
2026/08/15(土) 11:30:24.58ID:TQSPkWiN2026/08/15(土) 11:30:35.59ID:Yv1XFEHU
>>87
お前さんの性格の問題点を引き出すような書き込みをしてすみませんでした
お前さんの性格の問題点を引き出すような書き込みをしてすみませんでした
92デフォルトの名無しさん
2026/08/15(土) 11:30:41.75ID:TQSPkWiN >>89
謝罪になってないやり直せ
謝罪になってないやり直せ
93デフォルトの名無しさん
2026/08/15(土) 11:31:31.49ID:TQSPkWiN2026/08/15(土) 11:31:47.90ID:Yv1XFEHU
95デフォルトの名無しさん
2026/08/15(土) 11:31:55.28ID:TQSPkWiN おい!!謝罪は!!!
2026/08/15(土) 11:32:21.68ID:Yv1XFEHU
>>93
裁判所がどうしたの
裁判所がどうしたの
2026/08/15(土) 11:32:50.37ID:Yv1XFEHU
>>95
謝罪っ謝罪って韓国人かよw
謝罪っ謝罪って韓国人かよw
98デフォルトの名無しさん
2026/08/15(土) 11:33:24.49ID:TQSPkWiN 謝れない人っているよねえ
99デフォルトの名無しさん
2026/08/15(土) 11:34:05.36ID:TQSPkWiN クソジャップは謝罪もできない劣等民族
100デフォルトの名無しさん
2026/08/15(土) 11:34:09.65ID:Yv1XFEHU 必要がないからな
そそそも謝罪ポイントがない
腹が立ったのは分かったw
そそそも謝罪ポイントがない
腹が立ったのは分かったw
101デフォルトの名無しさん
2026/08/15(土) 11:34:21.46ID:TQSPkWiN テポドン落としたってもええねんど
102デフォルトの名無しさん
2026/08/15(土) 11:34:31.15ID:Yv1XFEHU >>99
日本語上手くなったね
日本語上手くなったね
103デフォルトの名無しさん
2026/08/15(土) 11:34:52.85ID:Yv1XFEHU >>101
裁判所に言ってこい
裁判所に言ってこい
104デフォルトの名無しさん
2026/08/15(土) 11:35:31.16ID:TQSPkWiN >>102
お前は下手だな
お前は下手だな
105デフォルトの名無しさん
2026/08/15(土) 11:36:06.79ID:Yv1XFEHU ここに日本語では書いてないがw
106デフォルトの名無しさん
2026/08/15(土) 11:36:33.10ID:TQSPkWiN >>103
お前が行け、ちんちんの調子が悪いんですけど判決をお願いしますと言って警察に捕まって森の奥の病院で包茎の治療を受けろ
お前が行け、ちんちんの調子が悪いんですけど判決をお願いしますと言って警察に捕まって森の奥の病院で包茎の治療を受けろ
107デフォルトの名無しさん
2026/08/15(土) 11:38:11.85ID:Yv1XFEHU マジ韓国だったのか
急に火病るとは話に聞いていたが
薬飲んでも直らなそうだな
急に火病るとは話に聞いていたが
薬飲んでも直らなそうだな
108デフォルトの名無しさん
2026/08/15(土) 11:39:25.17ID:Yv1XFEHU109デフォルトの名無しさん
2026/08/15(土) 11:40:23.17ID:Yv1XFEHU 何の薬が効くのやら
やっぱトンスル飲んでるんだろうな
やっぱトンスル飲んでるんだろうな
110デフォルトの名無しさん
2026/08/15(土) 11:41:32.47ID:TQSPkWiN テポドンは北朝鮮の人工衛星だよ
北朝鮮と韓国の違いもわからんのか
ジャップの義務教育はどうなってんだ
こんな義務教育の落ちこぼれはネットにアクセスさせるな
我が国で再教育してやろうか
北朝鮮と韓国の違いもわからんのか
ジャップの義務教育はどうなってんだ
こんな義務教育の落ちこぼれはネットにアクセスさせるな
我が国で再教育してやろうか
111デフォルトの名無しさん
2026/08/15(土) 11:42:42.55ID:IzVYAgKs >これまで刷り込まれた既成概念で思考停止してない?
などと書いておいて
>他人のおツムの中で起きているこは(´・ω・`)知らんがな
自分は思考停止以前に思考放棄
結局このレベルなのよねぇ
少しはオツム使えよ
などと書いておいて
>他人のおツムの中で起きているこは(´・ω・`)知らんがな
自分は思考停止以前に思考放棄
結局このレベルなのよねぇ
少しはオツム使えよ
112デフォルトの名無しさん
2026/08/15(土) 11:42:45.54ID:Yv1XFEHU ttps://www.google.com/search?q=%E3%83%86%E3%83%9D%E3%83%89%E3%83%B3&hl=ja
113デフォルトの名無しさん
2026/08/15(土) 11:43:58.28ID:Yv1XFEHU >>110
脱北者だったのか…
脱北者だったのか…
114デフォルトの名無しさん
2026/08/15(土) 11:45:59.67ID:Yv1XFEHU 日本に文句バッカ言って何で居るんだろう
いつでもお帰り頂いて結構なのに
なぜじゃ
いつでもお帰り頂いて結構なのに
なぜじゃ
115デフォルトの名無しさん
2026/08/15(土) 11:46:44.54ID:Yv1XFEHU ま・さ・か・ 生活保護もらったりしてないだろうな
116デフォルトの名無しさん
2026/08/15(土) 11:51:24.27ID:TQSPkWiN117デフォルトの名無しさん
2026/08/15(土) 11:52:56.91ID:TQSPkWiN これが俺たち三人の出会いでした
118デフォルトの名無しさん
2026/08/15(土) 11:54:54.93ID:Yv1XFEHU119デフォルトの名無しさん
2026/08/15(土) 11:58:10.07ID:TQSPkWiN >>111
最後のオチをお願いしても良いでしょうか?
最後のオチをお願いしても良いでしょうか?
120デフォルトの名無しさん
2026/08/15(土) 11:59:46.06ID:Yv1XFEHU 俺の知人に朝鮮籍の椰子がいて
東工大学部出てうちの大学に入ってきて結構頭は良いかった
卒業後仲間と会社を興してその後どうなったかは知らん
虚勢は張るタイプではあったがここまでふぁびょって人に変に絡むことはなかったなー
東工大学部出てうちの大学に入ってきて結構頭は良いかった
卒業後仲間と会社を興してその後どうなったかは知らん
虚勢は張るタイプではあったがここまでふぁびょって人に変に絡むことはなかったなー
121デフォルトの名無しさん
2026/08/15(土) 12:03:46.63ID:Yv1XFEHU >>119
やっぱ噂通りウ○チ溶いた酒のむん?
やっぱ噂通りウ○チ溶いた酒のむん?
122デフォルトの名無しさん
2026/08/15(土) 13:17:53.71ID:TQSPkWiN 継承の問題は具象メソッドを上書きすることによって起こる
interfaceがdefault methodを持てるようになったけど
default methodは具象メソッドなので
interfaceの実装でも継承の問題は起こるのよね
そういう意味ではinterfaceだから問題ないとも言えなくなった
ソフトウェアも密を避けるべき
https://developer.mamezou-tech.com/blogs/2023/08/02/software-coupling/
ここでの継承の問題は↑のようなもの
interfaceがdefault methodを持てるようになったけど
default methodは具象メソッドなので
interfaceの実装でも継承の問題は起こるのよね
そういう意味ではinterfaceだから問題ないとも言えなくなった
ソフトウェアも密を避けるべき
https://developer.mamezou-tech.com/blogs/2023/08/02/software-coupling/
ここでの継承の問題は↑のようなもの
123デフォルトの名無しさん
2026/08/15(土) 13:29:23.70ID:TQSPkWiN Javaの良くないところはメソッドをデフォルトで上書き可能にしたところだ
クラスを書いた人が意図したときだけ上書き可能にするべきだった
C++やC#はそうなっている
オブジェクト指向言語と言ったらJavaのイメージが強いが
実際にオブジェクト指向言語として完成度が高いのはC#やKotlinだな
クラスを書いた人が意図したときだけ上書き可能にするべきだった
C++やC#はそうなっている
オブジェクト指向言語と言ったらJavaのイメージが強いが
実際にオブジェクト指向言語として完成度が高いのはC#やKotlinだな
124デフォルトの名無しさん
2026/08/15(土) 13:33:50.38ID:fk/8MezU125デフォルトの名無しさん
2026/08/15(土) 13:34:51.45ID:TQSPkWiN 継承は問題があるから委譲を使おうとなって
困るのは委譲メソッドの実装コストなんよな
C#やKotlinは拡張メソッドの言語機能によって
委譲メソッドの実装コストが高いことを解決した
そこからするとJavaはまだ言語機能が未熟であるが
ゆえに継承を使わざるを得ないというのが実際のところだ
困るのは委譲メソッドの実装コストなんよな
C#やKotlinは拡張メソッドの言語機能によって
委譲メソッドの実装コストが高いことを解決した
そこからするとJavaはまだ言語機能が未熟であるが
ゆえに継承を使わざるを得ないというのが実際のところだ
126デフォルトの名無しさん
2026/08/15(土) 13:36:05.05ID:TQSPkWiN127デフォルトの名無しさん
2026/08/15(土) 13:37:22.52ID:sdc2zI/7128デフォルトの名無しさん
2026/08/15(土) 13:41:23.66ID:TQSPkWiN129デフォルトの名無しさん
2026/08/15(土) 13:50:18.16ID:3CRH9xzf130デフォルトの名無しさん
2026/08/15(土) 14:01:08.16ID:TQSPkWiN131デフォルトの名無しさん
2026/08/15(土) 14:02:49.82ID:TQSPkWiN メソッド名などは変えた
豆蔵さんに著作権侵害だと怒られたくなかった
豆蔵さんに著作権侵害だと怒られたくなかった
132デフォルトの名無しさん
2026/08/15(土) 14:13:37.01ID:hZdK+yJb 変えるなよ
わけわからなくなってるぞ
わけわからなくなってるぞ
133デフォルトの名無しさん
2026/08/15(土) 14:23:37.18ID:Z3IQ+P4P134デフォルトの名無しさん
2026/08/15(土) 14:26:02.01ID:+nxHL2x0135デフォルトの名無しさん
2026/08/15(土) 14:29:33.88ID:nx8TJyDG >>134
起きないよ
デフォルト実装を完全に書き換えても実装継承にならないため疎結合になる
元のデフォルト実装を利用しつつデフォルトを書き換えられる言語が存在すればそれは実装継承なので密結合になるがそんな本末転倒な仕様にするのは愚かすぎる
起きないよ
デフォルト実装を完全に書き換えても実装継承にならないため疎結合になる
元のデフォルト実装を利用しつつデフォルトを書き換えられる言語が存在すればそれは実装継承なので密結合になるがそんな本末転倒な仕様にするのは愚かすぎる
136デフォルトの名無しさん
2026/08/15(土) 14:36:56.36ID:+nxHL2x0 にしても最近は豆蔵のエンジニアでもQiitaレベルなんだな
OOで存在感があったころを知ってるなんかがっかり
OOで存在感があったころを知ってるなんかがっかり
137デフォルトの名無しさん
2026/08/15(土) 14:41:55.11ID:+nxHL2x0138デフォルトの名無しさん
2026/08/15(土) 14:43:57.08ID:TQSPkWiN139デフォルトの名無しさん
2026/08/15(土) 14:46:41.95ID:TQSPkWiN140デフォルトの名無しさん
2026/08/15(土) 15:04:03.59ID:Yv1XFEHU 90年代からクラス継承が嫌いでたまらなかったオレ様が通りますよっと
141デフォルトの名無しさん
2026/08/15(土) 15:10:53.23ID:/ef9Thsi142デフォルトの名無しさん
2026/08/15(土) 15:12:14.49ID:Yv1XFEHU ( *´艸`)クスクス
143デフォルトの名無しさん
2026/08/15(土) 15:15:42.64ID:cilU02p9 状況がわかったのでまとめてみる
【インターフェース継承】
(インターフェースに変数を持たないものなら抽象クラスやトレイトなども含む。)
①デフォルト実装を持たない言語 →疎結合
②デフォルト実装を持つ言語
②-A デフォルト実装を書き換えられない言語 →疎結合
②-B デフォルト実装を書き換えられる言語
②-B-α その場合にはデフォルト実装を継承できない言語 →疎結合
②-B-β その場合でもデフォルト実装を継承できる言語 →密結合❌
Javaは「②-B-β」だからアウト
C#やRustなどは「②-B-α」だからセーフ
ということでJavaはcクラスと同じノリで実装継承できてしまう変な言語仕様みたい
疎結合のインターフェース継承を台無しにしてしまう誤仕様
【インターフェース継承】
(インターフェースに変数を持たないものなら抽象クラスやトレイトなども含む。)
①デフォルト実装を持たない言語 →疎結合
②デフォルト実装を持つ言語
②-A デフォルト実装を書き換えられない言語 →疎結合
②-B デフォルト実装を書き換えられる言語
②-B-α その場合にはデフォルト実装を継承できない言語 →疎結合
②-B-β その場合でもデフォルト実装を継承できる言語 →密結合❌
Javaは「②-B-β」だからアウト
C#やRustなどは「②-B-α」だからセーフ
ということでJavaはcクラスと同じノリで実装継承できてしまう変な言語仕様みたい
疎結合のインターフェース継承を台無しにしてしまう誤仕様
144デフォルトの名無しさん
2026/08/15(土) 15:22:31.14ID:VAdMHfIa またJavaが変な言語仕様で問題を引き起こしたパターンかよ
いつもJavaが戦犯だよな
いつもJavaが戦犯だよな
145デフォルトの名無しさん
2026/08/15(土) 15:31:32.75ID:SrZtcHJ3146デフォルトの名無しさん
2026/08/15(土) 15:44:25.52ID:fSG6hCiZ >>133
super を使わないなら、default メソッドではなく static メソッドで良いのでは?
密結合か疎結合かは、そういう絶対的な条件で決まるものではなく相対的な評価でしかない。
一般には、あるプログラム要素の変更による他のプログラム要素への影響の多寡に対して評価される。
super を使わないなら、default メソッドではなく static メソッドで良いのでは?
密結合か疎結合かは、そういう絶対的な条件で決まるものではなく相対的な評価でしかない。
一般には、あるプログラム要素の変更による他のプログラム要素への影響の多寡に対して評価される。
147デフォルトの名無しさん
2026/08/15(土) 15:45:53.34ID:silBGnFG148デフォルトの名無しさん
2026/08/15(土) 15:46:28.97ID:Py4EuqFd なるほどな
一般的にはデフォルト継承を用いてもインターフェース継承は疎結合
ただしデフォルト実装を継承しつつ書き換えられる間違った抜け道のあるJavaは注意ってことか
一般的にはデフォルト継承を用いてもインターフェース継承は疎結合
ただしデフォルト実装を継承しつつ書き換えられる間違った抜け道のあるJavaは注意ってことか
149デフォルトの名無しさん
2026/08/15(土) 15:48:45.83ID:0Bu7lId9 >>147
AIに聞いたらRustのデフォルト実装は継承か書き換えどちらかしか選べないから問題は起きないってさ
AIに聞いたらRustのデフォルト実装は継承か書き換えどちらかしか選べないから問題は起きないってさ
150デフォルトの名無しさん
2026/08/15(土) 15:52:33.11ID:PxTLs4UK151デフォルトの名無しさん
2026/08/15(土) 15:54:18.43ID:silBGnFG152デフォルトの名無しさん
2026/08/15(土) 16:01:21.42ID:oBPlyySV153デフォルトの名無しさん
2026/08/15(土) 16:10:40.42ID:fSG6hCiZ C++ だと通常メンバ変数と仮想メンバ変数でどちらのケースもあるから、C++を知っていればすぐに分かる話だけれど、
どちらかしかない言語を習得した人だと、どちらかのケースを元に考えるから分かりにくいんだろうな。
C++の通常メンバ変数=GoやRustのメソッド
現在の型によって決まるメソッド。キャストされたら呼ばれるメソッドが変わる。
ソースコード上、使用時の型は静的に決定できるので、コンパイル時に呼ばれるメソッドも固定される。
C++の仮想メンバ関数=Javaのメソッド
インスタンス生成時の型によって決まるメソッド。キャストされても呼ばれるメソッドは変わらない。
ソースコード上、インスタンス生成時の本当の型を決定できないので、コンパイル時に呼ばれるメソッドを特定できない。
どちらかしかない言語を習得した人だと、どちらかのケースを元に考えるから分かりにくいんだろうな。
C++の通常メンバ変数=GoやRustのメソッド
現在の型によって決まるメソッド。キャストされたら呼ばれるメソッドが変わる。
ソースコード上、使用時の型は静的に決定できるので、コンパイル時に呼ばれるメソッドも固定される。
C++の仮想メンバ関数=Javaのメソッド
インスタンス生成時の型によって決まるメソッド。キャストされても呼ばれるメソッドは変わらない。
ソースコード上、インスタンス生成時の本当の型を決定できないので、コンパイル時に呼ばれるメソッドを特定できない。
154デフォルトの名無しさん
2026/08/15(土) 16:16:03.46ID:silBGnFG >>151
まともなAIを使っても使う側がまともじゃなければ意味なかったな
まともなAIを使っても使う側がまともじゃなければ意味なかったな
155デフォルトの名無しさん
2026/08/15(土) 16:16:45.06ID:fSG6hCiZ >>153
> C++ だと通常メンバ変数と仮想メンバ変数でどちらのケースもあるから、C++を知っていればすぐに分かる話だけれど、
> C++の通常メンバ変数=GoやRustのメソッド
あ、しまった、関数を変数と間違えて書いてしまった。
通常メンバ関数と仮想メンバ関数、に訂正。
> C++ だと通常メンバ変数と仮想メンバ変数でどちらのケースもあるから、C++を知っていればすぐに分かる話だけれど、
> C++の通常メンバ変数=GoやRustのメソッド
あ、しまった、関数を変数と間違えて書いてしまった。
通常メンバ関数と仮想メンバ関数、に訂正。
156デフォルトの名無しさん
2026/08/15(土) 16:18:44.23ID:silBGnFG157デフォルトの名無しさん
2026/08/15(土) 16:25:53.62ID:+6/lj6CD158デフォルトの名無しさん
2026/08/15(土) 16:31:59.68ID:r7+Cc7Q7 C#でもデフォルト実装を書き換えるなら元のデフォルト実装を呼び出せないってさ
再帰定義になるため不可能とのこと
問題を引き起こすのはJavaだけの問題みたいね
再帰定義になるため不可能とのこと
問題を引き起こすのはJavaだけの問題みたいね
159デフォルトの名無しさん
2026/08/15(土) 16:41:03.86ID:0WCtanUv160デフォルトの名無しさん
2026/08/15(土) 16:42:09.41ID:r7+Cc7Q7 Rustでもデフォルト実装を書き換えるなら元のデフォルト実装を呼び出せないってさ
再帰定義になるため不可能とのこと
再帰定義になるため不可能とのこと
161デフォルトの名無しさん
2026/08/15(土) 16:42:48.33ID:S4+pqC1p162デフォルトの名無しさん
2026/08/15(土) 16:43:49.96ID:0WCtanUv >>141
そのレスはID:Yv1XFEHU(二代目複おじ)のほうでID:TQSPkWiNはまた別のやつだろう
そのレスはID:Yv1XFEHU(二代目複おじ)のほうでID:TQSPkWiNはまた別のやつだろう
163デフォルトの名無しさん
2026/08/15(土) 16:44:51.38ID:0WCtanUv >>160
問題のフレーミングが間違ってるからAIから間違った答えしか引き出せないんだよ
問題のフレーミングが間違ってるからAIから間違った答えしか引き出せないんだよ
164デフォルトの名無しさん
2026/08/15(土) 16:51:14.97ID:Fg8L11Lx165デフォルトの名無しさん
2026/08/15(土) 17:05:20.37ID:g+lgHL/9 Rustはクラス継承に相当するものがないからスーパーメソッド呼び出しがそもそもなくて問題が起きないわけだけど
C#はクラス継承もスーパーメソッド呼び出しもあるにも関わらずインターフェースでは使えない言語仕様だから問題が起きない
Javaはインターフェースでもスーパーメソッド呼び出しを使える間違った言語仕様にしたので問題が起きてる
C#はクラス継承もスーパーメソッド呼び出しもあるにも関わらずインターフェースでは使えない言語仕様だから問題が起きない
Javaはインターフェースでもスーパーメソッド呼び出しを使える間違った言語仕様にしたので問題が起きてる
166デフォルトの名無しさん
2026/08/15(土) 17:17:01.46ID:TQSPkWiN >>161
なるほど、勉強になります、あなた只者じゃないですね
なるほど、勉強になります、あなた只者じゃないですね
167デフォルトの名無しさん
2026/08/15(土) 17:32:13.56ID:2vg9s13q168デフォルトの名無しさん
2026/08/15(土) 17:36:22.11ID:TQSPkWiN169デフォルトの名無しさん
2026/08/15(土) 17:40:54.70ID:ILo7VsC4170デフォルトの名無しさん
2026/08/15(土) 17:46:09.20ID:nidKMiVb >>168
他でも問題が起きると言うならC#やRustで実例コードを作ってみてよ
他でも問題が起きると言うならC#やRustで実例コードを作ってみてよ
171デフォルトの名無しさん
2026/08/15(土) 17:47:39.14ID:fSG6hCiZ C# は使ったことがなかったんで知らなかったが、
C# でも virtual / override を付けるか付けないかでオーバーライドするしないを制御できるから、
C# を習得していても分かる話だな。
>>165
C# でも、<インタフェイス名>.<メソッド名> でメソッドの実装をすると、オーバーライドできるみたい。
あと、インターフェイス間ではクラスと同様に virtual / override でオーバーライドできるみたい。
Java と違って気付かずにオーバライドしていた、なんてことは起きないけど、
気づかずにそのメソッドを使用しているメソッドの挙動を変えていた、ということは発生する可能はあるね。
C# でも virtual / override を付けるか付けないかでオーバーライドするしないを制御できるから、
C# を習得していても分かる話だな。
>>165
C# でも、<インタフェイス名>.<メソッド名> でメソッドの実装をすると、オーバーライドできるみたい。
あと、インターフェイス間ではクラスと同様に virtual / override でオーバーライドできるみたい。
Java と違って気付かずにオーバライドしていた、なんてことは起きないけど、
気づかずにそのメソッドを使用しているメソッドの挙動を変えていた、ということは発生する可能はあるね。
172デフォルトの名無しさん
2026/08/15(土) 17:52:19.39ID:nt5T4P0f 抽象クラスは基本的に使用禁止にしてるけどサービスロケータでは例外として今でも使ってるわ
中を隠蔽しないように用途を限れば便利なのは違いない
中を隠蔽しないように用途を限れば便利なのは違いない
173デフォルトの名無しさん
2026/08/15(土) 17:53:45.32ID:TQSPkWiN174デフォルトの名無しさん
2026/08/15(土) 18:05:32.04ID:nt5T4P0f クラス委譲のある言語 いいなあ
便利なんだろうなあ
便利なんだろうなあ
175デフォルトの名無しさん
2026/08/15(土) 18:09:12.27ID:Xb26COoO >>171
クラスではなくてインターフェースのデフォルト実装の時の話だよ
クラスではなくてインターフェースのデフォルト実装の時の話だよ
176デフォルトの名無しさん
2026/08/15(土) 18:24:42.13ID:H74NynC0 self-use of overridable methodっていう有名パターンなのに知らないやつが多すぎやろw
昔々から初心者が2冊目に読むような本で紹介されてる基本中の基本やで〜
昔々から初心者が2冊目に読むような本で紹介されてる基本中の基本やで〜
177デフォルトの名無しさん
2026/08/15(土) 18:30:34.10ID:H74NynC0 Rustで発生するFragile Base Class Problemの一例
trait PointCalculator {
fn regular_point(&self, payment_amount: i32) -> i32;
fn campaign_point(&self, payment_amount: i32) -> i32 {
self.regular_point(payment_amount) * 2
}
fn super_campaign_point(&self, payment_amount: i32) -> i32 {
self.regular_point(payment_amount) * 4
// self.campaign_point(payment_amount) * 2 //<== こういう変更をすると継承先が壊れる可能性がある
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=84769fbdb0fc90ba597cb86c8c2ed9d4
trait PointCalculator {
fn regular_point(&self, payment_amount: i32) -> i32;
fn campaign_point(&self, payment_amount: i32) -> i32 {
self.regular_point(payment_amount) * 2
}
fn super_campaign_point(&self, payment_amount: i32) -> i32 {
self.regular_point(payment_amount) * 4
// self.campaign_point(payment_amount) * 2 //<== こういう変更をすると継承先が壊れる可能性がある
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=84769fbdb0fc90ba597cb86c8c2ed9d4
178デフォルトの名無しさん
2026/08/15(土) 18:31:56.78ID:H74NynC0 クラス継承で発生する問題の原因と対策を知らないからクラスという名前を持つ言語要素のないRustなどの言語でも同種の問題が発生するかどうかも分かってないんだよな
反省して勉強してね〜
反省して勉強してね〜
179デフォルトの名無しさん
2026/08/15(土) 18:34:06.19ID:H74NynC0 あ、ちなみにRustはインターフェースのデフォルト実装を上書き禁止にできない欠点があるよ
中の人はそれを理解してるから今後機能拡張される予定ではあるけど
中の人はそれを理解してるから今後機能拡張される予定ではあるけど
180デフォルトの名無しさん
2026/08/15(土) 18:49:30.39ID:FRwuYJVI181デフォルトの名無しさん
2026/08/15(土) 19:01:27.59ID:nt5T4P0f Javaだって final、private、protected abstractを守れば継承抽象化したって大きな問題無い
override可能な箇所を必要最小限にして親クラスが守るべき不変条件を finalやprivate で閉じ込めてやるのが大事なんよ
override可能な箇所を必要最小限にして親クラスが守るべき不変条件を finalやprivate で閉じ込めてやるのが大事なんよ
182デフォルトの名無しさん
2026/08/15(土) 19:03:36.72ID:nt5T4P0f >>174
ちょっと言い方ミスってんな 例えばKotlinのbyみたいな手軽な書き方ができるといいなってことを言いたかった
ちょっと言い方ミスってんな 例えばKotlinのbyみたいな手軽な書き方ができるといいなってことを言いたかった
183デフォルトの名無しさん
2026/08/15(土) 19:04:49.04ID:sXETHyYr184デフォルトの名無しさん
2026/08/15(土) 19:11:50.06ID:TQSPkWiN >>170
C#だとこうかな
static class Program {
private static void Main(string[] args) {
IPointCalculator calc = new GochanPointCalculator();
Console.WriteLine(calc.RegularPoint(10000));
Console.WriteLine(calc.CampaignPoint(10000));
}
}
interface IPointCalculator {
int RegularPoint(int paymentAmount) {
return paymentAmount / 100;
}
int CampaignPoint(int paymentAmount) {
return RegularPoint(paymentAmount) * 2;
}
}
class GochanPointCalculator : IPointCalculator {
public int RegularPoint(int paymentAmount) {
return paymentAmount / 100 + 10;
}
}
C#だとこうかな
static class Program {
private static void Main(string[] args) {
IPointCalculator calc = new GochanPointCalculator();
Console.WriteLine(calc.RegularPoint(10000));
Console.WriteLine(calc.CampaignPoint(10000));
}
}
interface IPointCalculator {
int RegularPoint(int paymentAmount) {
return paymentAmount / 100;
}
int CampaignPoint(int paymentAmount) {
return RegularPoint(paymentAmount) * 2;
}
}
class GochanPointCalculator : IPointCalculator {
public int RegularPoint(int paymentAmount) {
return paymentAmount / 100 + 10;
}
}
185デフォルトの名無しさん
2026/08/15(土) 19:30:03.40ID:TQSPkWiN186デフォルトの名無しさん
2026/08/15(土) 20:04:10.46ID:fSG6hCiZ すみません。>>153 は、Rust について間違いでした。
Rust のデフォルト・メソッドはオーバーライドされます。
キャストした時でもインスタンス化した時の型に定義したメソッドが呼ばれます。
1. dyn を使ってキャストした場合は vtable が作成され、動的に解決されます。
2. >>177 の通り、デフォルト・メソッドを使ったメソッドにおいても、impl Trait for Struct に実装したメソッドが使われます。
3. 以下のようにしても、impl Trait for Struct に実装したメソッドが呼ばれます。
var instance = Struct::new();
Trait::method(&instance);
1.はともかく、2.と3.について完全に誤解していました。🙇
Rust のデフォルト・メソッドはオーバーライドされます。
キャストした時でもインスタンス化した時の型に定義したメソッドが呼ばれます。
1. dyn を使ってキャストした場合は vtable が作成され、動的に解決されます。
2. >>177 の通り、デフォルト・メソッドを使ったメソッドにおいても、impl Trait for Struct に実装したメソッドが使われます。
3. 以下のようにしても、impl Trait for Struct に実装したメソッドが呼ばれます。
var instance = Struct::new();
Trait::method(&instance);
1.はともかく、2.と3.について完全に誤解していました。🙇
187デフォルトの名無しさん
2026/08/15(土) 20:29:02.06ID:S4+pqC1p どう転んでも、どんな言語であっても、期待されないことを書くことはできる。
extendsやjavaがevilなのではなく、プログラミング言語がevilなのだ。
基本クラスで継承可能なメソッドを使うなということでもなく、
継承可能なメソッドでなければならない設計もある。
意図を初心者でもわかるように明記すること。そして意図を検証するunittestがあること。
継続的にインテグレーションテストができること。
ともかく、ソフトウェア工学の進歩に追いつけていないメインフレーム系のメーカーや、
どうしようもない教育しかうけていないプログラマーがいる限り、闘いは続く。
extendsやjavaがevilなのではなく、プログラミング言語がevilなのだ。
基本クラスで継承可能なメソッドを使うなということでもなく、
継承可能なメソッドでなければならない設計もある。
意図を初心者でもわかるように明記すること。そして意図を検証するunittestがあること。
継続的にインテグレーションテストができること。
ともかく、ソフトウェア工学の進歩に追いつけていないメインフレーム系のメーカーや、
どうしようもない教育しかうけていないプログラマーがいる限り、闘いは続く。
188デフォルトの名無しさん
2026/08/15(土) 20:40:13.32ID:2hYalLTI そもそもインターフェースって継承のための抽象化というより依存性逆転とかテスト時の差し替え可能性を確保するために使うものくらいに考えてる
とりあえずインターフェース切っとけで実装クラスと1:1対応させるのはむしろ抽象化を増やしてるだけでは
とりあえずインターフェース切っとけで実装クラスと1:1対応させるのはむしろ抽象化を増やしてるだけでは
189デフォルトの名無しさん
2026/08/15(土) 20:43:09.49ID:lG8RMaHa そういうわけでクラスは不要でインターフェースだけあればよいとわかった
それがモダンな言語の仕様に反映されている
それがモダンな言語の仕様に反映されている
190デフォルトの名無しさん
2026/08/15(土) 21:13:29.52ID:vxBg0KLF イベントドリブンなオブジェクトだらけになる
191デフォルトの名無しさん
2026/08/15(土) 21:22:20.54ID:GQznZi9p >>186
その通りでRustはdyn宣言しない限りどのメソッドも単相化されて普通の関数呼び出しと同じになりゼロコストで実行されて速い
dyn宣言した時のみ動的ディスパッチになり各型のvtableを引いて呼ぶ関数を決める
その通りでRustはdyn宣言しない限りどのメソッドも単相化されて普通の関数呼び出しと同じになりゼロコストで実行されて速い
dyn宣言した時のみ動的ディスパッチになり各型のvtableを引いて呼ぶ関数を決める
192デフォルトの名無しさん
2026/08/15(土) 22:59:10.16ID:nt5T4P0f >>189
それは実装継承が不要ってことをクラスが不要ってことに飛躍させてるよ
Rustだってtraitだけで完結させてるわけじゃなくてstructとimplで状態と振る舞いを分けてる
Javaのclassの責務を別のものに分解しただけなんよ
もちろんclassという大きな責務を分割するのは良いことだよ
それは実装継承が不要ってことをクラスが不要ってことに飛躍させてるよ
Rustだってtraitだけで完結させてるわけじゃなくてstructとimplで状態と振る舞いを分けてる
Javaのclassの責務を別のものに分解しただけなんよ
もちろんclassという大きな責務を分割するのは良いことだよ
193デフォルトの名無しさん
2026/08/15(土) 23:04:20.24ID:AbqGm+Ug >>180>>183
複おじはRust信者なのにRust読めないの?
複おじはRust信者なのにRust読めないの?
194デフォルトの名無しさん
2026/08/15(土) 23:11:30.09ID:M3QQ7wMC195デフォルトの名無しさん
2026/08/15(土) 23:55:19.69ID:pd5pYsOL >>194
それは現在のRustが2015年に登場するよりもっと遥か昔の色んなことを試行錯誤していたRust未完成の時代の話だぞ
それは現在のRustが2015年に登場するよりもっと遥か昔の色んなことを試行錯誤していたRust未完成の時代の話だぞ
196デフォルトの名無しさん
2026/08/16(日) 00:31:09.64ID:0CvMbO4G >>194
「構造体 + メソッド = クラス」なんだから当然だな
「構造体 + メソッド = クラス」なんだから当然だな
197デフォルトの名無しさん
2026/08/16(日) 00:33:05.01ID:poIe7pLM198デフォルトの名無しさん
2026/08/16(日) 10:04:08.54ID:tjwwNDs7199デフォルトの名無しさん
2026/08/16(日) 10:09:53.00ID:J2pSiYC1 クラス継承なんかしないで
使いたいクラスを取り込めばいいだけ
使いたいクラスを取り込めばいいだけ
200デフォルトの名無しさん
2026/08/16(日) 10:43:43.08ID:sS+cH1fU201デフォルトの名無しさん
2026/08/16(日) 10:55:36.25ID:a4RxNiOb インラインで展開かw
202デフォルトの名無しさん
2026/08/16(日) 11:02:38.33ID:Okvwqdtm >>200
Rustでは問題起きないよ
Rustでは問題起きないよ
203デフォルトの名無しさん
2026/08/16(日) 11:29:32.30ID:Q/5wpQBy クラスが悪ってのはさすがに行きすぎな気がするがな
そのレベルでダメならどんな概念もこじつけで悪いものにできると思うわ。
そのレベルでダメならどんな概念もこじつけで悪いものにできると思うわ。
204デフォルトの名無しさん
2026/08/16(日) 11:32:41.10ID:BRHsau7p 巨大なピラミッドになるクラス継承を使わなければ大丈夫よ
205デフォルトの名無しさん
2026/08/16(日) 11:58:04.41ID:8yz0P3zw ハル夫くんは反復ばかりで話が発展しないのどうにかして
206デフォルトの名無しさん
2026/08/16(日) 12:04:44.76ID:4EyRDcWH クラスが悪というかクラスに責務を詰め込みすぎたというか
207デフォルトの名無しさん
2026/08/16(日) 12:25:04.76ID:8yz0P3zw オブジェクト指向らしくデザインパターンという形で整理するのが良い気がする
とりあえず動くシンプルなものを作るためのデザインパターン
staticおじさんパターンとかね
とりあえず動くシンプルなものを作るためのデザインパターン
staticおじさんパターンとかね
208デフォルトの名無しさん
2026/08/16(日) 13:07:18.35ID:Y1CXBzVZ デザインパターン系も継承関係はクラス継承よりインターフェース継承が良いですよパターン
209デフォルトの名無しさん
2026/08/16(日) 13:20:43.77ID:8yz0P3zw210デフォルトの名無しさん
2026/08/16(日) 13:26:23.74ID:+BV6GwVc >>209
クラス継承よりコンポジションな
クラス継承よりコンポジションな
211デフォルトの名無しさん
2026/08/16(日) 13:34:13.73ID:FW6ktTKM >>209
GoFのデザインパターンにそんなこと書かれてないぞ
GoFのデザインパターンにそんなこと書かれてないぞ
212デフォルトの名無しさん
2026/08/16(日) 13:42:39.48ID:nyOyVcBG >>209
GoFのデザインパターンはインターフェース継承を使おうという話で構成されてる
例えばStrategyパターンはインターフェース継承で抽象化しておけば簡単に切り替えららるよという話
Template Methodパターンは振る舞いははインターフェースで決めておいてインターフェース継承した各型が実装する話
VisitorパターンはVisitorインターフェースを作っておいてそれを実装する各型へディスパッチする話
GoFのデザインパターンはインターフェース継承を使おうという話で構成されてる
例えばStrategyパターンはインターフェース継承で抽象化しておけば簡単に切り替えららるよという話
Template Methodパターンは振る舞いははインターフェースで決めておいてインターフェース継承した各型が実装する話
VisitorパターンはVisitorインターフェースを作っておいてそれを実装する各型へディスパッチする話
213デフォルトの名無しさん
2026/08/16(日) 14:06:41.06ID:8yz0P3zw214デフォルトの名無しさん
2026/08/16(日) 14:06:53.11ID:a4RxNiOb あんなくちゃくちゃした書き方をなでもかんでもしなくてもいいだろ>デザインパターン
いや、しない方が良いだろ
いや、しない方が良いだろ
215デフォルトの名無しさん
2026/08/16(日) 14:07:35.06ID:a4RxNiOb もう、エンタープライズに続く道再びだな
216デフォルトの名無しさん
2026/08/16(日) 14:08:55.86ID:8yz0P3zw ハル夫くんの反復横跳びを眺めるスレッド
217デフォルトの名無しさん
2026/08/16(日) 14:10:06.00ID:a4RxNiOb ttps://qiita.com/mogamoga1337/items/564a3d657a80e396dae1
218デフォルトの名無しさん
2026/08/16(日) 14:12:31.99ID:a4RxNiOb ttps://www.reddit.com/r/programming/comments/qkqghu/github/?tl=ja
219デフォルトの名無しさん
2026/08/16(日) 14:22:23.29ID:8yz0P3zw220デフォルトの名無しさん
2026/08/16(日) 14:23:32.50ID:a4RxNiOb カルトだ、見るとPTSDになりそうとかえらい言われようだけど
正直だと思う
正直だと思う
221デフォルトの名無しさん
2026/08/16(日) 14:26:52.76ID:a4RxNiOb >>219
同意だな、関数型で関数変換し細分化されていくにしたがって
ビックリするくらいシンプルな関数になっていくことがあるのには目を見張った。
複合型も必要性がなくなるというか、細分化の過程でシンプルな局所変数や引数のcall treeのscopeの中に構成されていくような不思議な感覚
同意だな、関数型で関数変換し細分化されていくにしたがって
ビックリするくらいシンプルな関数になっていくことがあるのには目を見張った。
複合型も必要性がなくなるというか、細分化の過程でシンプルな局所変数や引数のcall treeのscopeの中に構成されていくような不思議な感覚
222デフォルトの名無しさん
2026/08/16(日) 14:28:36.72ID:a4RxNiOb ただ、毎回何でもかんでもうまくいくとは限らないし
再帰や関数変化の考え方など頭に少し負担がかかる
再帰や関数変化の考え方など頭に少し負担がかかる
223デフォルトの名無しさん
2026/08/16(日) 14:36:36.64ID:9AyjbUVF デザインパターンのうち複数の型が出てくるものは二つのパターンにまとめられるよ。
(1) 利用する関係なら、インターフェースを境界にして、利用する側はインターフェースのみ使い、利用される側はインターフェースを実装してそれのみ公開しましょう。
そうすれば両者を疎結合にできますよ。
(2) 機能や動作に共通事項があるなら、それをインターフェースして、各型で実装しましょう。
そうすればそのインターフェース抽象型を用いた共通コードにできますよ。
もちろん(1)(2)は部分的に重なっているからね。
さらに高階関数を引数に取るものもこのインターフェース抽象型パターンは使われているね。
高階関数とは両立する話だよ。
(1) 利用する関係なら、インターフェースを境界にして、利用する側はインターフェースのみ使い、利用される側はインターフェースを実装してそれのみ公開しましょう。
そうすれば両者を疎結合にできますよ。
(2) 機能や動作に共通事項があるなら、それをインターフェースして、各型で実装しましょう。
そうすればそのインターフェース抽象型を用いた共通コードにできますよ。
もちろん(1)(2)は部分的に重なっているからね。
さらに高階関数を引数に取るものもこのインターフェース抽象型パターンは使われているね。
高階関数とは両立する話だよ。
224デフォルトの名無しさん
2026/08/16(日) 15:02:31.66ID:Ody7f1dX Fizz buzzって知らなかってけど、wikipediaでルールを読んでみると曖昧で、
いくつかの解釈ができてしまう。
英語版と日本語版では異なる解釈もできる。
だめな仕様書の例ですね笑(jokeですからね念のため)。
オブジェクト(指向)を使うという限定で、extends/interfaceなどを使って書いてみるのはたしかにおもしろい。
いくつかの解釈ができてしまう。
英語版と日本語版では異なる解釈もできる。
だめな仕様書の例ですね笑(jokeですからね念のため)。
オブジェクト(指向)を使うという限定で、extends/interfaceなどを使って書いてみるのはたしかにおもしろい。
225デフォルトの名無しさん
2026/08/16(日) 15:24:35.35ID:4EyRDcWH 別にインターフェースである必要すらなくて
1. 利用する関係なら利用側が必要とするものだけを依存関係の境界にして 利用側は相手の具体的な実装詳細に依存しないようにする
2. 機能や動作に共通事項があるならそれを共通の抽象として切り出す
かな?
Rustにあわせてインターフェースを抽象的な契約と言い換えてもいいけどZigだと必要な操作を満たす型をcomptimeで決めれば済むからねえ
Rustに合わせてインターフェースを抽象的な契約と言い換えてもいいけど Zigだと抽象的な契約を用意せずに利用側が必要とする操作をcomptimeで要求して具体型がそれを満たすことをコンパイル時に検証すれば済むからね C++のテンプレートの考え方と似てる
1. 利用する関係なら利用側が必要とするものだけを依存関係の境界にして 利用側は相手の具体的な実装詳細に依存しないようにする
2. 機能や動作に共通事項があるならそれを共通の抽象として切り出す
かな?
Rustにあわせてインターフェースを抽象的な契約と言い換えてもいいけどZigだと必要な操作を満たす型をcomptimeで決めれば済むからねえ
Rustに合わせてインターフェースを抽象的な契約と言い換えてもいいけど Zigだと抽象的な契約を用意せずに利用側が必要とする操作をcomptimeで要求して具体型がそれを満たすことをコンパイル時に検証すれば済むからね C++のテンプレートの考え方と似てる
226デフォルトの名無しさん
2026/08/16(日) 15:28:09.68ID:4EyRDcWH Zigよ もっと流行れ
227デフォルトの名無しさん
2026/08/16(日) 16:10:14.50ID:7OiFm8W8 >>225
Zigはインターフェースを持たないからむしろ不便で型安全性も低い
インターフェースによる抽象型を使えないからanytype型で扱ってこのように制約することになる
fn printable(comptime T: type) bool {
return @hasDecl(T, "print");
}
fn callPrint(value: anytype) void {
comptime {
if (!printable(@TypeOf(value))) {
@compileError("Type must have a 'print' method");
}
}
value.print();
}
Zigはインターフェースを持たないからむしろ不便で型安全性も低い
インターフェースによる抽象型を使えないからanytype型で扱ってこのように制約することになる
fn printable(comptime T: type) bool {
return @hasDecl(T, "print");
}
fn callPrint(value: anytype) void {
comptime {
if (!printable(@TypeOf(value))) {
@compileError("Type must have a 'print' method");
}
}
value.print();
}
228デフォルトの名無しさん
2026/08/16(日) 16:52:26.67ID:4EyRDcWH >>227
Zigはinterfaceがないから型安全性が低いという指摘は論点がずれてる気がする
不便なのはともかくとしてね
Zigのstatic polymorphismは利用側が要求する操作を満たしているかのほうを何の型なのかよりも重要視してる
comptimeとanytypeで具体的な型がコンパイルで決まるしその型に必要な操作がなかったらコンパイルエラーにちゃんとなる
だから型安全性が低いんじゃなくて名前付きの契約で型を分類制約する仕組みがないというほうが近い
Rustのtrait/interfaceをそのまま使えないのと型安全性が低いのは分けて考えるべき
Zigはinterfaceがないから型安全性が低いという指摘は論点がずれてる気がする
不便なのはともかくとしてね
Zigのstatic polymorphismは利用側が要求する操作を満たしているかのほうを何の型なのかよりも重要視してる
comptimeとanytypeで具体的な型がコンパイルで決まるしその型に必要な操作がなかったらコンパイルエラーにちゃんとなる
だから型安全性が低いんじゃなくて名前付きの契約で型を分類制約する仕組みがないというほうが近い
Rustのtrait/interfaceをそのまま使えないのと型安全性が低いのは分けて考えるべき
229デフォルトの名無しさん
2026/08/16(日) 17:01:36.86ID:bGqhVQCa interfaceで明示した方が可読性も保守性も良い
230デフォルトの名無しさん
2026/08/16(日) 17:19:52.45ID:0pgo/mMd231デフォルトの名無しさん
2026/08/16(日) 17:20:26.30ID:4EyRDcWH >>229
考え方の違いだね
RustやJavaは抽象的な契約を一箇所にまとめることで可読性や保守性を高めるのに対して
Zigは不要な抽象を作らずに実際に必要な操作だけを書くことでコードを単純にするっていう考えだから
考え方の違いだね
RustやJavaは抽象的な契約を一箇所にまとめることで可読性や保守性を高めるのに対して
Zigは不要な抽象を作らずに実際に必要な操作だけを書くことでコードを単純にするっていう考えだから
232デフォルトの名無しさん
2026/08/16(日) 17:26:17.84ID:4EyRDcWH >>230
RustやJavaにあるような抽象的な契約の考えをZigに持ち込むのがそもそもパターンとして間違ってる
RustやJavaにあるような抽象的な契約の考えをZigに持ち込むのがそもそもパターンとして間違ってる
233デフォルトの名無しさん
2026/08/16(日) 17:36:12.25ID:D1LzEAcA >>231
Zigで型をanytypeと書く暇があったら代わりにinterface名を書けばいいよね
そこでのコードの長さは変わらなくてZigは可読性の低下だけ招いてるような
Zigが節約できたのはinterface宣言つまりmethod名と型signatureを列挙することだけかな
可読性の低下と引き換えにZigが得たものが小さすぎて割に合わない気がする
Zigで型をanytypeと書く暇があったら代わりにinterface名を書けばいいよね
そこでのコードの長さは変わらなくてZigは可読性の低下だけ招いてるような
Zigが節約できたのはinterface宣言つまりmethod名と型signatureを列挙することだけかな
可読性の低下と引き換えにZigが得たものが小さすぎて割に合わない気がする
234デフォルトの名無しさん
2026/08/16(日) 18:50:20.61ID:4EyRDcWH235デフォルトの名無しさん
2026/08/16(日) 19:37:14.99ID:uznes1x1 Zig方式だと異なるインターフェース相当の同一型メソッドを区別できずに混ざってしまうため型安全性も落ちる
236デフォルトの名無しさん
2026/08/16(日) 21:15:59.83ID:8yz0P3zw ・構造的型付けは性質の一致をみる
・名前的型付けは概念(性質の集合)の一致をみる
ものだとすると、構造的型付けの方がロジックバグを作りやすいのはそのとおりだと思う
型安全という概念はプログラムの実行時に未定義の操作(存在しないメソッドの呼び出しなど)を起こさないというものなのでどちらも型安全ではあるってことなんじゃないかな
・名前的型付けは概念(性質の集合)の一致をみる
ものだとすると、構造的型付けの方がロジックバグを作りやすいのはそのとおりだと思う
型安全という概念はプログラムの実行時に未定義の操作(存在しないメソッドの呼び出しなど)を起こさないというものなのでどちらも型安全ではあるってことなんじゃないかな
237デフォルトの名無しさん
2026/08/16(日) 21:32:38.32ID:8yz0P3zw 型安全じゃないなら何と表現するのが良いのかな、意図安全?
238デフォルトの名無しさん
2026/08/16(日) 21:38:31.47ID:3V/Fi6zs Zigはそのanytypeの時に複数の異なる型がやって来るわけだけど
生成コードは単相化?それとも動的ディスパッチ?
生成コードは単相化?それとも動的ディスパッチ?
239デフォルトの名無しさん
2026/08/16(日) 22:34:55.59ID:Co7DsicL Zigとかどうでもよくね
思想が他と違うだろあれ
思想が他と違うだろあれ
240デフォルトの名無しさん
2026/08/16(日) 22:37:18.88ID:SoMBue1h241デフォルトの名無しさん
2026/08/16(日) 23:34:48.38ID:4RZhk79G それ起きるのなぜかfinalがないRustだけだろ
242デフォルトの名無しさん
2026/08/17(月) 00:16:26.92ID:38V+3mdM そもそもRustでは起きない
243デフォルトの名無しさん
2026/08/17(月) 00:19:02.71ID:O4jJSPJp >>242
どうしてそう考えるの?
どうしてそう考えるの?
244デフォルトの名無しさん
2026/08/17(月) 09:45:51.74ID:UewEXcwQ245デフォルトの名無しさん
2026/08/17(月) 12:16:16.38ID:CJr3tgZ2 論破されても同じ主張を根拠無く延々と繰り返す
それが複おじ!!
それが複おじ!!
246デフォルトの名無しさん
2026/08/17(月) 13:29:22.69ID:wAb5rDbA で、お前ら実際にクラス継承なんか使ってんのか?
247デフォルトの名無しさん
2026/08/17(月) 13:37:49.96ID:GxsMwSQY なるべく使わないがそれが何か
248デフォルトの名無しさん
2026/08/17(月) 14:03:56.79ID:rUdNNfGv 必要がない機能がないなら用足りないっつってもいいが
使いもしない機能が余計についてるだけのことでとやかく語って何が楽しいの?
使いもしない機能が余計についてるだけのことでとやかく語って何が楽しいの?
249デフォルトの名無しさん
2026/08/17(月) 14:12:17.93ID:9dsT8/CZ >>248
お前のその斜に構えた態度がクソダセーって話でお前がいないところでみんな盛り上がってるから心配すんな楽しいぞ
お前のその斜に構えた態度がクソダセーって話でお前がいないところでみんな盛り上がってるから心配すんな楽しいぞ
250デフォルトの名無しさん
2026/08/17(月) 14:13:30.75ID:rUdNNfGv 時間の無駄
251デフォルトの名無しさん
2026/08/17(月) 14:20:40.34ID:9dsT8/CZ 5ch見て時間の無駄は草
252デフォルトの名無しさん
2026/08/17(月) 14:58:45.13ID:GxsMwSQY >>249
それどこよ?
それどこよ?
253デフォルトの名無しさん
2026/08/17(月) 15:01:13.59ID:9dsT8/CZ >>252
うそやで
うそやで
254デフォルトの名無しさん
2026/08/17(月) 15:03:07.13ID:GxsMwSQY >>247
害が少なくて役に立つところには、たまにor稀に使う
そうじゃないと多用したらプログラムがわかりにくくなってしょうがない
拡張などメンテでは解読とあっちこっち目を通して整合させたり手が掛かるし
害が少なくて役に立つところには、たまにor稀に使う
そうじゃないと多用したらプログラムがわかりにくくなってしょうがない
拡張などメンテでは解読とあっちこっち目を通して整合させたり手が掛かるし
255デフォルトの名無しさん
2026/08/17(月) 15:03:50.96ID:GxsMwSQY256デフォルトの名無しさん
2026/08/17(月) 15:05:08.29ID:GxsMwSQY >>254
バグ紛れ込むし見つけにくいし
バグ紛れ込むし見つけにくいし
257デフォルトの名無しさん
2026/08/17(月) 15:52:04.48ID:DZRCEu47 今まで単に使う場面が無かったから使ったことがないな
258デフォルトの名無しさん
2026/08/17(月) 17:38:40.01ID:hu6Kc+Um みんな仕事したことないのか
259デフォルトの名無しさん
2026/08/17(月) 18:00:39.50ID:9dsT8/CZ いやまあライブラリ作るのでない限り継承が必要になることはないでしょ
お仕事では既存のライブラリを使ってアプリ作るほうが圧倒的に多いだろうしそんなもんじゃないかな
お仕事では既存のライブラリを使ってアプリ作るほうが圧倒的に多いだろうしそんなもんじゃないかな
260デフォルトの名無しさん
2026/08/17(月) 18:37:49.03ID:GiCS5tuu そんな小規模な開発じゃ使わないからw
261デフォルトの名無しさん
2026/08/17(月) 19:17:05.30ID:P355WQDR 大規模な開発で濫用すると滅びるぞ
262デフォルトの名無しさん
2026/08/17(月) 19:25:42.72ID:pTNaMQne 大規模ならインターフェース実装と委譲
263デフォルトの名無しさん
2026/08/17(月) 19:26:11.71ID:fHDv2p6M traitの中に実装を書くのがそもそもアホ
264デフォルトの名無しさん
2026/08/17(月) 20:25:04.55ID:9dsT8/CZ Unit Test書いてCIする時代なんだし好きに書いたら良い
まさかUnit Test書いてCIしてないやつはいないよな?
俺はどっちもやってないけどな
まさかUnit Test書いてCIしてないやつはいないよな?
俺はどっちもやってないけどな
265デフォルトの名無しさん
2026/08/17(月) 22:32:08.18ID:kjYhoonu266デフォルトの名無しさん
2026/08/18(火) 06:20:16.09ID:9HbNxAXp >>265
きたねー言語だなぁ
きたねー言語だなぁ
267デフォルトの名無しさん
2026/08/18(火) 07:06:16.69ID:mY9waEio >>266
綺麗に書いてみて
綺麗に書いてみて
268デフォルトの名無しさん
2026/08/18(火) 07:09:42.79ID:mY9waEio 抽象型やinterfaceやtraitやZigを活用したらどのくらいきれいになるんだろう
269デフォルトの名無しさん
2026/08/18(火) 07:52:58.90ID:qWsaXKMs そりゃ文字列"fizzbuzz"は直書きせずともcomptimeで生成だろ
270デフォルトの名無しさん
2026/08/18(火) 09:09:48.18ID:CwdGUKcu271デフォルトの名無しさん
2026/08/18(火) 09:21:01.28ID:s6UVuJiP テンポラリ変数嫌いすぎて可読性落とす書き方するやつってけっこういるよな
272デフォルトの名無しさん
2026/08/18(火) 09:49:26.70ID:dgmmJ4dW 10行で書けるけどそれだと金にならないから100行に水増ししてかっこいい雰囲気を醸し出せる
それがオブジェクト指向
それがオブジェクト指向
273デフォルトの名無しさん
2026/08/18(火) 10:05:16.38ID:kPRCdywZ オブジェクト指向前だって#defineがズラズラ並んでる見づらいコードだったけど
274デフォルトの名無しさん
2026/08/18(火) 10:53:18.24ID:gcpAV276 >>270
目的の関数とメイン関数は分けなければいけない
今回は無限FizzBuzzイテレータを返すだけの関数を分離すると望ましい
データ生成とそのデータのビューアーも分離しなければいけない
文字列化するのはビューアーの役目であり途中のデータは可能な限り軽い小さなものにする
固有のロジック部分の分離も望ましい
今回はもちろんFizzBuzzへの変換部分を分ける
目的の関数とメイン関数は分けなければいけない
今回は無限FizzBuzzイテレータを返すだけの関数を分離すると望ましい
データ生成とそのデータのビューアーも分離しなければいけない
文字列化するのはビューアーの役目であり途中のデータは可能な限り軽い小さなものにする
固有のロジック部分の分離も望ましい
今回はもちろんFizzBuzzへの変換部分を分ける
275デフォルトの名無しさん
2026/08/18(火) 11:29:29.44ID:mY9waEio276デフォルトの名無しさん
2026/08/18(火) 11:39:15.61ID:mY9waEio 凝った技術を使って 後退している感じ
まあ遊びとしてはありかな
まあ遊びとしてはありかな
277デフォルトの名無しさん
2026/08/18(火) 11:44:50.67ID:FI1FzRN/278デフォルトの名無しさん
2026/08/18(火) 11:58:25.60ID:s6UVuJiP >>277
この内容で関数分けは逆にやりすぎだよ
この内容で関数分けは逆にやりすぎだよ
279デフォルトの名無しさん
2026/08/18(火) 12:03:00.45ID:mr91AiPO280デフォルトの名無しさん
2026/08/18(火) 12:09:50.58ID:s6UVuJiP >>279
レビューポイントがずれてるところ見ると例の人か
レビューポイントがずれてるところ見ると例の人か
281デフォルトの名無しさん
2026/08/18(火) 12:12:44.41ID:yVjtC2wq ビュー部分とロジック部分は分けるべきだろうね
282デフォルトの名無しさん
2026/08/18(火) 12:12:55.79ID:mY9waEio レビュー言ってる人が書くともっとヒデ―んだろうな…
283デフォルトの名無しさん
2026/08/18(火) 12:22:41.95ID:zZZZox/S ノウハウが盗まれないように最初から難読化しているのに、
それをextendsがevilだといわれちゃうと心外ですよねぇ笑。
それは単なるtrapだ。trapに引っかかるようなバカは不要という世界。
それをextendsがevilだといわれちゃうと心外ですよねぇ笑。
それは単なるtrapだ。trapに引っかかるようなバカは不要という世界。
284デフォルトの名無しさん
2026/08/18(火) 12:25:26.30ID:Wbf7Xhfh 少なくとも個別テストができるレベルでの関数分けは常に義務付けられる。
データ生成部分とデータ表示部分を分離しなさいという常識も、混在は可読性を下げるだけでなくテストを困難にするためだ。
データ生成部分とデータ表示部分を分離しなさいという常識も、混在は可読性を下げるだけでなくテストを困難にするためだ。
285デフォルトの名無しさん
2026/08/18(火) 12:30:03.24ID:zZZZox/S test firstはtestを先に書け、ということではなく、
testすること/できることを前提に設計しろ、ということ。
Unit testできないもの、integration testできないプログラムはゴミでしかない。
testすること/できることを前提に設計しろ、ということ。
Unit testできないもの、integration testできないプログラムはゴミでしかない。
286デフォルトの名無しさん
2026/08/18(火) 12:41:42.10ID:mY9waEio 結局、カルトな迷信から抜け出せないのね
287デフォルトの名無しさん
2026/08/18(火) 12:54:55.98ID:BvR5dCBy 文字列への変換はできる限り遅延させて可能なら表示の直前まで遅延させることが望ましいという原則
これは抽象的なデータとして持っていた方が可読性と保守性に勝るだけでなく
高速化や省メモリ化の観点からでもあるね
文字列にして持っていると格納メモリが増えて比較も遅くなっちゃう
これは抽象的なデータとして持っていた方が可読性と保守性に勝るだけでなく
高速化や省メモリ化の観点からでもあるね
文字列にして持っていると格納メモリが増えて比較も遅くなっちゃう
288デフォルトの名無しさん
2026/08/18(火) 12:56:42.55ID:zZZZox/S Fizz buzzについては、wikipediaのルールを基準として、それを仕様とみなせば、
仕様をみたしていないプログラムが多い(日本語版wikipediaを含む)。
これを試験に出すとすると、仕様というものを理解できていない会社が多い。
結果が同じであればよいのではなく、保守や運用を考えると仕様を満たしていることが必要。
仕様をみたしていないプログラムが多い(日本語版wikipediaを含む)。
これを試験に出すとすると、仕様というものを理解できていない会社が多い。
結果が同じであればよいのではなく、保守や運用を考えると仕様を満たしていることが必要。
289デフォルトの名無しさん
2026/08/18(火) 14:51:02.89ID:mY9waEio wikipediaのルールが実は違ったらどーすんの?
290デフォルトの名無しさん
2026/08/18(火) 16:49:24.64ID:CwdGUKcu >>288
FizzBuzzじゃなくてFizz Buzzが正しいんだとかそういうこと?
FizzBuzzじゃなくてFizz Buzzが正しいんだとかそういうこと?
291デフォルトの名無しさん
2026/08/18(火) 16:50:03.29ID:CwdGUKcu >>275
…はー…我慢!我慢!
…はー…我慢!我慢!
292デフォルトの名無しさん
2026/08/18(火) 17:04:30.03ID:mY9waEio もしかして頑張って書いてくれたんだ、ゴメンチャイ
293デフォルトの名無しさん
2026/08/18(火) 18:16:51.47ID:zZZZox/S wikipediaに仕様は書かれていないので、仕様は自分で書き起こすことになる。
そこでhttps://rosettacode.org/wiki/FizzBuzzあたりから仕様を持ってくる。
3の倍数のときはFizz、
5の倍数のときはBuzz、
3と5の倍数のときはFizzBuzz。
このルールの優先順位は不明だ。混乱する。
wikipediaではreplaceすることになっており、さらに混乱は増す。
3つ目のルールは1・2を前提にしておらず、仕様の変更によって別の文言になる可能性がある。
仕様の曖昧さとバージョンアップの可能性を、出題者に確認しないで作り進めた場合は、
0点だろう。
また、確認したら逆切れされた、とかいう場合は、その会社には行かない/やめることが重要だ笑。
そこでhttps://rosettacode.org/wiki/FizzBuzzあたりから仕様を持ってくる。
3の倍数のときはFizz、
5の倍数のときはBuzz、
3と5の倍数のときはFizzBuzz。
このルールの優先順位は不明だ。混乱する。
wikipediaではreplaceすることになっており、さらに混乱は増す。
3つ目のルールは1・2を前提にしておらず、仕様の変更によって別の文言になる可能性がある。
仕様の曖昧さとバージョンアップの可能性を、出題者に確認しないで作り進めた場合は、
0点だろう。
また、確認したら逆切れされた、とかいう場合は、その会社には行かない/やめることが重要だ笑。
294デフォルトの名無しさん
2026/08/18(火) 18:45:23.15ID:UHB640UT >>291
あのフリからのあのコードだから普通の人はネタだと分かるから心配しなさんな
あのフリからのあのコードだから普通の人はネタだと分かるから心配しなさんな
295デフォルトの名無しさん
2026/08/18(火) 19:03:06.87ID:mY9waEio >>293
かたいのはチンチンだけにした方がいいよ
かたいのはチンチンだけにした方がいいよ
296デフォルトの名無しさん
2026/08/18(火) 19:07:28.34ID:1F5abdGh >>278
関数分けされてないことだけが今回のコードの問題点だよ
少なくともテストができるように分離かな
テストではなくprintするだけにしてもメイン側に書いていいことは1から20までやprintのみ
関数分けされてないことだけが今回のコードの問題点だよ
少なくともテストができるように分離かな
テストではなくprintするだけにしてもメイン側に書いていいことは1から20までやprintのみ
297デフォルトの名無しさん
2026/08/18(火) 19:37:50.56ID:4nWkMale ネタで5chに晒すトイプログラムは、あれこれ欲張って機能付帯するよりエッセンスだけ凝縮したような物でいいと思うがな
極論だが、one linerでも話のネタになればそれでもいいんジャマイカと思う
極論だが、one linerでも話のネタになればそれでもいいんジャマイカと思う
298デフォルトの名無しさん
2026/08/18(火) 20:26:22.86ID:IKbB6EpN >>270は普通に書かれているだけでネタには全くなってない
299デフォルトの名無しさん
2026/08/18(火) 22:36:43.09ID:xbj6Xdrn >>295
そっちは硬くならない
そっちは硬くならない
300デフォルトの名無しさん
2026/08/19(水) 01:07:10.28ID:LbA7Fa3/ 結果だけなら無限ジェネレータ、イテレータ使うのがシンプルで無駄ないけど
初学者が分岐と文字列出力駆使してコーディングできるかのお題だから
経験者はあたたかくみまもるのが正解
初学者が分岐と文字列出力駆使してコーディングできるかのお題だから
経験者はあたたかくみまもるのが正解
301デフォルトの名無しさん
2026/08/19(水) 01:17:33.88ID:76BzD64w >>268
Rustはこんな感じ
use std::fmt;
struct FizzBuzz(usize);
impl fmt::Display for FizzBuzz {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let fizz = self.0 % 3 == 0;
if fizz {
write!(f, "Fizz")?;
}
let buzz = self.0 % 5 == 0;
if buzz {
write!(f, "Buzz")?;
}
if !fizz && !buzz {
write!(f, "{}", self.0)?;
}
Ok(())
}
}
Rustはこんな感じ
use std::fmt;
struct FizzBuzz(usize);
impl fmt::Display for FizzBuzz {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let fizz = self.0 % 3 == 0;
if fizz {
write!(f, "Fizz")?;
}
let buzz = self.0 % 5 == 0;
if buzz {
write!(f, "Buzz")?;
}
if !fizz && !buzz {
write!(f, "{}", self.0)?;
}
Ok(())
}
}
302デフォルトの名無しさん
2026/08/19(水) 05:08:00.70ID:jKqAYIeP use v5.26;
use feature 'signatures'; no warnings 'experimental::signatures';
# Y combinator
my $Y = sub ($f) {
(sub ($x) { $x->($x) })->(sub ($x) {
$f->(sub (@args) { $x->($x)->(@args) })
})
};
# generator
my $fizzbuzz_gen = sub ($recurse) {
sub ($n) {
return if $n > 20;
my $a = "";
$a = "fizz" if 0 == $n % 3;
$a .= "buzz" if 0 == $n % 5;
$a ||= $n;
print "$a\n";
$recurse->($n + 1);
}
};
$Y->($fizzbuzz_gen)->(1);
use feature 'signatures'; no warnings 'experimental::signatures';
# Y combinator
my $Y = sub ($f) {
(sub ($x) { $x->($x) })->(sub ($x) {
$f->(sub (@args) { $x->($x)->(@args) })
})
};
# generator
my $fizzbuzz_gen = sub ($recurse) {
sub ($n) {
return if $n > 20;
my $a = "";
$a = "fizz" if 0 == $n % 3;
$a .= "buzz" if 0 == $n % 5;
$a ||= $n;
print "$a\n";
$recurse->($n + 1);
}
};
$Y->($fizzbuzz_gen)->(1);
303デフォルトの名無しさん
2026/08/19(水) 05:27:50.54ID:jKqAYIeP use v5.26; use feature 'signatures'; no warnings 'experimental::signatures';
my $Y = sub($f){ (sub($x){ $x->($x) })->(sub($x){ $f->(sub(@a){ $x->($x)->(@a) }) }) };
$Y->(sub($r){ sub($n=20){
$n && $r->($n - 1) . print((('fizz')[$n%3].('buzz')[$n%5] || $n)."\n")
}})->();
my $Y = sub($f){ (sub($x){ $x->($x) })->(sub($x){ $f->(sub(@a){ $x->($x)->(@a) }) }) };
$Y->(sub($r){ sub($n=20){
$n && $r->($n - 1) . print((('fizz')[$n%3].('buzz')[$n%5] || $n)."\n")
}})->();
304デフォルトの名無しさん
2026/08/19(水) 05:53:05.29ID:jKqAYIeP >>299
添え木するか ト
添え木するか ト
305デフォルトの名無しさん
2026/08/19(水) 06:06:15.93ID:jKqAYIeP ttps://ja.wikipedia.org/wiki/%E4%B8%8D%E5%8B%95%E7%82%B9%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF
306デフォルトの名無しさん
2026/08/19(水) 06:57:23.62ID:PkKxELQ5307デフォルトの名無しさん
2026/08/19(水) 09:25:42.01ID:zfDVRijx >>306
はよ
はよ
308デフォルトの名無しさん
2026/08/19(水) 09:26:57.21ID:AOQ3QAZ6309デフォルトの名無しさん
2026/08/19(水) 11:30:51.59ID:JEHGtM5b オブジェクト指向をバカにしてるやつ(≒苦手にしてるやつ)ほど役割分担下手だよな
310デフォルトの名無しさん
2026/08/19(水) 11:32:25.08ID:jKqAYIeP311デフォルトの名無しさん
2026/08/19(水) 12:47:31.88ID:6v15mJkM312デフォルトの名無しさん
2026/08/19(水) 13:00:20.84ID:IT0gHGzs313デフォルトの名無しさん
2026/08/19(水) 13:13:14.33ID:Wk2G6dYo314デフォルトの名無しさん
2026/08/19(水) 13:25:34.76ID:DVblsqcj315デフォルトの名無しさん
2026/08/19(水) 14:46:16.71ID:zfDVRijx316デフォルトの名無しさん
2026/08/19(水) 15:09:53.60ID:clBhGGD3 >>313
煽られただけだと思うよ
煽られただけだと思うよ
317デフォルトの名無しさん
2026/08/19(水) 16:47:55.93ID:GgmociGN やるとしたらfmt::Displayの実装とFizzBuzz判定の実装を別々に分担するくらいか?
あと個人的にはifじゃなくてmatchでよくね?と
あと個人的にはifじゃなくてmatchでよくね?と
318デフォルトの名無しさん
2026/08/19(水) 17:22:08.92ID:76BzD64w >>301は最小限のコードを書いたので
もう少しFizzBuzzオブジェクトに肉付けすると
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
struct FizzBuzz(usize);
impl FizzBuzz {
fn is_fizz(&self) -> bool {
self.0 % 3 == 0
}
fn is_buzz(&self) -> bool {
self.0 % 5 == 0
}
fn iter() -> impl Iterator<Item = FizzBuzz> {
(1..).map(|x| FizzBuzz(x))
}
}
impl fmt::Display for FizzBuzz {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.is_fizz() {
write!(f, "Fizz")?;
}
if self.is_buzz() {
write!(f, "Buzz")?;
}
if !self.is_fizz() && !self.is_buzz() {
write!(f, "{}", self.0)?;
}
Ok(())
}
}
もう少しFizzBuzzオブジェクトに肉付けすると
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
struct FizzBuzz(usize);
impl FizzBuzz {
fn is_fizz(&self) -> bool {
self.0 % 3 == 0
}
fn is_buzz(&self) -> bool {
self.0 % 5 == 0
}
fn iter() -> impl Iterator<Item = FizzBuzz> {
(1..).map(|x| FizzBuzz(x))
}
}
impl fmt::Display for FizzBuzz {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.is_fizz() {
write!(f, "Fizz")?;
}
if self.is_buzz() {
write!(f, "Buzz")?;
}
if !self.is_fizz() && !self.is_buzz() {
write!(f, "{}", self.0)?;
}
Ok(())
}
}
319デフォルトの名無しさん
2026/08/19(水) 17:27:41.72ID:76BzD64w320デフォルトの名無しさん
2026/08/19(水) 17:35:12.55ID:1B1Sgr4M // java21, import略, rosettacodeの仕様による。3と5の倍数の場合、3や5のwordと関係ないものとみなして独立。改行詰め,、改行が多いだと!
public class FizzBuzz {
private static final int IntMin = 1;
private static final int IntMaxClosed = 100;
private static final String Fizz = "Fizz";
private static final String Buzz = "Buzz";
private static final String FizzBuzz = "FizzBuzz";
private static final BigInteger bigInteger15 = BigInteger.valueOf(15);
private final int value;
private FizzBuzz(int value) { this.value = value; }
static Stream<FizzBuzz> generator() {
return IntStream.rangeClosed(IntMin, IntMaxClosed).mapToObj(FizzBuzz::new);
}
int gcd15() {
return BigInteger.valueOf(value).gcd(bigInteger15).intValue();
}
String toText() {
return switch (gcd15()) {
case 3 -> Fizz;
case 5 -> Buzz;
case 15 -> FizzBuzz;
default -> toString();
};
}
@Override
public String toString() { return Integer.toString(value); }
public static void main(String[] args) { generator().map(fb -> fb.toText()).forEach(System.out::println); }
}
public class FizzBuzz {
private static final int IntMin = 1;
private static final int IntMaxClosed = 100;
private static final String Fizz = "Fizz";
private static final String Buzz = "Buzz";
private static final String FizzBuzz = "FizzBuzz";
private static final BigInteger bigInteger15 = BigInteger.valueOf(15);
private final int value;
private FizzBuzz(int value) { this.value = value; }
static Stream<FizzBuzz> generator() {
return IntStream.rangeClosed(IntMin, IntMaxClosed).mapToObj(FizzBuzz::new);
}
int gcd15() {
return BigInteger.valueOf(value).gcd(bigInteger15).intValue();
}
String toText() {
return switch (gcd15()) {
case 3 -> Fizz;
case 5 -> Buzz;
case 15 -> FizzBuzz;
default -> toString();
};
}
@Override
public String toString() { return Integer.toString(value); }
public static void main(String[] args) { generator().map(fb -> fb.toText()).forEach(System.out::println); }
}
321デフォルトの名無しさん
2026/08/19(水) 18:32:05.09ID:h5yOG9hX これは想定外の重症度
汚コード複製おじさん酷すぎだろ
汚コード複製おじさん酷すぎだろ
322デフォルトの名無しさん
2026/08/19(水) 19:33:00.25ID:1B1Sgr4M immutableなclassとstreamでmonadicに、各methodは1行の式とした例。
改行制限と空白制限で、ちょっとおかしな表記になっている。
改行制限と空白制限で、ちょっとおかしな表記になっている。
323デフォルトの名無しさん
2026/08/19(水) 19:34:16.89ID:HQ3bB/34324デフォルトの名無しさん
2026/08/19(水) 19:40:28.85ID:1B1Sgr4M くすくす。仕様を満たすためだよ。
325デフォルトの名無しさん
2026/08/19(水) 19:48:00.60ID:yaDN1rR6 ここはオブジェクト指向でFizzBuzzを書くとどうなるかの話だよな
class FizzBuzzに属するものと外部のものを分けないとな
class FizzBuzzに属するものと外部のものを分けないとな
326デフォルトの名無しさん
2026/08/19(水) 20:06:36.33ID:1B1Sgr4M generator込みの完結したclassだがね。UnitTestにも対応してるし。
プログラム書いたことある?
プログラム書いたことある?
327デフォルトの名無しさん
2026/08/19(水) 20:31:50.49ID:xLZSPR7N328デフォルトの名無しさん
2026/08/19(水) 20:47:05.92ID:gE5f7kH9 糞言語ってことよ
329デフォルトの名無しさん
2026/08/19(水) 22:27:30.40ID:KYbvI00a >>320はgcd最大公約数を求めてるけど
その方が速いとか有利とか何かあるの?
その方が速いとか有利とか何かあるの?
330デフォルトの名無しさん
2026/08/19(水) 22:31:51.05ID:1B1Sgr4M https://paiza.io/projects/zW-QQAk1SV2qaU7Iv3Kqtw
FizzBuzz classがMain classになっちゃったけど、しかたない。
最大公約数で扱ったほうが楽だし、意味的にはGCD使ったほうが正しい。
FizzBuzz classがMain classになっちゃったけど、しかたない。
最大公約数で扱ったほうが楽だし、意味的にはGCD使ったほうが正しい。
331デフォルトの名無しさん
2026/08/19(水) 22:41:50.65ID:1B1Sgr4M generator().map(fb -> fb.toText()).forEach(System.out::println);
generator()で発生させたFizzBuzz(Main)オブジェクトをtoText()してprintlnの関手を与える。
ただそれだけ。
toText()は15とのGCD取って、結果でFizz,Buzz,FizzBuzz,その他の文字列を返すだけ。
return switch (gcd15()) {
case 3 -> Fizz;
case 5 -> Buzz;
case 15 -> FizzBuzz;
default -> toString();
};
generator()で発生させたFizzBuzz(Main)オブジェクトをtoText()してprintlnの関手を与える。
ただそれだけ。
toText()は15とのGCD取って、結果でFizz,Buzz,FizzBuzz,その他の文字列を返すだけ。
return switch (gcd15()) {
case 3 -> Fizz;
case 5 -> Buzz;
case 15 -> FizzBuzz;
default -> toString();
};
332デフォルトの名無しさん
2026/08/19(水) 22:58:17.52ID:Oc+7d+Ap >>330
class Mainとclass FizzBuzzに分けようぜ
class Mainとclass FizzBuzzに分けようぜ
333デフォルトの名無しさん
2026/08/19(水) 23:06:14.82ID:1B1Sgr4M plaza.ioは複数class書けるね。しばらくはこれを使おう。java18らしいし。
でも、本来はclass FizzBuzzひとつのオブジェクト指向の例なので、
MainはFizzBuzzに読み替えてほしい。
でも、本来はclass FizzBuzzひとつのオブジェクト指向の例なので、
MainはFizzBuzzに読み替えてほしい。
334デフォルトの名無しさん
2026/08/19(水) 23:32:28.93ID:DVblsqcj 1文字でFizzBuzz解ける言語があるらしいな
335デフォルトの名無しさん
2026/08/19(水) 23:59:25.63ID:iJ3dDJMB >>330
意味的にGCDを使うのは間違っている
さらにGCDは計算時間がかかり不利だ
途中で除数が定数でなくなるためDIV命令が必要になるためだ
普通に3で割る余りと5で割る余りの計算ならDIV命令が不要で速い
意味的にGCDを使うのは間違っている
さらにGCDは計算時間がかかり不利だ
途中で除数が定数でなくなるためDIV命令が必要になるためだ
普通に3で割る余りと5で割る余りの計算ならDIV命令が不要で速い
336デフォルトの名無しさん
2026/08/20(木) 00:06:45.18ID:QLX9OLVH 定数で割った時の余りは掛け算とシフトと引き算で済むから速いんだよな
337デフォルトの名無しさん
2026/08/20(木) 00:21:35.93ID:IBxNVMcV DIV命令? あったっけ?
338デフォルトの名無しさん
2026/08/20(木) 00:47:45.39ID:IBxNVMcV めんどくさいのでBigInteger#gcd(BigInteger)使ってるけど、
15とのGCDで3,5,15の判定だけなので自作すればもっと速いだろう。しかし、速さの指定は仕様にない。
意味的には15との最大公約数で振り分ける。保守しやすい。
if文が2つ以上あるとバグが出やすくなる笑。
15とのGCDで3,5,15の判定だけなので自作すればもっと速いだろう。しかし、速さの指定は仕様にない。
意味的には15との最大公約数で振り分ける。保守しやすい。
if文が2つ以上あるとバグが出やすくなる笑。
339デフォルトの名無しさん
2026/08/20(木) 00:56:39.43ID:QLX9OLVH CPUの割り算命令DIVは遅いんだよ
ただし定数での割り算は掛け算とシフトで代替できるから速い
ただし定数での割り算は掛け算とシフトで代替できるから速い
340デフォルトの名無しさん
2026/08/20(木) 01:32:57.14ID:ijUJjMtb その前にだな、
まともに見れるコードも書けんくせに
オブジェ指向で蘊蓄垂れていたのか君らは
まともに見れるコードも書けんくせに
オブジェ指向で蘊蓄垂れていたのか君らは
341デフォルトの名無しさん
2026/08/20(木) 01:36:09.50ID:IBxNVMcV GCDアルゴリズム実装ではなくCPUのDIVの話ね。
アルゴリズムならマルチコア上で速そうなのを考えてみよう。少しだけ思いついたので。
アルゴリズムならマルチコア上で速そうなのを考えてみよう。少しだけ思いついたので。
342デフォルトの名無しさん
2026/08/20(木) 01:56:28.80ID:aOa274Oy343デフォルトの名無しさん
2026/08/20(木) 02:00:43.32ID:aOa274Oy compactの前に.lazyわすれた
遅くなるけど概念的にそうしたい
遅くなるけど概念的にそうしたい
344デフォルトの名無しさん
2026/08/20(木) 03:02:21.65ID:PMhZJhSw FizzBuzzのように定数で割る時
商は魔法により掛け算とシフトで求まる
余りはさらに商に掛け直して元から引き算で求まる
ところがだ
FizzBuzzで余りを求める必要ないのだ
余りが0かどうか判ればいい
強力な魔法を使うと掛け算と比較で求まる
商は魔法により掛け算とシフトで求まる
余りはさらに商に掛け直して元から引き算で求まる
ところがだ
FizzBuzzで余りを求める必要ないのだ
余りが0かどうか判ればいい
強力な魔法を使うと掛け算と比較で求まる
345デフォルトの名無しさん
2026/08/20(木) 03:19:24.13ID:PMhZJhSw Fizz判定は x % 3 == 0 が真かどうか
xがeaxレジスタに入っている時
imul eax, -1431655765
cmp eax, 1431655766
この結果CFフラグ=1ならFizzだとわかる
強力な魔法のおかげで実は速い
xがeaxレジスタに入っている時
imul eax, -1431655765
cmp eax, 1431655766
この結果CFフラグ=1ならFizzだとわかる
強力な魔法のおかげで実は速い
346デフォルトの名無しさん
2026/08/20(木) 08:18:28.31ID:kHN2H/5S347デフォルトの名無しさん
2026/08/20(木) 09:08:56.05ID:q4+A3WuM オブジェクト指向じゃないほうがシンプルに作れるものを
オブジェクト指向で作ろうとするのは無駄でしかなく、オブジェクト指向の啓蒙にはならない
オブジェクト指向で作ろうとするのは無駄でしかなく、オブジェクト指向の啓蒙にはならない
348デフォルトの名無しさん
2026/08/20(木) 09:32:50.30ID:o7Pb5BUg AI時代に最適な言語とは
349デフォルトの名無しさん
2026/08/20(木) 09:39:55.23ID:m8+NKV8o >>348
英語、次点で日本語
英語、次点で日本語
350デフォルトの名無しさん
2026/08/20(木) 11:01:49.24ID:o7Pb5BUg 日本語は文字圧縮率高いからAIに向いてるよな
351デフォルトの名無しさん
2026/08/20(木) 12:05:54.04ID:vH5dPVEC >>350
向いてない
対AIの情報圧縮率は情報量/文字数じゃなくて情報量/トークン数なので日本語の情報圧縮率はむしろ低い
日本語に最適化された生成AIが出てきたとしても今の汎用生成AIで英語を使うのと同じレベルにはまずならない
ちなみに文字数ベースの情報圧縮率で言えば日本語より中国語のほうが上
向いてない
対AIの情報圧縮率は情報量/文字数じゃなくて情報量/トークン数なので日本語の情報圧縮率はむしろ低い
日本語に最適化された生成AIが出てきたとしても今の汎用生成AIで英語を使うのと同じレベルにはまずならない
ちなみに文字数ベースの情報圧縮率で言えば日本語より中国語のほうが上
352デフォルトの名無しさん
2026/08/20(木) 13:24:05.04ID:q4+A3WuM 言語ってやれることに縛りがないマシン語一択よ
353デフォルトの名無しさん
2026/08/20(木) 13:47:22.14ID:m8+NKV8o バイナリなんて扱いが面倒で
しかもCPUやOSによって全く使い物にならないから
それだけは無い
しかもCPUやOSによって全く使い物にならないから
それだけは無い
354デフォルトの名無しさん
2026/08/20(木) 14:18:30.50ID:s0ayJ18Z >>345
余りで場合分けしたりGCD求めるより素直に判定する方がええんか
余りで場合分けしたりGCD求めるより素直に判定する方がええんか
355デフォルトの名無しさん
2026/08/20(木) 16:44:10.19ID:qoBWelP1356デフォルトの名無しさん
2026/08/20(木) 16:59:35.71ID:Q5WTv99g 「FizzBuzzのプログラム書いて」の指示だけで済むのになに前時代的なことやってんの?www
357デフォルトの名無しさん
2026/08/20(木) 17:01:53.34ID:Z7Wddxg2 >>355
コンパイラは賢いから最適化するだろ
コンパイラは賢いから最適化するだろ
358デフォルトの名無しさん
2026/08/20(木) 19:35:41.56ID:v7D8p6Cq >>348
仕様そのものを検証できるプログラミング言語じゃない?
今までは人間が実装を書いてコンパイラに文法や型を検証させてたけどAIの能力が上がってからは人間が契約をまとめた仕様をAIに掲示してAIが実装するようになったからね
言うなれば人間が契約を所有しAIが実装を所有し検証器が両者の関係を所有する言語かな
気になって調べてみたらRustとVerusによる言語の二層化とかあるみたいね
仕様そのものを検証できるプログラミング言語じゃない?
今までは人間が実装を書いてコンパイラに文法や型を検証させてたけどAIの能力が上がってからは人間が契約をまとめた仕様をAIに掲示してAIが実装するようになったからね
言うなれば人間が契約を所有しAIが実装を所有し検証器が両者の関係を所有する言語かな
気になって調べてみたらRustとVerusによる言語の二層化とかあるみたいね
359デフォルトの名無しさん
2026/08/20(木) 19:40:52.66ID:IBxNVMcV >>346
まあ、モナドではあるが、厳密なモナド則には従わない。
と、思ったのですが、この限定的な状況では、モナド則を満たしていました。
また、そりゃ、void main(String[])内で、ベタに手続き型で書けば速いわけですが、
15と固定でGCDを作ってみたら、同じ速さになりました。手動展開するとベタなものと同じです。
オブジェクト指向設計の形式は同じとして計測。
まあ、モナドではあるが、厳密なモナド則には従わない。
と、思ったのですが、この限定的な状況では、モナド則を満たしていました。
また、そりゃ、void main(String[])内で、ベタに手続き型で書けば速いわけですが、
15と固定でGCDを作ってみたら、同じ速さになりました。手動展開するとベタなものと同じです。
オブジェクト指向設計の形式は同じとして計測。
360デフォルトの名無しさん
2026/08/20(木) 19:43:41.33ID:v7D8p6Cq >>356
trait implをあえて使うとそうなるっていう説明用サンプルじゃないの
trait implをあえて使うとそうなるっていう説明用サンプルじゃないの
361デフォルトの名無しさん
2026/08/20(木) 21:03:19.48ID:kHN2H/5S >>359
いやー俺も圏論詳しくないけど
君が言ってることはデタラメすぎる気がする
mapはただのファンクターじゃん
ファンクターとモナドは違うよね
モナドはflatMapの方だよ
圏論的構造のことをモナドと言ってる?
モナディックではなくてモナドチックってこと?
乙女チックみたいな話?
それならわかる
いやー俺も圏論詳しくないけど
君が言ってることはデタラメすぎる気がする
mapはただのファンクターじゃん
ファンクターとモナドは違うよね
モナドはflatMapの方だよ
圏論的構造のことをモナドと言ってる?
モナディックではなくてモナドチックってこと?
乙女チックみたいな話?
それならわかる
362デフォルトの名無しさん
2026/08/20(木) 21:48:07.29ID:kHN2H/5S 見せてやるよ、本物のモナドの力ってやつをな
C#
foreach (var i in Enumerable.Range(1, 100)) {
(int i, string s)[] ms = [
(3, "Fizz"),
(5, "Buzz"),
(7, "Pop"),
(11, "Jazz"),
(13, "Rock")
];
var s = string.Concat(ms
.SelectMany(m => i % m.i == 0 ? new[] { m.s } : [])
.DefaultIfEmpty(i.ToString()));
Console.WriteLine(s);
}
SelectManyがモナドです
ご清聴ありがとうございました
C#
foreach (var i in Enumerable.Range(1, 100)) {
(int i, string s)[] ms = [
(3, "Fizz"),
(5, "Buzz"),
(7, "Pop"),
(11, "Jazz"),
(13, "Rock")
];
var s = string.Concat(ms
.SelectMany(m => i % m.i == 0 ? new[] { m.s } : [])
.DefaultIfEmpty(i.ToString()));
Console.WriteLine(s);
}
SelectManyがモナドです
ご清聴ありがとうございました
363デフォルトの名無しさん
2026/08/20(木) 22:16:51.48ID:C4aTds+L error: Unexpected symbol `['
364デフォルトの名無しさん
2026/08/20(木) 22:20:08.69ID:IBxNVMcV >>361
モナドですけど何か?
モナドですけど何か?
365デフォルトの名無しさん
2026/08/20(木) 22:57:28.02ID:vi4f/pAg366デフォルトの名無しさん
2026/08/20(木) 23:13:28.71ID:z4h/0sw5367デフォルトの名無しさん
2026/08/20(木) 23:52:42.25ID:h+f/dAtq >>362の無能さは(1, 100)でよくわかる
100にするなら少なくともそこは105だろ
100にするなら少なくともそこは105だろ
368デフォルトの名無しさん
2026/08/21(金) 00:12:08.26ID:Gi1J9j3d >>364
違うと思うけど明日AIに聞いてみるわ、お休みモナ
違うと思うけど明日AIに聞いてみるわ、お休みモナ
369デフォルトの名無しさん
2026/08/21(金) 05:47:35.54ID:beX5364R >>362
生成AI製か
生成AI製か
370デフォルトの名無しさん
2026/08/21(金) 10:51:05.66ID:I6E5haBJ >>368
引っかかってるのはIEnumerable<T>やStream<T>がモナドかどうかではなく
それらがモナドとして使われてない処理をモナディックと言うかどうかでしょ?
俺は言わないと思うけど言う人がいてもその違いが重要じゃない限りスルーする
引っかかってるのはIEnumerable<T>やStream<T>がモナドかどうかではなく
それらがモナドとして使われてない処理をモナディックと言うかどうかでしょ?
俺は言わないと思うけど言う人がいてもその違いが重要じゃない限りスルーする
371デフォルトの名無しさん
2026/08/21(金) 11:31:05.64ID:Gi1J9j3d >>364
> モナドですけど何か?
AIに聞いてみたけど >>320 は値オブジェクトでStreamを使ってるだけでモナドではないそうだよ
全文はこちら
https://chatgpt.com/share/6a87b6cf-2020-83ee-b07e-f2e91e706ada
>>359
> モナド則を満たしていました
これも偽だよ
> モナドですけど何か?
AIに聞いてみたけど >>320 は値オブジェクトでStreamを使ってるだけでモナドではないそうだよ
全文はこちら
https://chatgpt.com/share/6a87b6cf-2020-83ee-b07e-f2e91e706ada
>>359
> モナド則を満たしていました
これも偽だよ
372デフォルトの名無しさん
2026/08/21(金) 11:47:36.75ID:Gi1J9j3d373デフォルトの名無しさん
2026/08/21(金) 11:48:44.92ID:ZIDlXGUM ( ´∀`)
374デフォルトの名無しさん
2026/08/21(金) 12:29:56.97ID:2CvgJbgX >>372
Functor, Applicative は合成も Functor, Applicative になるけど, Monad は閉じてない.
他言語知らぬが, Haskell では少なくともそう.
Functor, Applicative は合成も Functor, Applicative になるけど, Monad は閉じてない.
他言語知らぬが, Haskell では少なくともそう.
375デフォルトの名無しさん
2026/08/21(金) 12:58:18.07ID:r0Io5phJ >>371
モナドですけど何か?
モナドですけど何か?
376デフォルトの名無しさん
2026/08/21(金) 13:15:32.17ID:iTOGPWmY >論破されても同じ主張を根拠無く延々と繰り返す
>それが複おじ!!
汚コードを披露したがるところといい精神構造が一緒だよね
二代目複おじと呼ばれるのも納得
>それが複おじ!!
汚コードを披露したがるところといい精神構造が一緒だよね
二代目複おじと呼ばれるのも納得
377デフォルトの名無しさん
2026/08/21(金) 14:34:41.44ID:Ox2yfRDK flatMapすら使ってない方は論外として
こんな日常使うものを使っているだけでモナドと呼ぶかどうかという話だろ
flatMap: Stream<A> -> (A -> Stream<B>) -> Stream<B>
こんな日常使うものを使っているだけでモナドと呼ぶかどうかという話だろ
flatMap: Stream<A> -> (A -> Stream<B>) -> Stream<B>
378デフォルトの名無しさん
2026/08/21(金) 14:59:07.32ID:Eo21n+pB379デフォルトの名無しさん
2026/08/21(金) 15:01:40.43ID:KDkdbSVN リストってモナディックだぜっ!!
380デフォルトの名無しさん
2026/08/21(金) 15:15:54.95ID:beX5364R use Data::Monad::Identity;
sub rule {
my ($m, $str) = @_;
sub { my ($n, $s) = @{$_[0]}; Data::Monad::Identity->unit([$n, $n % $m ? $s : $s . $str]) };
}
for (1 .. 20) {
print Data::Monad::Identity->unit([$_, ""])
->flat_map(rule(3, "Fizz"))
->flat_map(rule(5, "Buzz"))
->value->[1] || $_, "\n";
}
sub rule {
my ($m, $str) = @_;
sub { my ($n, $s) = @{$_[0]}; Data::Monad::Identity->unit([$n, $n % $m ? $s : $s . $str]) };
}
for (1 .. 20) {
print Data::Monad::Identity->unit([$_, ""])
->flat_map(rule(3, "Fizz"))
->flat_map(rule(5, "Buzz"))
->value->[1] || $_, "\n";
}
381デフォルトの名無しさん
2026/08/21(金) 15:33:07.11ID:Gi1J9j3d >>377
モナド則満たすしモナドでしょ
https://paiza.io/projects/vlUBccWkc0ctYRvsyFJJnw
モナド則もそりゃそうなるでしょってものだしモナドはそういうものってことでいんじゃないかな
モナド則満たすしモナドでしょ
https://paiza.io/projects/vlUBccWkc0ctYRvsyFJJnw
モナド則もそりゃそうなるでしょってものだしモナドはそういうものってことでいんじゃないかな
382デフォルトの名無しさん
2026/08/21(金) 15:35:38.76ID:Gi1J9j3d >>374
わかりみが深い、むかしflatMapを自作しててわけわからんとなった経験がある、そういうことだったのね
わかりみが深い、むかしflatMapを自作しててわけわからんとなった経験がある、そういうことだったのね
383デフォルトの名無しさん
2026/08/21(金) 15:44:14.76ID:HqsLRPon もっと単純なMaybeやOptionもモナドだぞ
384デフォルトの名無しさん
2026/08/21(金) 16:13:20.18ID:beX5364R Finding the Reader Monad in FizzBuzz - Chat - PureScript Language Forum
ttps://discourse.purescript.org/t/finding-the-reader-monad-in-fizzbuzz/2460
Jul '21
FizzBuzz using Monad · GitHub
ttps://gist.github.com/maciejjaskowski/7f1734b33d5716c602db
(Scala)
ttps://discourse.purescript.org/t/finding-the-reader-monad-in-fizzbuzz/2460
Jul '21
FizzBuzz using Monad · GitHub
ttps://gist.github.com/maciejjaskowski/7f1734b33d5716c602db
(Scala)
385デフォルトの名無しさん
2026/08/21(金) 16:20:56.65ID:JOjsNGZv 結論
FizzBuzzでモナドを使うメリットはない
FizzBuzzでモナドを使うメリットはない
386デフォルトの名無しさん
2026/08/21(金) 16:32:46.73ID:+7OJU/se 適当なお題としてはGraphQLの応答とか
387デフォルトの名無しさん
2026/08/21(金) 16:54:22.13ID:beX5364R >>385
どういうものにメリットがあると思う?
どういうものにメリットがあると思う?
388デフォルトの名無しさん
2026/08/21(金) 16:57:15.65ID:oEi9UUz1 純粋関数縛りなHaskellで、モナド則を満たすデータ構造で副作用を表したのが肝であって
縛りのない言語でモナドを強調しても意味ない、ただ関数型チックな書き方がしたいだけの人
縛りのない言語でモナドを強調しても意味ない、ただ関数型チックな書き方がしたいだけの人
389デフォルトの名無しさん
2026/08/21(金) 17:15:28.71ID:beX5364R ま確かに興味本位だなw
390デフォルトの名無しさん
2026/08/21(金) 17:18:42.94ID:MKiwKoi2 普通の言語ならモナドに縛られずに書いた方が書きやすく見やすい
flatmapなどもモナドの観点なく使えばよい
flatmapなどもモナドの観点なく使えばよい
391デフォルトの名無しさん
2026/08/21(金) 17:34:36.23ID:r0Io5phJ https://paiza.io/projects/OHbT6kBvhYGdSm036ZGHCg
モナドプログラミングではなくMonadicプログラミング。
純粋ではないがMonadとみなせるものを扱う。
モナドプログラミングではなくMonadicプログラミング。
純粋ではないがMonadとみなせるものを扱う。
392デフォルトの名無しさん
2026/08/21(金) 17:36:15.66ID:beX5364R 普通の言語でモナドにこだわらずにflatmapを使うメリットって逆に分からん
階層リストの一層平坦化変形にメリットがあるとかかい?
階層リストの一層平坦化変形にメリットがあるとかかい?
393デフォルトの名無しさん
2026/08/21(金) 17:41:42.40ID:beX5364R >>391
もしかして、正直者だけにMainの他にも見えるのかな?
もしかして、正直者だけにMainの他にも見えるのかな?
394デフォルトの名無しさん
2026/08/21(金) 17:43:25.67ID:r0Io5phJ generator().map(fb -> fb.toText()).forEach(System.out::println);
3つの部分をドットでつないで、1行で書くことができる。
generator()はStreamを発生させ、class FizzBuzz限定下でStream.ofはreturnに相当する。
flatMapはstreamに定義されておりbindに相当する。そのため、ドットでつなぐことができる。
mapはflatMapで定義されるが、この場合、flat化が不要なのでflatMapの限定版として使用する。
限定下で、モナド則を満たしている。
もちろん、class FizzBuzzはオブジェクト指向で操作されている。
ここまでが圏論的オブジェクト指向だが、
Stream<FizzBuzz>からStream<String>に変換されていて、
StringはFizzBuzzの性質を「受け継いでいる」。
この部分は場のオブジェクト指向に相当する。
3つの部分をドットでつないで、1行で書くことができる。
generator()はStreamを発生させ、class FizzBuzz限定下でStream.ofはreturnに相当する。
flatMapはstreamに定義されておりbindに相当する。そのため、ドットでつなぐことができる。
mapはflatMapで定義されるが、この場合、flat化が不要なのでflatMapの限定版として使用する。
限定下で、モナド則を満たしている。
もちろん、class FizzBuzzはオブジェクト指向で操作されている。
ここまでが圏論的オブジェクト指向だが、
Stream<FizzBuzz>からStream<String>に変換されていて、
StringはFizzBuzzの性質を「受け継いでいる」。
この部分は場のオブジェクト指向に相当する。
395デフォルトの名無しさん
2026/08/21(金) 17:44:00.83ID:8LreK5vZ >>392
flatmapは各種データを扱う時にいつも使う
どんな分野のデータにも同じ構造が出てくるけど
説明しやすい例だと
アーティストは複数のアルバムを出している
アルバムには複数の曲が入っている
アーティストが出している曲全てを得るにはflatmap
flatmapは各種データを扱う時にいつも使う
どんな分野のデータにも同じ構造が出てくるけど
説明しやすい例だと
アーティストは複数のアルバムを出している
アルバムには複数の曲が入っている
アーティストが出している曲全てを得るにはflatmap
396デフォルトの名無しさん
2026/08/21(金) 17:45:01.94ID:r0Io5phJ >>393
うむ、正直者にだけ見えます。
うむ、正直者にだけ見えます。
397デフォルトの名無しさん
2026/08/21(金) 17:47:27.65ID:beX5364R398デフォルトの名無しさん
2026/08/21(金) 17:49:01.43ID:fMkK+Qnb >>394
場のオブジェクト指向なんて用語は存在しない
場のオブジェクト指向なんて用語は存在しない
399デフォルトの名無しさん
2026/08/21(金) 17:51:30.66ID:fMkK+Qnb400デフォルトの名無しさん
2026/08/21(金) 17:53:42.88ID:beX5364R 遅延リストの登場が必要なシーンて実践では意外と少ないんだよね。
使ってもいいんだろうけどもね。
データ構造は既にメモリ上にDOMみたいに展開されている場合が殆どだし
使ってもいいんだろうけどもね。
データ構造は既にメモリ上にDOMみたいに展開されている場合が殆どだし
401デフォルトの名無しさん
2026/08/21(金) 17:54:27.71ID:r0Io5phJ 詳細は語らないが、Stream<String>が、class FizzBuzzの性質を受け継いでいることに気づいた。
これは本家 場の量子論や量子アルゴリズムに応用できるだろう。
(量子コンピューティングにおける)位相kickbackの正しい姿が見えた感じ。
くだらないことをやっていたら、かなりのお宝を発見した、と思う。
これは本家 場の量子論や量子アルゴリズムに応用できるだろう。
(量子コンピューティングにおける)位相kickbackの正しい姿が見えた感じ。
くだらないことをやっていたら、かなりのお宝を発見した、と思う。
402デフォルトの名無しさん
2026/08/21(金) 17:57:46.76ID:r0Io5phJ >>398
そりゃそうだ、お盆前におれが作ったやつだから。
そりゃそうだ、お盆前におれが作ったやつだから。
403デフォルトの名無しさん
2026/08/21(金) 17:58:49.03ID:beX5364R もうご先祖様は帰ったぞ
404デフォルトの名無しさん
2026/08/21(金) 17:59:49.88ID:2k7SrpH+ >>394
Stream関手がListやMaybe/Optionなどと同じくモナド則を満たすのは良い
ただしFizzBuzz -> Stringの射を作れる段階で関手によるリフト(fmap)で
Stream<FizzBuzz> -> Stream<String>が得られるので
モナド則によるbind( >>= )はあえては必要ない
Stream関手がListやMaybe/Optionなどと同じくモナド則を満たすのは良い
ただしFizzBuzz -> Stringの射を作れる段階で関手によるリフト(fmap)で
Stream<FizzBuzz> -> Stream<String>が得られるので
モナド則によるbind( >>= )はあえては必要ない
405デフォルトの名無しさん
2026/08/21(金) 18:01:09.54ID:I1Nsd4kh >>400
すでにメモリ上にあっても一覧にはなっていないでしょ
あなたの言うように階層構造になっているんてしょ
それならflatmapなどを使えばそのまま一覧を得られるでしょ
あなたはflatmapを使わずにどうコードを書いてるの?
すでにメモリ上にあっても一覧にはなっていないでしょ
あなたの言うように階層構造になっているんてしょ
それならflatmapなどを使えばそのまま一覧を得られるでしょ
あなたはflatmapを使わずにどうコードを書いてるの?
406デフォルトの名無しさん
2026/08/21(金) 18:12:47.06ID:beX5364R >>405
深い方向に成長した階層構造ならループとアクセス演算子になっちゃうな
深い方向に成長した階層構造ならループとアクセス演算子になっちゃうな
407デフォルトの名無しさん
2026/08/21(金) 18:14:27.74ID:ulIeP98F なんかオブジェクト指向と関係なくね?
408デフォルトの名無しさん
2026/08/21(金) 18:18:43.06ID:r0Io5phJ >>404
ジェネリックをどう扱うかによって変わると思う。
ドットでつなぐというのはbindに相当する。
ともかく、純粋ではないので、「みなし」によってMonadとして扱い、
Monadの利便性を使う。圏論における自然変換っては(数学的な)「みなし」の一種なのかも。
ジェネリックをどう扱うかによって変わると思う。
ドットでつなぐというのはbindに相当する。
ともかく、純粋ではないので、「みなし」によってMonadとして扱い、
Monadの利便性を使う。圏論における自然変換っては(数学的な)「みなし」の一種なのかも。
409デフォルトの名無しさん
2026/08/21(金) 18:20:48.47ID:sroAx62X410デフォルトの名無しさん
2026/08/21(金) 18:25:11.45ID:r0Io5phJ >>407
Monadという対象(概念も含む)を扱っているのでオブジェクト指向でよいと思う。
とはいえ、おれの興味は量子コンピューティングへの応用(位相kickback)に移ってしまった。
わざわざ定数をclass FizzBuzzに押し込めたのは、それを場とみなすためだった。
Monadという対象(概念も含む)を扱っているのでオブジェクト指向でよいと思う。
とはいえ、おれの興味は量子コンピューティングへの応用(位相kickback)に移ってしまった。
わざわざ定数をclass FizzBuzzに押し込めたのは、それを場とみなすためだった。
411デフォルトの名無しさん
2026/08/21(金) 18:38:48.61ID:ulIeP98F 局所的な実装方法をウダウダやってるのがオブジェクト指向?
412デフォルトの名無しさん
2026/08/21(金) 18:48:20.85ID:8pVoXpeO 動くコード書けないやつがウダウダ長文連レス書くクソスレがこちらです
413デフォルトの名無しさん
2026/08/21(金) 18:58:30.38ID:C/iR3xUF まともなプログラミングをすると自然にオブジェクト指向になる
普通に関連データを構造体にまとめるとオブジェクト指向の第一歩
その構造体を用いる関数をそこに集めればオブジェクト指向の完成
言語によっては構造体に関連関数を紐付ける機能がある
構造体をクラスと呼ぶ言語もある
普通に関連データを構造体にまとめるとオブジェクト指向の第一歩
その構造体を用いる関数をそこに集めればオブジェクト指向の完成
言語によっては構造体に関連関数を紐付ける機能がある
構造体をクラスと呼ぶ言語もある
414デフォルトの名無しさん
2026/08/21(金) 19:10:15.58ID:+7OJU/se 良し悪しの話ではないけど
クラス指向だと限界があるからOOP言語にはほぼAOP/DIな魔法がついてくる
クラス指向だと限界があるからOOP言語にはほぼAOP/DIな魔法がついてくる
415デフォルトの名無しさん
2026/08/21(金) 19:29:01.99ID:YiF5GLcE そこは結局interfaceやtraitを使え!という結論になるよな
416デフォルトの名無しさん
2026/08/21(金) 20:29:52.42ID:p4A6Ej6J そもそもなんでこんなに沢山プログラム言語があるんだ
何個かでいいだろ
何個かでいいだろ
417デフォルトの名無しさん
2026/08/21(金) 20:37:11.24ID:tuPqJn8K418デフォルトの名無しさん
2026/08/21(金) 20:42:54.89ID:tuPqJn8K ところがC言語とほぼ同じ速さで動くRustが登場
これまでより高い安全性を満たしつつ機能も洗練されている
ただし習得に少しかかる問題があった
ところがAIにより学習問題は解決
コンパイルが通るだけで様々な安全性を満たしてくれるため
コード生成させる時もAIと相性が抜群に良い
これまでより高い安全性を満たしつつ機能も洗練されている
ただし習得に少しかかる問題があった
ところがAIにより学習問題は解決
コンパイルが通るだけで様々な安全性を満たしてくれるため
コード生成させる時もAIと相性が抜群に良い
419デフォルトの名無しさん
2026/08/21(金) 21:00:17.29ID:Gi1J9j3d でもコンパイルが遅くてプログラムの規模が大きくなると
コンパイルが終わらないんだろ、大変だな
コンパイルが終わらないんだろ、大変だな
420デフォルトの名無しさん
2026/08/21(金) 21:05:03.75ID:lo3FELaH >>414
クラス指向なんて言葉ないだろ
クラス指向なんて言葉ないだろ
421デフォルトの名無しさん
2026/08/21(金) 21:21:14.34ID:+7OJU/se422デフォルトの名無しさん
2026/08/21(金) 21:50:54.93ID:Gi1J9j3d モデリングすることが良いことだというバイアスが
オブジェクト指向の印象を良くないものにしているような気がする
シンプルな処理をシンプルに書くのが大事だ
Enterprise Hello Worldを見てそう思った
https://github.com/Wolfdp/Hello-World-Enterprise-Edition-CSharp
オブジェクト指向の印象を良くないものにしているような気がする
シンプルな処理をシンプルに書くのが大事だ
Enterprise Hello Worldを見てそう思った
https://github.com/Wolfdp/Hello-World-Enterprise-Edition-CSharp
423デフォルトの名無しさん
2026/08/21(金) 22:22:12.13ID:Ld+jRNtV HelloWorldをのコードを見て結論を出してる人がいてワロタ
424デフォルトの名無しさん
2026/08/21(金) 22:47:45.44ID:Gi1J9j3d それなwww
425デフォルトの名無しさん
2026/08/21(金) 23:04:12.29ID:kH6z448d 思ったんだけどさ
AIで全部書ける
AIで完全に書ける
のであればわざわメモリ安全の言語じゃなきてもよくない
完全に書けるのならAIが配列や動的に確保してくれた位置を考えてそれ以上にループとかが進まないように制限してくれるよね
後で自分で追記する時メモリ安全じゃないよ言うのだったら「AIで全てが書ける」わけではないと言うことになるし
AIで全部書ける
AIで完全に書ける
のであればわざわメモリ安全の言語じゃなきてもよくない
完全に書けるのならAIが配列や動的に確保してくれた位置を考えてそれ以上にループとかが進まないように制限してくれるよね
後で自分で追記する時メモリ安全じゃないよ言うのだったら「AIで全てが書ける」わけではないと言うことになるし
426デフォルトの名無しさん
2026/08/21(金) 23:17:11.89ID:vPcZCoYZ >>425
これまで長い年月をかけて書かれたコードのメモリ安全性を証明する試みがいくつも行われてきた
しかしいずれも完成しておらず与えられたコードが安全かどうか確実に判定できない現実がある
これはAIが出力したコードが安全かどうか100%の判定ができないことを意味する
これまで長い年月をかけて書かれたコードのメモリ安全性を証明する試みがいくつも行われてきた
しかしいずれも完成しておらず与えられたコードが安全かどうか確実に判定できない現実がある
これはAIが出力したコードが安全かどうか100%の判定ができないことを意味する
427デフォルトの名無しさん
2026/08/21(金) 23:20:29.95ID:Gi1J9j3d > AIで完全に書ける
Rustじゃないと確認できなくね?
Rustじゃないと確認できなくね?
428デフォルトの名無しさん
2026/08/21(金) 23:22:58.22ID:1+5SHfXi プログラミング言語の中でRustだけがメモリ安全性からデータ競合安全性までRustの言語仕様により100%保証できるよ
つまりコンパイルが通れば100%保証される
AIはコンパイルエラーを見ながらコンパイルが通るまで頑張るだけで100%保証されるからAIとRustは相性が最高に良いんだよ
つまりコンパイルが通れば100%保証される
AIはコンパイルエラーを見ながらコンパイルが通るまで頑張るだけで100%保証されるからAIとRustは相性が最高に良いんだよ
429デフォルトの名無しさん
2026/08/21(金) 23:25:20.18ID:Gi1J9j3d JavaScriptラインタイムのBunはAIで作られていて
プログラム言語をZigからRustに変えた
Zigだとメモリ管理のバグが頻発して開発コストが高かったからだ
いまのAIでは無理だな、Rustへのトランスパイラを定理証明器で作るとか
そういう方向が現実的なんじゃねえかな
プログラム言語をZigからRustに変えた
Zigだとメモリ管理のバグが頻発して開発コストが高かったからだ
いまのAIでは無理だな、Rustへのトランスパイラを定理証明器で作るとか
そういう方向が現実的なんじゃねえかな
430デフォルトの名無しさん
2026/08/21(金) 23:29:28.16ID:kGpPvADd コンパイルパスさせるために
端折ったりバグ埋め込んだり平気でやりそう
端折ったりバグ埋め込んだり平気でやりそう
431デフォルトの名無しさん
2026/08/21(金) 23:35:21.17ID:Gi1J9j3d たしかに、人間だとそういうのあまり心配しなくて良いけど
それは人間の性格によるところがあるように思う
AIにも人格を芽生えさせてある程度の時間言動を追跡して
信頼できる人格か判定しないといけないのかのー
それは人間の性格によるところがあるように思う
AIにも人格を芽生えさせてある程度の時間言動を追跡して
信頼できる人格か判定しないといけないのかのー
432デフォルトの名無しさん
2026/08/21(金) 23:37:21.28ID:bIYKcSt2 >>430
それはコンパイル関係なく
人間の指示にわずかな漏れがあればAIは何でもやる
だから穴を検知するためAIにテストを生成させる
テスト生成に漏れがないかだけに専念させるAIに漏れをチェックさせる
その生成されたテストをコンパイル頑張るAIに与えてテストも同時に通させる
それはコンパイル関係なく
人間の指示にわずかな漏れがあればAIは何でもやる
だから穴を検知するためAIにテストを生成させる
テスト生成に漏れがないかだけに専念させるAIに漏れをチェックさせる
その生成されたテストをコンパイル頑張るAIに与えてテストも同時に通させる
433デフォルトの名無しさん
2026/08/21(金) 23:52:29.29ID:YfDi7NQj434デフォルトの名無しさん
2026/08/22(土) 00:15:51.49ID:zJHTHuDu435デフォルトの名無しさん
2026/08/22(土) 06:26:02.05ID:k3gSlcbb AIはマシン語で書けばいいんだよ
チェックするときはそれを逆コンパイルして好きな言語で読めばいいのさ
チェックするときはそれを逆コンパイルして好きな言語で読めばいいのさ
436デフォルトの名無しさん
2026/08/22(土) 06:30:48.14ID:o8Yeunra C++はそのうちメモリ安全性も取り込むと思うけど
437デフォルトの名無しさん
2026/08/22(土) 06:43:46.82ID:bgDHCveK >>436
それC++11から15年間頑張って来たけど無理だった
それC++11から15年間頑張って来たけど無理だった
438デフォルトの名無しさん
2026/08/22(土) 07:51:36.35ID:5sbOUOoc >>382
flatMap自作できるの?
flatMap自作できるの?
439デフォルトの名無しさん
2026/08/22(土) 07:58:34.83ID:06Fuc+wc ソフトウエアとして実現されているものはすべからく自作可能である(ニーチェ)
ただし、それが面倒くさくて煩雑だったり、既にあるモノをわざわざ作る意義が乏しいことは多々ある(プラトン)
ただし、それが面倒くさくて煩雑だったり、既にあるモノをわざわざ作る意義が乏しいことは多々ある(プラトン)
440デフォルトの名無しさん
2026/08/22(土) 09:31:26.30ID:06Fuc+wc そしてオブジェクト指向を迂闊に導入すると
ソフトウエアはぐちゃぐちゃになる
ここまで得られた知見ということで一旦結論
ソフトウエアはぐちゃぐちゃになる
ここまで得られた知見ということで一旦結論
441デフォルトの名無しさん
2026/08/22(土) 09:35:48.28ID:qikEO/T7 処理単位を明確に分割するのがオブジェクト指向のメリットでもあるんだけど
どうやったらオブジェクト指向でプログラムがぐちゃぐちゃになるってんだか
それは単にクラス分けとか失敗してるだけだろうね
どうやったらオブジェクト指向でプログラムがぐちゃぐちゃになるってんだか
それは単にクラス分けとか失敗してるだけだろうね
442デフォルトの名無しさん
2026/08/22(土) 09:38:45.72ID:06Fuc+wc そういう局所の書き方話ではなくてソフトウエアシステム全体に影響を及ぼす話
というか「処理単位を明確に分割する」って何だよw
そういうおためごかしがどのくらい混乱を招いて来たか反省する脳は
たぶん君にはなさそうだな
というか「処理単位を明確に分割する」って何だよw
そういうおためごかしがどのくらい混乱を招いて来たか反省する脳は
たぶん君にはなさそうだな
443デフォルトの名無しさん
2026/08/22(土) 09:39:43.51ID:06Fuc+wc さー、オブジェクト指向厨にけんかを売りましたw
444デフォルトの名無しさん
2026/08/22(土) 09:42:15.91ID:06Fuc+wc オブジェクト指向って何でこんなカルト迷信みたいに広まったんだろうね
ほんと、人によるの物事の受け止め方や、それによって脳に生じたノイズって面白い
いや詰まらない
ほんと、人によるの物事の受け止め方や、それによって脳に生じたノイズって面白い
いや詰まらない
445デフォルトの名無しさん
2026/08/22(土) 09:42:24.26ID:W68OZL8L 関数の切り分け方に比べるとメンバーやオブジェクトをどう設定するかは人によって相当分かれる。
その事実を明らかに無視したバカがオブジェクト厨になる
その事実を明らかに無視したバカがオブジェクト厨になる
446デフォルトの名無しさん
2026/08/22(土) 09:47:50.99ID:06Fuc+wc オブジェクト指向厨って結構、感覚的で
その方が直感的にわかりやすいと思ったからとか
平然と言ってくちゃくちゃしたコード書いて悦に入ったり不況活動した理り人を批判する
人畜無害じゃないんだよね。有害
オブジェクト指向が流行ったココ30年くらい、それは日本で丸投げ中抜き派遣作業が発展した時期と奇遇にも一致するんだけれど
この時代は、コンピューターサイエンス、ソフトウエア工学の暗黒時代だったと思っている
その方が直感的にわかりやすいと思ったからとか
平然と言ってくちゃくちゃしたコード書いて悦に入ったり不況活動した理り人を批判する
人畜無害じゃないんだよね。有害
オブジェクト指向が流行ったココ30年くらい、それは日本で丸投げ中抜き派遣作業が発展した時期と奇遇にも一致するんだけれど
この時代は、コンピューターサイエンス、ソフトウエア工学の暗黒時代だったと思っている
447デフォルトの名無しさん
2026/08/22(土) 09:48:10.63ID:qikEO/T7 まあ、例外処理があると一気に調和が崩れていくのはあるあるだけどな
たいていの場プロジェクトが進んだ後半に発覚しやすくて
もうトンネル掘るしかなかっりするw
たいていの場プロジェクトが進んだ後半に発覚しやすくて
もうトンネル掘るしかなかっりするw
448デフォルトの名無しさん
2026/08/22(土) 09:50:14.47ID:06Fuc+wc きっとこんな人でも家ではいいお父さん役をやっているのかもしれないと思うと
やるせない
やるせない
449デフォルトの名無しさん
2026/08/22(土) 09:50:18.36ID:qikEO/T7 結局ここの住人は、大規模プロジェクトに対してどんなアプローチが適切だと言いたいんだろ?
オブジェクト指向に代わる何かを提唱したりもしないでさw
オブジェクト指向に代わる何かを提唱したりもしないでさw
451デフォルトの名無しさん
2026/08/22(土) 09:55:20.61ID:06Fuc+wc >>448
オワコンかどうかがまずテーマであってだな、代替え案の有無が正当化の理由には全くならない
屁理屈にもならない
それにモジュラリティ―の確保であれば、各言語それこそ様々な手段が既存で
そういうことを論じるスレなのか?ここは。違うよな
それすら自分が分かっていないんだったらそう言うのが、人としてだだしい姿勢だろ
オワコンかどうかがまずテーマであってだな、代替え案の有無が正当化の理由には全くならない
屁理屈にもならない
それにモジュラリティ―の確保であれば、各言語それこそ様々な手段が既存で
そういうことを論じるスレなのか?ここは。違うよな
それすら自分が分かっていないんだったらそう言うのが、人としてだだしい姿勢だろ
452デフォルトの名無しさん
2026/08/22(土) 09:58:32.16ID:06Fuc+wc453デフォルトの名無しさん
2026/08/22(土) 10:00:07.35ID:06Fuc+wc 小僧相手についムキになっちまったわ
風説に惑わされずせいぜい精進しなされ
風説に惑わされずせいぜい精進しなされ
454デフォルトの名無しさん
2026/08/22(土) 10:00:43.46ID:qikEO/T7 何かを作る時、機能別に分けて作るのは
プログラムに限らず物作りの基本ではある
車しかり、テレビ然り、家然りだ
プログラムに限らず物作りの基本ではある
車しかり、テレビ然り、家然りだ
455デフォルトの名無しさん
2026/08/22(土) 10:02:42.42ID:06Fuc+wc456デフォルトの名無しさん
2026/08/22(土) 10:11:18.42ID:qikEO/T7 瑣末な実装をああだこうだやってるうちは何も分かって無いって事だよ
いちメソッドの実装方法なんて
そんなものは仕様通り動けばどうでもいいんだよ
そんな重箱の隅をつつき合ってオブジェクト指向を語るなんて100年早いわw
いちメソッドの実装方法なんて
そんなものは仕様通り動けばどうでもいいんだよ
そんな重箱の隅をつつき合ってオブジェクト指向を語るなんて100年早いわw
457デフォルトの名無しさん
2026/08/22(土) 10:15:10.61ID:06Fuc+wc 分かっているなら…(ry
言わせるなよな
言わせるなよな
458デフォルトの名無しさん
2026/08/22(土) 10:17:07.35ID:06Fuc+wc >>456
こんなにブーメランを自分にザクザク刺す奴って始めて見たかも…
こんなにブーメランを自分にザクザク刺す奴って始めて見たかも…
459デフォルトの名無しさん
2026/08/22(土) 10:22:49.69ID:qikEO/T7 数十人、数百人規模のプロジェクトの全体設計に導入するから意味があるもので
一人で完結するする様な規模のソフトウェアのいちメソッドに何日も掛けて導入するものじゃ無いからなぁ
一人で完結するする様な規模のソフトウェアのいちメソッドに何日も掛けて導入するものじゃ無いからなぁ
460デフォルトの名無しさん
2026/08/22(土) 10:25:36.17ID:06Fuc+wc461デフォルトの名無しさん
2026/08/22(土) 10:28:07.07ID:qikEO/T7 おまえが分かって無いだけw
462デフォルトの名無しさん
2026/08/22(土) 10:29:42.66ID:06Fuc+wc 最後は感情論なんだよなオブジェクト指向厨
結構若輩だったりする
結構若輩だったりする
463デフォルトの名無しさん
2026/08/22(土) 10:31:59.99ID:SeTr1MjI464デフォルトの名無しさん
2026/08/22(土) 10:32:19.60ID:qikEO/T7 今ではオブジェクト指向なんてイチイチお題目建てて設計なんかしなくてもだいたいオブジェクト指向の考え方で設計するからなぁ
465デフォルトの名無しさん
2026/08/22(土) 10:34:49.79ID:06Fuc+wc 代替え案は各種モジュラリティ―いっぱいあるけど
代替え案の有無は全然重要じゃないよ
考えてもみろよ、代替え案がない問題はこの世に一杯あるが
問題じゃない、無いことにするしかないと言いたいのか?
そしたらこの世の問題のかなりが無問題ということになるぞ
>>463
おまえも頭ヨワイな
代替え案の有無は全然重要じゃないよ
考えてもみろよ、代替え案がない問題はこの世に一杯あるが
問題じゃない、無いことにするしかないと言いたいのか?
そしたらこの世の問題のかなりが無問題ということになるぞ
>>463
おまえも頭ヨワイな
466デフォルトの名無しさん
2026/08/22(土) 10:35:09.86ID:06Fuc+wc >>464
しねぇよインチキ言うなw
しねぇよインチキ言うなw
467デフォルトの名無しさん
2026/08/22(土) 10:39:05.58ID:qikEO/T7468デフォルトの名無しさん
2026/08/22(土) 10:40:07.43ID:06Fuc+wc469デフォルトの名無しさん
2026/08/22(土) 10:41:41.40ID:qikEO/T7 もしかして、ここのスレ主って、オブジェクト指向はオブジェクト指向言語の事だと思ってないかな?
470デフォルトの名無しさん
2026/08/22(土) 10:42:44.88ID:06Fuc+wc >>468
絵に ー>上に な
絵に ー>上に な
471デフォルトの名無しさん
2026/08/22(土) 10:43:32.43ID:06Fuc+wc472デフォルトの名無しさん
2026/08/22(土) 10:45:24.15ID:06Fuc+wc473デフォルトの名無しさん
2026/08/22(土) 10:47:03.78ID:SeTr1MjI474デフォルトの名無しさん
2026/08/22(土) 10:47:15.32ID:06Fuc+wc 「記述」できまいw ニヤニヤ
475デフォルトの名無しさん
2026/08/22(土) 10:50:20.53ID:06Fuc+wc >>473 にとって上下水道と同じように当たり前のものになったオブジェクト指向
オブジェクト指向はオワコン?
https://mevius.5ch.io/test/read.cgi/tech/1721393540/753
オブジェクト指向はオワコン?
https://mevius.5ch.io/test/read.cgi/tech/1721393540/753
476デフォルトの名無しさん
2026/08/22(土) 10:52:30.90ID:SeTr1MjI >>465
めっちゃ詭弁だね
代替案がない問題があるとして
その問題に対する既存の解決策はオワコンなのか?
オブジェクト指向がオワコンかどうかを判断する基準として
君は何が重要だと考えてるのかすら提示できないのなら
ただ議論から尻尾巻いて逃げてるだけだよ
めっちゃ詭弁だね
代替案がない問題があるとして
その問題に対する既存の解決策はオワコンなのか?
オブジェクト指向がオワコンかどうかを判断する基準として
君は何が重要だと考えてるのかすら提示できないのなら
ただ議論から尻尾巻いて逃げてるだけだよ
477デフォルトの名無しさん
2026/08/22(土) 10:57:05.02ID:06Fuc+wc >>476
代替案のない問題だとしてもオワコン化は決定できないだろ
誰がそんなこと書いた。ミスリーディングのいい加減にしろ
代替案がないからといって問題では無いということが、問題を正当化する根拠にはならんと書いているのだよ
もう少し理にかなった物の考え方してくれないといくら5chでも
話あいてしててげんなりするぞ
代替案のない問題だとしてもオワコン化は決定できないだろ
誰がそんなこと書いた。ミスリーディングのいい加減にしろ
代替案がないからといって問題では無いということが、問題を正当化する根拠にはならんと書いているのだよ
もう少し理にかなった物の考え方してくれないといくら5chでも
話あいてしててげんなりするぞ
478デフォルトの名無しさん
2026/08/22(土) 11:00:08.79ID:06Fuc+wc モジュラリティ―の方法は様々にあるわけだし
オブジェクト指向に害があって最近はどう回避されるつあるか上で散々論じられている
それに対しオワコンでないというならその根拠を客観的にしめさないと
個人的このみの問題で終わるのは自明だ
オブジェクト指向に害があって最近はどう回避されるつあるか上で散々論じられている
それに対しオワコンでないというならその根拠を客観的にしめさないと
個人的このみの問題で終わるのは自明だ
479デフォルトの名無しさん
2026/08/22(土) 11:02:01.72ID:06Fuc+wc で、プログラミング言語でなくてもいいから
オブジェクト指向でFizzBuzzを「記述」してみてみ
FizzBuzzが分からないというならもっと簡単なものでもいい
オブジェクト指向でFizzBuzzを「記述」してみてみ
FizzBuzzが分からないというならもっと簡単なものでもいい
480デフォルトの名無しさん
2026/08/22(土) 11:03:52.44ID:06Fuc+wc 「記述」できまいw ニヤニヤ
それが根拠だよ
それが根拠だよ
481デフォルトの名無しさん
2026/08/22(土) 11:04:51.40ID:qikEO/T7 確かにカプセル化とか継承とか付随した概念は否定されつつあるが
機能別にまとめたり同じ概念で扱うって考えは新しい言語にも引き継がれてるからなぁ
機能別にまとめたり同じ概念で扱うって考えは新しい言語にも引き継がれてるからなぁ
482デフォルトの名無しさん
2026/08/22(土) 11:06:16.41ID:06Fuc+wc483デフォルトの名無しさん
2026/08/22(土) 11:08:09.39ID:qikEO/T7 >>479
そんな単一メソッドに収まるものをわざわざオブジェクト指向で書くって事自体がオブジェクト指向を分かって無いって言ってるんだがw
そんな単一メソッドに収まるものをわざわざオブジェクト指向で書くって事自体がオブジェクト指向を分かって無いって言ってるんだがw
484デフォルトの名無しさん
2026/08/22(土) 11:09:15.05ID:2u24m9Db OOPについてオワコンどうこう以前にOOPに厳密な定義を与えられた人間が人類史上いたか?
485デフォルトの名無しさん
2026/08/22(土) 11:09:53.57ID:06Fuc+wc 「記述」できまいw ニヤニヤ
まずClass作って、インスタンスメンバ変数作って、getter setter property アクセス修飾設定して
method 書いて、…くちゃくちゃ くちゃくちゃ
まずClass作って、インスタンスメンバ変数作って、getter setter property アクセス修飾設定して
method 書いて、…くちゃくちゃ くちゃくちゃ
486デフォルトの名無しさん
2026/08/22(土) 11:11:26.09ID:06Fuc+wc >>483
大規模だともっと作りにくいぞw
大規模だともっと作りにくいぞw
487デフォルトの名無しさん
2026/08/22(土) 11:12:17.55ID:06Fuc+wc なんで調べないかな>>484
488デフォルトの名無しさん
2026/08/22(土) 11:13:20.57ID:qikEO/T7489デフォルトの名無しさん
2026/08/22(土) 11:14:30.31ID:C0mupzSl コードはなくていいけど
どういう役割のオブジェクトを登場させるかくらい書けるやろ
どういう役割のオブジェクトを登場させるかくらい書けるやろ
490デフォルトの名無しさん
2026/08/22(土) 11:14:55.10ID:06Fuc+wc491デフォルトの名無しさん
2026/08/22(土) 11:16:13.14ID:06Fuc+wc >>489
分かったじゃあID:qikEO/T7がどういう役割のオブジェクトを登場させるかくらいについて書くのかを待つか
分かったじゃあID:qikEO/T7がどういう役割のオブジェクトを登場させるかくらいについて書くのかを待つか
492デフォルトの名無しさん
2026/08/22(土) 11:16:57.50ID:qikEO/T7 >>490
おまえはオブジェクト指向言語の話しかしてないからなぁw
おまえはオブジェクト指向言語の話しかしてないからなぁw
493デフォルトの名無しさん
2026/08/22(土) 11:17:59.05ID:06Fuc+wc でもかれはオブジェクト指向を表層的な感覚でしか受け止めていないようだから
書けないと思う ニヤニヤ
書けないと思う ニヤニヤ
494デフォルトの名無しさん
2026/08/22(土) 11:18:58.56ID:qikEO/T7 FizzBuzzなんて最小公倍数のループ組んで順番に出力するコード書いたら終わりだろ
495デフォルトの名無しさん
2026/08/22(土) 11:19:10.87ID:06Fuc+wc おれプログラミング言語の話した?>>492
496デフォルトの名無しさん
2026/08/22(土) 11:20:05.43ID:06Fuc+wc >>494
じゃあほかの題材でいいよw
じゃあほかの題材でいいよw
497デフォルトの名無しさん
2026/08/22(土) 11:21:05.68ID:06Fuc+wc つか、あやうくみおとしそうになったが最小公倍数かよw
498デフォルトの名無しさん
2026/08/22(土) 11:21:33.88ID:qikEO/T7 >>495
コード書いてる時点でもう言語の話になってるだろw
コード書いてる時点でもう言語の話になってるだろw
499デフォルトの名無しさん
2026/08/22(土) 11:22:51.40ID:06Fuc+wc500デフォルトの名無しさん
2026/08/22(土) 11:23:44.80ID:06Fuc+wc なんで最小公倍数よw
501デフォルトの名無しさん
2026/08/22(土) 11:24:25.96ID:MVi0Z0Uj502デフォルトの名無しさん
2026/08/22(土) 11:24:57.82ID:06Fuc+wc きょうもまた、つまらぬものを斬ってしまった…
503デフォルトの名無しさん
2026/08/22(土) 11:31:10.28ID:BHZjd0Jb 手続き型プログラムは、for i ループで
iを基本にして処理する
mod 3
mod 5 全部比較して結果を出す
オブジェクト指向なら for i ループ使っちゃだめだろ?
あくまでもオブジェクトであるFizz野郎とかBuzz野郎に丸投げして、必要なとこに出現しやがれ ってやんないと
全然ダメ、お前ら
iを基本にして処理する
mod 3
mod 5 全部比較して結果を出す
オブジェクト指向なら for i ループ使っちゃだめだろ?
あくまでもオブジェクトであるFizz野郎とかBuzz野郎に丸投げして、必要なとこに出現しやがれ ってやんないと
全然ダメ、お前ら
504デフォルトの名無しさん
2026/08/22(土) 11:37:53.48ID:qikEO/T7 inport math
n = 100
a, b = 3, 5
lcm = math.lcm(a, b)
pattern = []
for i in range(1, lcm):
s = ""
if i % a == 0:
s += "Fizz"
if i % b == 0:
s += "Buzz"
pattern.append(s if s elese str(i))
for i in range(1, n + 1):
print(pattern[(i - 1] % lcm])
n = 100
a, b = 3, 5
lcm = math.lcm(a, b)
pattern = []
for i in range(1, lcm):
s = ""
if i % a == 0:
s += "Fizz"
if i % b == 0:
s += "Buzz"
pattern.append(s if s elese str(i))
for i in range(1, n + 1):
print(pattern[(i - 1] % lcm])
505デフォルトの名無しさん
2026/08/22(土) 11:39:55.42ID:qikEO/T7 オブジェクト指向にしなくていい場所までオブジェクト指向にする意味がわからない
506デフォルトの名無しさん
2026/08/22(土) 11:40:59.88ID:qikEO/T7 FizzやBuzzはルールから導き出される結果であって、オブジェクトじゃ無いだろw
507デフォルトの名無しさん
2026/08/22(土) 11:41:33.22ID:06Fuc+wc >>505
じゃあ、どういう場所をオブジェクト指向にするの?
じゃあ、どういう場所をオブジェクト指向にするの?
508デフォルトの名無しさん
2026/08/22(土) 11:43:41.36ID:qikEO/T7 1から順に数えるのにループ書かないでとか訳分からない事言ってないでさ
w
w
509デフォルトの名無しさん
2026/08/22(土) 11:45:23.66ID:06Fuc+wc 「意味がわからない」という言い方を最近しばしば聞くが
「意味がわからない」≒「理解できない」≒「読解力が足りない」≒「頭が良くない」
という意味にも受け止められるので使わない用が良いと思う
実際にそうならば別に構わんが
「意味がわからない」≒「理解できない」≒「読解力が足りない」≒「頭が良くない」
という意味にも受け止められるので使わない用が良いと思う
実際にそうならば別に構わんが
510デフォルトの名無しさん
2026/08/22(土) 11:46:54.11ID:06Fuc+wc ループ書かないでって、どのレス?
511デフォルトの名無しさん
2026/08/22(土) 11:47:22.94ID:qikEO/T7 >>510
503
503
512デフォルトの名無しさん
2026/08/22(土) 11:48:49.45ID:qikEO/T7513デフォルトの名無しさん
2026/08/22(土) 11:49:36.92ID:06Fuc+wc514デフォルトの名無しさん
2026/08/22(土) 11:50:23.63ID:06Fuc+wc せっかくの土曜の朝っぱらから気分悪くさせてざまーみろw
515デフォルトの名無しさん
2026/08/22(土) 11:51:57.22ID:MVi0Z0Uj >>503
>>503
オブジェクト指向でforループ使っちゃダメって話は聞いたことがない、staticメソッドも使えるよ
ドメイン駆動設計でFizzBuzzをガチで設計してオブジェクト指向でプログラム書いてみせようか
FizzBuzzにはいろんな概念がある
・プレイヤー・手番・発話・間違い・ルール・数・変換
そのうちこれがないとプログラム書けないという必要最小限のものを抜き出す
・数と文字列の変換規則
これをFizzBuzz変換と呼ぶことにする
FizzBuzz変換
・数字が3で割れる→Fizz
・数字が5で割れる→Buzz
・数字が3でも割れるし5でも割れる→FizzBuzz
FizzBuzz変換がFizzBuzzの概念モデル
>>503
オブジェクト指向でforループ使っちゃダメって話は聞いたことがない、staticメソッドも使えるよ
ドメイン駆動設計でFizzBuzzをガチで設計してオブジェクト指向でプログラム書いてみせようか
FizzBuzzにはいろんな概念がある
・プレイヤー・手番・発話・間違い・ルール・数・変換
そのうちこれがないとプログラム書けないという必要最小限のものを抜き出す
・数と文字列の変換規則
これをFizzBuzz変換と呼ぶことにする
FizzBuzz変換
・数字が3で割れる→Fizz
・数字が5で割れる→Buzz
・数字が3でも割れるし5でも割れる→FizzBuzz
FizzBuzz変換がFizzBuzzの概念モデル
516デフォルトの名無しさん
2026/08/22(土) 11:52:07.76ID:C0mupzSl 唯一の正解があるわけではないし
>>503みたいにFizzさんBuzzさんに数字投げるか叩いたら適宜叫ぶってのはありよね
コンストラクタに数字と叫び声を渡すとしたら
Pop, Jazz, Rockさんもすんなり登場できる
>>503みたいにFizzさんBuzzさんに数字投げるか叩いたら適宜叫ぶってのはありよね
コンストラクタに数字と叫び声を渡すとしたら
Pop, Jazz, Rockさんもすんなり登場できる
517デフォルトの名無しさん
2026/08/22(土) 11:52:08.31ID:06Fuc+wc まあ ID:qikEO/T7 のいうオブジェクト指向なんて初歩的な蘊蓄・ノウハウレベルの
中身かっらぽなものなんだよ
もっと勉強して成長しなさい
中身かっらぽなものなんだよ
もっと勉強して成長しなさい
518デフォルトの名無しさん
2026/08/22(土) 11:52:29.94ID:MVi0Z0Uj >>503
これをプログラムコードに落とす
static String fizzBuzz(int n) {
var s = "";
s += n % 3 == 0 ? "Fizz" : "";
s += n % 5 == 0 ? "Buzz" : "";
if (s.isEmpty()) {
return "" + n;
} else {
return s;
}
}
これがFizzBuzzのドメインモデル
以上がドメイン駆動設計でFizzBuzzを設計してオブジェクト指向で実装するまで
ご清聴ありがとうございました
これをプログラムコードに落とす
static String fizzBuzz(int n) {
var s = "";
s += n % 3 == 0 ? "Fizz" : "";
s += n % 5 == 0 ? "Buzz" : "";
if (s.isEmpty()) {
return "" + n;
} else {
return s;
}
}
これがFizzBuzzのドメインモデル
以上がドメイン駆動設計でFizzBuzzを設計してオブジェクト指向で実装するまで
ご清聴ありがとうございました
519デフォルトの名無しさん
2026/08/22(土) 11:53:29.49ID:06Fuc+wc >>518
またお前かw
またお前かw
520デフォルトの名無しさん
2026/08/22(土) 11:54:50.22ID:MVi0Z0Uj >>519
あ、その節はどうも、お世話になってます
あ、その節はどうも、お世話になってます
521デフォルトの名無しさん
2026/08/22(土) 11:54:58.97ID:qikEO/T7 それだけじゃFizzBuzzにならんだろw
522デフォルトの名無しさん
2026/08/22(土) 11:56:46.35ID:06Fuc+wc さー突っ込みが入りました
おれは縦読みで見落としたか
おれは縦読みで見落としたか
523デフォルトの名無しさん
2026/08/22(土) 11:58:04.52ID:06Fuc+wc524デフォルトの名無しさん
2026/08/22(土) 12:00:01.05ID:qikEO/T7 import math
class FizzBuzzRule:
def __init__(self, divisor, word):
self.divisor = divisor
self.word = word
def apply(self, n):
return self.word if n % self.divisor == 0 else ""
def fizzbuzz_generic(n, rules):
lcm = 1
for r in rules:
lcm = math.lcm(lcm, r.divisor)
pattern = []
for i in range(1, lcm + 1):
s = "".join(r.apply(i) for r in rules)
pattern.append(s if s else str(i))
for i in range(1, n + 1):
print(pattern[(i - 1) % lcm])
rules = [
FizzBuzzRule(3, "Fizz"),
FizzBuzzRule(5, "Buzz"),
]
fizzbuzz_generic(100, rules)
class FizzBuzzRule:
def __init__(self, divisor, word):
self.divisor = divisor
self.word = word
def apply(self, n):
return self.word if n % self.divisor == 0 else ""
def fizzbuzz_generic(n, rules):
lcm = 1
for r in rules:
lcm = math.lcm(lcm, r.divisor)
pattern = []
for i in range(1, lcm + 1):
s = "".join(r.apply(i) for r in rules)
pattern.append(s if s else str(i))
for i in range(1, n + 1):
print(pattern[(i - 1) % lcm])
rules = [
FizzBuzzRule(3, "Fizz"),
FizzBuzzRule(5, "Buzz"),
]
fizzbuzz_generic(100, rules)
525デフォルトの名無しさん
2026/08/22(土) 12:06:01.34ID:06Fuc+wc >>524
ほう、Pythonを書けるんだ、少しだけ見直したぞ。
だが本当にそういう機能分割がいいのかな。小さいプログラムだから薬にも毒にもならないだろうが
結局オブジェクト指向の害の芽はこのコードにもすでに紛れ込んでいるような…
それはさておきPyhonのClass base オブジェクト指向の仕組みは何度見てもあか抜けないな。
ほう、Pythonを書けるんだ、少しだけ見直したぞ。
だが本当にそういう機能分割がいいのかな。小さいプログラムだから薬にも毒にもならないだろうが
結局オブジェクト指向の害の芽はこのコードにもすでに紛れ込んでいるような…
それはさておきPyhonのClass base オブジェクト指向の仕組みは何度見てもあか抜けないな。
526デフォルトの名無しさん
2026/08/22(土) 12:07:43.40ID:06Fuc+wc PyhonでClass baseオブジェクト指向ってあまりやらなくてもいい希ガス
527デフォルトの名無しさん
2026/08/22(土) 12:13:43.20ID:T7yt1axc528デフォルトの名無しさん
2026/08/22(土) 12:13:44.12ID:qikEO/T7 いや、Copilotに方針教えただけだw
529デフォルトの名無しさん
2026/08/22(土) 12:15:15.56ID:qikEO/T7 もうメソッド単位の中身なんてどうでもいいんだよって主張の意味がわかったかな?
530デフォルトの名無しさん
2026/08/22(土) 12:18:42.02ID:06Fuc+wc >>528
なんだよ。
ひで―設計だと思ったけどカワイソウだから言うのがまんしてたけど
これが彼の言う「機能別にまとめたり同じ概念で扱う」かと
それすら自分で書けなかったかw
このPythonコードの何がまずいかワカル?
なんだよ。
ひで―設計だと思ったけどカワイソウだから言うのがまんしてたけど
これが彼の言う「機能別にまとめたり同じ概念で扱う」かと
それすら自分で書けなかったかw
このPythonコードの何がまずいかワカル?
531デフォルトの名無しさん
2026/08/22(土) 12:19:44.28ID:06Fuc+wc >>529
何で急にそんな変な主張をいきなりし始めるんだw
何で急にそんな変な主張をいきなりし始めるんだw
532デフォルトの名無しさん
2026/08/22(土) 12:21:55.64ID:T7yt1axc >>450
>>320ではなくて、
https://paiza.io/projects/OHbT6kBvhYGdSm036ZGHCg
を参照してほしい。
generator部、と変換部と出力部にわけて、オブジェクト指向で、
UnitTestしやすく分割してある。
3つの部分をドットでバインドしている。
Streamにより速さは確保できないが、フロー型の次世代GPUを想定。
ワンクラスにすることで、チップ化も想定。
考え中の「場のオブジェクト指向」によって量子コンピュータでの実行も実験中。
すべてのメソッドが1行の「式」である、というところがミソ。
>>320ではなくて、
https://paiza.io/projects/OHbT6kBvhYGdSm036ZGHCg
を参照してほしい。
generator部、と変換部と出力部にわけて、オブジェクト指向で、
UnitTestしやすく分割してある。
3つの部分をドットでバインドしている。
Streamにより速さは確保できないが、フロー型の次世代GPUを想定。
ワンクラスにすることで、チップ化も想定。
考え中の「場のオブジェクト指向」によって量子コンピュータでの実行も実験中。
すべてのメソッドが1行の「式」である、というところがミソ。
533デフォルトの名無しさん
2026/08/22(土) 12:23:20.27ID:06Fuc+wc >>532
正直者ではないおれにはmainしか見えないんだが
正直者ではないおれにはmainしか見えないんだが
534デフォルトの名無しさん
2026/08/22(土) 12:23:54.55ID:06Fuc+wc >>533
すまんタブがあった
すまんタブがあった
535デフォルトの名無しさん
2026/08/22(土) 12:29:55.45ID:qikEO/T7 で、なんで実装方法を競うだけの例題にしたの?
だからオブジェクト指向言語の話にしかとれないんだってずっと言ってるし
そんな些末な話題はAIにやらせてもっと本質的な話しなよw
だからオブジェクト指向言語の話にしかとれないんだってずっと言ってるし
そんな些末な話題はAIにやらせてもっと本質的な話しなよw
536デフォルトの名無しさん
2026/08/22(土) 12:32:39.25ID:06Fuc+wc537デフォルトの名無しさん
2026/08/22(土) 12:35:51.21ID:qikEO/T7 ルール拡張も出来るし何が不満なのさw
同じルール概念をまとめてるじゃんw
同じルール概念をまとめてるじゃんw
538デフォルトの名無しさん
2026/08/22(土) 12:36:59.34ID:qikEO/T7 こんな事に時間を割いても無駄だよw
まあ、暇だから付き合ってやるけどね
まあ、暇だから付き合ってやるけどね
539デフォルトの名無しさん
2026/08/22(土) 12:37:26.28ID:06Fuc+wc540デフォルトの名無しさん
2026/08/22(土) 12:38:08.82ID:qikEO/T7 >>539
おまえが言ったんだろw
おまえが言ったんだろw
541デフォルトの名無しさん
2026/08/22(土) 12:38:49.37ID:qikEO/T7 頭硬いか自分以外認めない奴かどっちだろうねw
542デフォルトの名無しさん
2026/08/22(土) 12:40:26.86ID:06Fuc+wc >>538
俺は忙しいんだよ他のことしながら一瞬の空き時間でレスかいてんだけれどさ
時間があるなら「機能別にまとめたり同じ概念で扱う」といとかおためごかし言ったり
糞コード生成させたりしてないで有意義にすごせよ
俺は忙しいんだよ他のことしながら一瞬の空き時間でレスかいてんだけれどさ
時間があるなら「機能別にまとめたり同じ概念で扱う」といとかおためごかし言ったり
糞コード生成させたりしてないで有意義にすごせよ
543デフォルトの名無しさん
2026/08/22(土) 12:41:49.20ID:qikEO/T7 FuzzBuzzなんて同じパターンを繰り返し出力するだけのループ処理なのに
どうやってそこにプログラム言語としてのオブジェクト指向以外でオブジェクト指向を盛り込ませるってんだかw
どうやってそこにプログラム言語としてのオブジェクト指向以外でオブジェクト指向を盛り込ませるってんだかw
544デフォルトの名無しさん
2026/08/22(土) 12:42:25.76ID:06Fuc+wc545デフォルトの名無しさん
2026/08/22(土) 12:42:53.84ID:06Fuc+wc546デフォルトの名無しさん
2026/08/22(土) 12:51:27.33ID:T7yt1axc プログラムはクライスリトリプルなんだから、
圏論解析によってクライスリトリプル化して設計する。
圏論なんだからオブジェクトと射になるので、(圏論的)オブジェクト指向設計になる。
実装やオブジェクト指向言語はまた別の話。
(ただし圏論解析は、まだスタンダードなものができていない)
圏論解析によってクライスリトリプル化して設計する。
圏論なんだからオブジェクトと射になるので、(圏論的)オブジェクト指向設計になる。
実装やオブジェクト指向言語はまた別の話。
(ただし圏論解析は、まだスタンダードなものができていない)
547デフォルトの名無しさん
2026/08/22(土) 12:53:46.61ID:MVi0Z0Uj >>527
> 複数の倍数を含むときの仕様がない
複数の倍数を含むときはその組み合わせで文字列を作成してください
例:
21 → FizzPop
105 → FizzBuzzPop
15015 → FizzBuzzPopJazzRock
以上で仕様は伝えたよ
> 複数の倍数を含むときの仕様がない
複数の倍数を含むときはその組み合わせで文字列を作成してください
例:
21 → FizzPop
105 → FizzBuzzPop
15015 → FizzBuzzPopJazzRock
以上で仕様は伝えたよ
548デフォルトの名無しさん
2026/08/22(土) 12:54:25.03ID:qikEO/T7549デフォルトの名無しさん
2026/08/22(土) 12:56:17.28ID:qikEO/T7 で、何度も聞くけど、何をもってオワコンなの?
550デフォルトの名無しさん
2026/08/22(土) 12:58:48.69ID:06Fuc+wc551デフォルトの名無しさん
2026/08/22(土) 12:59:45.06ID:T7yt1axc >>547
仕様の確認です。元となる仕様も不備があり、そこがネックになっていました。
3 -> Fizz
5 -> Buzz
...
としたとき、両方の倍数のとき、単体の変換文字列を結合するのか、あるいはたまたま同じになるけど、
独立した文字列に変換するのでしょうか。
意図を明確にしてください。よろしくお願いいたします笑。
仕様の確認です。元となる仕様も不備があり、そこがネックになっていました。
3 -> Fizz
5 -> Buzz
...
としたとき、両方の倍数のとき、単体の変換文字列を結合するのか、あるいはたまたま同じになるけど、
独立した文字列に変換するのでしょうか。
意図を明確にしてください。よろしくお願いいたします笑。
552デフォルトの名無しさん
2026/08/22(土) 13:01:19.95ID:MVi0Z0Uj >>551
それはFizzBuzzのもとのルール通りです
それはFizzBuzzのもとのルール通りです
553デフォルトの名無しさん
2026/08/22(土) 13:01:51.28ID:qikEO/T7 >>550
ああ、偽OOPがたくさんあるからねw
ああ、偽OOPがたくさんあるからねw
554デフォルトの名無しさん
2026/08/22(土) 13:01:52.66ID:06Fuc+wc555デフォルトの名無しさん
2026/08/22(土) 13:02:18.87ID:T7yt1axc 15 -> 3の倍数の変換文字列と5の倍数の変換文字列を連結したもの or 独立した文字列
556デフォルトの名無しさん
2026/08/22(土) 13:02:27.40ID:06Fuc+wc >>553
その代表だよ君は
その代表だよ君は
557デフォルトの名無しさん
2026/08/22(土) 13:03:16.47ID:qikEO/T7558デフォルトの名無しさん
2026/08/22(土) 13:03:54.00ID:06Fuc+wc >>557
いらない。目が潰れる
いらない。目が潰れる
560デフォルトの名無しさん
2026/08/22(土) 13:06:07.62ID:MVi0Z0Uj561デフォルトの名無しさん
2026/08/22(土) 13:07:18.47ID:qikEO/T7 どうせ使い回しなんか大きな会社でしかやらないから
負の遺産とか言われてもなぁw
そんな話なら流行りのプログラミング言語自体が負の遺産の根源なんだし
おまえの主張は単なるプログラミング言語の問題でしか無いよ
負の遺産とか言われてもなぁw
そんな話なら流行りのプログラミング言語自体が負の遺産の根源なんだし
おまえの主張は単なるプログラミング言語の問題でしか無いよ
562デフォルトの名無しさん
2026/08/22(土) 13:09:38.03ID:06Fuc+wc 開き直って、日ごろ辛いこと・不満があるんだろうなと予想はつくが
何て言って慰めてあげたらいいか俺には思いつかないな
何て言って慰めてあげたらいいか俺には思いつかないな
563デフォルトの名無しさん
2026/08/22(土) 13:10:51.18ID:T7yt1axc >>559
元のあいまいな仕様から、実装例から得られる代表的な2つの仕様のどちらにも対応できるように
書いたため、若干冗長です。
まあ、いいでしょう。そこは同じ対処で進めます。
まあ、時間がとれて気分がよければ書いときますが、おそらく夜中に酔っぱらったまま書くでしょう笑。
元のあいまいな仕様から、実装例から得られる代表的な2つの仕様のどちらにも対応できるように
書いたため、若干冗長です。
まあ、いいでしょう。そこは同じ対処で進めます。
まあ、時間がとれて気分がよければ書いときますが、おそらく夜中に酔っぱらったまま書くでしょう笑。
564デフォルトの名無しさん
2026/08/22(土) 13:13:58.93ID:MVi0Z0Uj >>563
夜中までかかるん? 保守しやすいはずなのに?
夜中までかかるん? 保守しやすいはずなのに?
565デフォルトの名無しさん
2026/08/22(土) 13:14:44.51ID:MVi0Z0Uj あれれーおかしいぞおー(コナンくん
566デフォルトの名無しさん
2026/08/22(土) 13:17:16.66ID:qikEO/T7567デフォルトの名無しさん
2026/08/22(土) 15:18:04.75ID:Su1GpItk568デフォルトの名無しさん
2026/08/22(土) 15:50:22.89ID:qikEO/T7 ルール追加する毎に条件分岐増やすなんて愚の骨頂だろ
569デフォルトの名無しさん
2026/08/22(土) 17:09:47.31ID:Hal9xLIK スレの流れは読めてない
要点も掴んでない
脊髄反射でシコった
>>217 java
https://ideone.com/5mCU0H
素朴だけどこういうことが大事だと思ってる
ヘタに再利用性のないクラスを作っちゃうのは罪なのでメソッドひとつで表現
OOPらしさはObject,String,Integerのみで表現
表示しなさい? のお題に対してObjectを返してるのはそっちのほうが多少融通効いていいやろ? 程度の判断
>>346 java
https://ideone.com/SG4fxp
再利用性のないクラスつくっちゃった版
実行時にインスタンスに対してヘコヘコ指示出して調整していくのも
OOPらしさの一面ではあるかと?
組み合わせの数が増えてくる場合、こういうのの必要性も出てくると思う
でも本当はFizzBuzzクラスというより、もっと気の利いた抽象的な概念で出来ればよかったけど
一応熟考した結果「そんなもんは特にねえや」「FizzBuzzこそが今回の概念や」となり作成
要点も掴んでない
脊髄反射でシコった
>>217 java
https://ideone.com/5mCU0H
素朴だけどこういうことが大事だと思ってる
ヘタに再利用性のないクラスを作っちゃうのは罪なのでメソッドひとつで表現
OOPらしさはObject,String,Integerのみで表現
表示しなさい? のお題に対してObjectを返してるのはそっちのほうが多少融通効いていいやろ? 程度の判断
>>346 java
https://ideone.com/SG4fxp
再利用性のないクラスつくっちゃった版
実行時にインスタンスに対してヘコヘコ指示出して調整していくのも
OOPらしさの一面ではあるかと?
組み合わせの数が増えてくる場合、こういうのの必要性も出てくると思う
でも本当はFizzBuzzクラスというより、もっと気の利いた抽象的な概念で出来ればよかったけど
一応熟考した結果「そんなもんは特にねえや」「FizzBuzzこそが今回の概念や」となり作成
570デフォルトの名無しさん
2026/08/22(土) 18:01:23.56ID:NuWpGxo/ FizzやBuzzをオブジェクトにしろという要求と、
PopやJazzなど拡張に対応しろという要求があったので、
二つを満たしてオブジェクト指向で書けばいいんだよね?
// FizzやBuzzなどはこのMember型になり hello() で数値に反応して名前を応える
struct Member { number: usize, name: &'static str, }
impl Member {
fn new(number: usize, name: &'static str) -> Self {
Self { number, name, }
}
fn hello(&self, number: usize) -> Option<&'static str> {
(number % self.number == 0).then_some(self.name)
}
}
// 上述Memberたちのまとめ役がOrganizer型
struct Organizer { members: Vec<Member>, }
impl Organizer {
fn new(info: &[(usize, &'static str)]) -> Self {
Self { members: info.iter().map(|&(number, name)| Member::new(number, name)).collect(), }
}
fn number_to_string(&self, number: usize) -> String {
let hellos = self.members.iter().map(|member| member.hello(number)).collect::<Vec<_>>();
format!("{}", NumberToString { number, hellos: &hellos, })
}
}
PopやJazzなど拡張に対応しろという要求があったので、
二つを満たしてオブジェクト指向で書けばいいんだよね?
// FizzやBuzzなどはこのMember型になり hello() で数値に反応して名前を応える
struct Member { number: usize, name: &'static str, }
impl Member {
fn new(number: usize, name: &'static str) -> Self {
Self { number, name, }
}
fn hello(&self, number: usize) -> Option<&'static str> {
(number % self.number == 0).then_some(self.name)
}
}
// 上述Memberたちのまとめ役がOrganizer型
struct Organizer { members: Vec<Member>, }
impl Organizer {
fn new(info: &[(usize, &'static str)]) -> Self {
Self { members: info.iter().map(|&(number, name)| Member::new(number, name)).collect(), }
}
fn number_to_string(&self, number: usize) -> String {
let hellos = self.members.iter().map(|member| member.hello(number)).collect::<Vec<_>>();
format!("{}", NumberToString { number, hellos: &hellos, })
}
}
571デフォルトの名無しさん
2026/08/22(土) 18:04:19.73ID:NuWpGxo/ >>570
続き
// Organizerの下請けでhello()結果に基づき数値を文字列化を分離
struct NumberToString<'a> { number: usize, hellos: &'a [Option<&'static str>], }
impl std::fmt::Display for NumberToString<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let mut is_done = false;
for hello in self.hellos.iter() {
if let Some(name) = hello {
write!(f, "{}", name)?;
is_done = true;
}
}
if !is_done {
write!(f, "{}", self.number)?;
}
Ok(())
}
}
// お好みの設定でOrganizerを作って数値の文字列化を依頼する
fn main() {
let organizer = Organizer::new(&[(3, "Fizz"), (5, "Buzz"), (7, "Pop"), (11, "Jazz"), (13, "Rock")]);
for number in 1.. {
println!("{}", organizer.number_to_string(number));
}
}
続き
// Organizerの下請けでhello()結果に基づき数値を文字列化を分離
struct NumberToString<'a> { number: usize, hellos: &'a [Option<&'static str>], }
impl std::fmt::Display for NumberToString<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let mut is_done = false;
for hello in self.hellos.iter() {
if let Some(name) = hello {
write!(f, "{}", name)?;
is_done = true;
}
}
if !is_done {
write!(f, "{}", self.number)?;
}
Ok(())
}
}
// お好みの設定でOrganizerを作って数値の文字列化を依頼する
fn main() {
let organizer = Organizer::new(&[(3, "Fizz"), (5, "Buzz"), (7, "Pop"), (11, "Jazz"), (13, "Rock")]);
for number in 1.. {
println!("{}", organizer.number_to_string(number));
}
}
572デフォルトの名無しさん
2026/08/22(土) 18:09:45.50ID:fbloiAk8573デフォルトの名無しさん
2026/08/22(土) 18:15:38.70ID:NuWpGxo/574デフォルトの名無しさん
2026/08/22(土) 20:20:50.38ID:FMHyOiEd &'static str使うコードはこの程度の仕様変更で柔軟性がない、正直アホかと
10万行コードだったらありとあらゆる所に変更が生じてアワアワする
10万行コードだったらありとあらゆる所に変更が生じてアワアワする
575デフォルトの名無しさん
2026/08/22(土) 20:29:15.43ID:NuWpGxo/ 'staticを消して任意で受け付けるように変更したよ
変更はMemberのみStringにして後は'staticを消去
差分の方が分かりやすいと思うので
2c2
< struct Member { number: usize, name: &'static str, }
---
> struct Member { number: usize, name: String, }
4,5c4,5
< fn new(number: usize, name: &'static str) -> Self {
< Self { number, name, }
---
> fn new(number: usize, name: &str) -> Self {
> Self { number, name: name.into(), }
7,8c7,8
< fn hello(&self, number: usize) -> Option<&'static str> {
< (number % self.number == 0).then_some(self.name)
---
> fn hello(&self, number: usize) -> Option<&str> {
> (number % self.number == 0).then_some(&self.name)
15c15
< fn new(info: &[(usize, &'static str)]) -> Self {
---
> fn new(info: &[(usize, &str)]) -> Self {
25c25
< struct NumberToString<'a> { number: usize, hellos: &'a [Option<&'static str>], }
---
> struct NumberToString<'a> { number: usize, hellos: &'a [Option<&'a str>], }
変更はMemberのみStringにして後は'staticを消去
差分の方が分かりやすいと思うので
2c2
< struct Member { number: usize, name: &'static str, }
---
> struct Member { number: usize, name: String, }
4,5c4,5
< fn new(number: usize, name: &'static str) -> Self {
< Self { number, name, }
---
> fn new(number: usize, name: &str) -> Self {
> Self { number, name: name.into(), }
7,8c7,8
< fn hello(&self, number: usize) -> Option<&'static str> {
< (number % self.number == 0).then_some(self.name)
---
> fn hello(&self, number: usize) -> Option<&str> {
> (number % self.number == 0).then_some(&self.name)
15c15
< fn new(info: &[(usize, &'static str)]) -> Self {
---
> fn new(info: &[(usize, &str)]) -> Self {
25c25
< struct NumberToString<'a> { number: usize, hellos: &'a [Option<&'static str>], }
---
> struct NumberToString<'a> { number: usize, hellos: &'a [Option<&'a str>], }
576デフォルトの名無しさん
2026/08/22(土) 20:50:18.75ID:T7yt1axc >>564
https://paiza.io/projects/E86OZjZm-JfK2VzqXB40Ng?language=java
酔っぱらって書いているのでbugはあるかもしれん。
暇じゃないのでな。
https://paiza.io/projects/E86OZjZm-JfK2VzqXB40Ng?language=java
酔っぱらって書いているのでbugはあるかもしれん。
暇じゃないのでな。
577デフォルトの名無しさん
2026/08/22(土) 20:54:26.25ID:MVi0Z0Uj >>576
やるじゃん
やるじゃん
578デフォルトの名無しさん
2026/08/22(土) 21:01:59.15ID:oTrAIGCX579デフォルトの名無しさん
2026/08/22(土) 21:05:27.36ID:qikEO/T7 まだやってんの?
暇だねぇ
暇だねぇ
580デフォルトの名無しさん
2026/08/22(土) 21:06:49.77ID:T7yt1axc あいまいな仕様から、あくまでも圏論的オブジェクト指向設計の例なので、
めんどーなことは、やらん。なんにしても酔っていて眠い。寝ると思う笑。
めんどーなことは、やらん。なんにしても酔っていて眠い。寝ると思う笑。
581デフォルトの名無しさん
2026/08/22(土) 22:14:47.24ID:pI2Hq+2i >>574
errorやpathやtest dataなどとりあえず&'static strはよくあるけど変更の対応は大した手間ではないよ
errorやpathやtest dataなどとりあえず&'static strはよくあるけど変更の対応は大した手間ではないよ
582デフォルトの名無しさん
2026/08/22(土) 23:33:06.51ID:Y7IH6tUx >>580
外から受け取り算出する設計に変えないと
見るに堪えないコードになってるよ
内部がこのマジックナンバーとか
private int gcd15015() {
var num1 = this.value;
var num2 = 15015;
この大量の手書きとか
Map.entry(3 * 5 * 7 * 11, "FizzBuzzPopJazz"),
Map.entry(3 * 5 * 7 * 13, "FizzBuzzPopRock"),
Map.entry(3 * 5 * 11 * 13, "FizzBuzzJazzRock"),
Map.entry(3 * 7 * 11 * 13, "FizzPopJazzRock"),
Map.entry(5 * 7 * 11 * 13, "BuzzPopJazzRock"),
Map.entry(3 * 5 * 7 * 11 * 13, "FizzBuzzPopJazzRock")
外から受け取り算出する設計に変えないと
見るに堪えないコードになってるよ
内部がこのマジックナンバーとか
private int gcd15015() {
var num1 = this.value;
var num2 = 15015;
この大量の手書きとか
Map.entry(3 * 5 * 7 * 11, "FizzBuzzPopJazz"),
Map.entry(3 * 5 * 7 * 13, "FizzBuzzPopRock"),
Map.entry(3 * 5 * 11 * 13, "FizzBuzzJazzRock"),
Map.entry(3 * 7 * 11 * 13, "FizzPopJazzRock"),
Map.entry(5 * 7 * 11 * 13, "BuzzPopJazzRock"),
Map.entry(3 * 5 * 7 * 11 * 13, "FizzBuzzPopJazzRock")
583デフォルトの名無しさん
2026/08/22(土) 23:40:54.46ID:qikEO/T7584デフォルトの名無しさん
2026/08/23(日) 01:30:12.22ID:iasgGq5L へんな時間に寝たのでいちど起きてしまった。
ふ。仕様を逸脱しないようにすると全部書かざるを得ないわけよ。
仕様の不備はおれのせいじゃない、確認したしな。
こういう頭の悪いクライアントは多い。さてまた寝よう。
ふ。仕様を逸脱しないようにすると全部書かざるを得ないわけよ。
仕様の不備はおれのせいじゃない、確認したしな。
こういう頭の悪いクライアントは多い。さてまた寝よう。
585デフォルトの名無しさん
2026/08/23(日) 01:43:05.40ID:6kU/xY28 >>584
仕様は簡単
自然数を1から順に文字列へ変換せよ
3で割り切れる時はFizz
5で割り切れる時はBuzz
7で割り切れる時はPop
11で割り切れる時はJazz
13で割り切れる時はRock
17で割り切れる時はFolk
それぞれを順に並べたものとする
例えば255はFizzBuzzFolkへ変換せよ
いずれにも該当しないときは自然数そのまま文字列にせよ
仕様は簡単
自然数を1から順に文字列へ変換せよ
3で割り切れる時はFizz
5で割り切れる時はBuzz
7で割り切れる時はPop
11で割り切れる時はJazz
13で割り切れる時はRock
17で割り切れる時はFolk
それぞれを順に並べたものとする
例えば255はFizzBuzzFolkへ変換せよ
いずれにも該当しないときは自然数そのまま文字列にせよ
586デフォルトの名無しさん
2026/08/23(日) 09:34:37.37ID:F3OUjFLN >>584
文字列の結合を静的にやるか動的にやるかは設計判断
こういう手順でこうしろと仕様で書かれてるとおりにやればできるならそれはただの作業であって設計ではない
将来を見越して未知のものに判断を下すのが設計、その設計の指針となるのが保守性など
君は文字列を静的に結合してコードに直書きする設計をした
君の設計は条件の追加のコストが高くつくものだった
それが事実
仕様が悪い、クライアントの頭が悪いと言っているけど実際は君の頭が悪い
文字列の結合を静的にやるか動的にやるかは設計判断
こういう手順でこうしろと仕様で書かれてるとおりにやればできるならそれはただの作業であって設計ではない
将来を見越して未知のものに判断を下すのが設計、その設計の指針となるのが保守性など
君は文字列を静的に結合してコードに直書きする設計をした
君の設計は条件の追加のコストが高くつくものだった
それが事実
仕様が悪い、クライアントの頭が悪いと言っているけど実際は君の頭が悪い
587デフォルトの名無しさん
2026/08/23(日) 09:39:21.38ID:RCO/sdz3 そもそもFizzBuzzJazzなどの結合文字列なんか用意する必要はないよな
たまたまFizzとBuzzとJazzだけで割り切れた時に順に追記してFizzBuzzJazzが自然に生成されるだけだよな
たまたまFizzとBuzzとJazzだけで割り切れた時に順に追記してFizzBuzzJazzが自然に生成されるだけだよな
588デフォルトの名無しさん
2026/08/23(日) 09:41:36.69ID:F3OUjFLN589デフォルトの名無しさん
2026/08/23(日) 09:51:42.61ID:SzWuQqoT590デフォルトの名無しさん
2026/08/23(日) 10:24:03.77ID:F3OUjFLN >>589
そういうこと言うな、言わん方が良い、お前のためだ
そういうこと言うな、言わん方が良い、お前のためだ
591デフォルトの名無しさん
2026/08/23(日) 10:40:47.40ID:M+PVsTq+ こんな感じのダサいけど読みやすいコードじゃダメなん? Pythonユーザーはこんな感じで書く人が多いんじゃないかなと思うんだけど。
https://www.ideone.com/h3xXoq
https://www.ideone.com/h3xXoq
592デフォルトの名無しさん
2026/08/23(日) 10:47:39.45ID:Dec9exUR >>591
それだと本来のFizzBuzzが動かないので失格
いくつまで処理するのか何を表示するのかは外部から与えられる
形式は自由でいいけど3→Fizzと5→Buzzが与えられた時は本来のFizzBuzzの動作
それだと本来のFizzBuzzが動かないので失格
いくつまで処理するのか何を表示するのかは外部から与えられる
形式は自由でいいけど3→Fizzと5→Buzzが与えられた時は本来のFizzBuzzの動作
593デフォルトの名無しさん
2026/08/23(日) 11:00:54.37ID:M+PVsTq+ こういうこと? 仕様を外部から与えられる方が柔軟なのはわかるけど、読みづらいから個人的にはあまり好きではないかな。
https://www.ideone.com/zSoAzy
https://www.ideone.com/zSoAzy
594デフォルトの名無しさん
2026/08/23(日) 11:18:44.40ID:/SMVVWF/ おまえらコバロより劣るコード書いてんじゃんwww
595デフォルトの名無しさん
2026/08/23(日) 12:00:59.91ID:iH5V9eFJ596デフォルトの名無しさん
2026/08/23(日) 12:13:29.29ID:iasgGq5L597デフォルトの名無しさん
2026/08/23(日) 12:16:09.07ID:iasgGq5L マジックナンバーは、このマジックナンバーの意味がわからないやつは触れるべからずという呪文。
598デフォルトの名無しさん
2026/08/23(日) 12:21:27.38ID:/SMVVWF/ >>596
仕様が誤りって事もあるんだよ?
仕様が誤りって事もあるんだよ?
599デフォルトの名無しさん
2026/08/23(日) 12:30:15.64ID:iH5V9eFJ 特定のリニアな変化に対する局所最適化の話だけになってるから
もう少し違うバリエーションを考えたら?
よくあるのはこういうやつ
- Variation according to digits
- 7Boom
- Fizz-Buzz-Woof
https://xapn.github.io/fizz-buzz/#fizz-buzz-variations
もう少し違うバリエーションを考えたら?
よくあるのはこういうやつ
- Variation according to digits
- 7Boom
- Fizz-Buzz-Woof
https://xapn.github.io/fizz-buzz/#fizz-buzz-variations
600デフォルトの名無しさん
2026/08/23(日) 12:31:16.30ID:iasgGq5L >>568
だからこそ、確認を取ったにもかかわらず、その仕様でGOされたわけ笑
だからこそ、確認を取ったにもかかわらず、その仕様でGOされたわけ笑
601デフォルトの名無しさん
2026/08/23(日) 12:32:45.51ID:LXYwYlQF バカな船頭が自己満で繰り広げたゴミコードの墓場だね
602デフォルトの名無しさん
2026/08/23(日) 12:39:24.70ID:F3OUjFLN603デフォルトの名無しさん
2026/08/23(日) 12:39:48.34ID:M+PVsTq+ >>595
必要というか、fizzbuzzという概念の捉え方次第じゃない? 上の方の例では大体、1, 2, Fizz, 4,... という出力をするものとしてfizzbuzz概念が捉えられているみたいだったから、Pythonで表現するときにgeneratorにするのは比較的自然な考え方だと思うけど。
595のように、単一の数値を単一の文字列に変換する関数・ルールとしてfizzbuzz概念を捉えるのであれば、それはそれでありだとは思うけど、それだけの話なのでは?
必要というか、fizzbuzzという概念の捉え方次第じゃない? 上の方の例では大体、1, 2, Fizz, 4,... という出力をするものとしてfizzbuzz概念が捉えられているみたいだったから、Pythonで表現するときにgeneratorにするのは比較的自然な考え方だと思うけど。
595のように、単一の数値を単一の文字列に変換する関数・ルールとしてfizzbuzz概念を捉えるのであれば、それはそれでありだとは思うけど、それだけの話なのでは?
604デフォルトの名無しさん
2026/08/23(日) 12:45:26.71ID:DMCqliCM クソみたいな他人の作った仕様でゴミみたいなサンプルコード書くんじゃなく、自分が普段使いできる簡単なツールでも作れよ
今時の小学生ですら簡単なゲームくらい作ってるんだぞ。情けないなあ
今時の小学生ですら簡単なゲームくらい作ってるんだぞ。情けないなあ
605デフォルトの名無しさん
2026/08/23(日) 12:47:28.81ID:/SMVVWF/ 最小公倍数の範囲で繰り返すだけの出力処理にオブジェクト指向もなにもあったもんじゃ無いだろ
もう使ってる処理言語がオブジェクト指向言語なんだからそれで答えは出てる
ここまで来てもオブジェクト指向がオワコンだと言う事の答えが何も示されていない
もう使ってる処理言語がオブジェクト指向言語なんだからそれで答えは出てる
ここまで来てもオブジェクト指向がオワコンだと言う事の答えが何も示されていない
606デフォルトの名無しさん
2026/08/23(日) 12:48:46.54ID:iasgGq5L 今回は、場のオブジェクト指向の試験を兼ねて作成した。
この試験の結果、出力されるものは2つの異なる(量子)統計が混在するもので、
場(ルール)と合わせて全体をみれば可逆である。
streamは個別の値が流れるわけではなく、streamという全体が演算される。
streamは可逆であり、双対性がある。可逆な中間操作をバインドして繋げばよい。
これはXXXを変えれば演算が行われるということであり、フロー型のさらに次世代を予想させる。
いいすぎな表現だが、簡単にいえば、演算は行われずに演算の結果が得られる。
この試験の結果、出力されるものは2つの異なる(量子)統計が混在するもので、
場(ルール)と合わせて全体をみれば可逆である。
streamは個別の値が流れるわけではなく、streamという全体が演算される。
streamは可逆であり、双対性がある。可逆な中間操作をバインドして繋げばよい。
これはXXXを変えれば演算が行われるということであり、フロー型のさらに次世代を予想させる。
いいすぎな表現だが、簡単にいえば、演算は行われずに演算の結果が得られる。
607デフォルトの名無しさん
2026/08/23(日) 12:49:54.67ID:HWzbbtqX 「>>605は認識能力が足りません」までは読んだ
608デフォルトの名無しさん
2026/08/23(日) 12:50:38.64ID:/SMVVWF/ むしろ設計次第で毒にも薬にもなるって証明にはなったかもな
609デフォルトの名無しさん
2026/08/23(日) 12:53:14.80ID:iasgGq5L610デフォルトの名無しさん
2026/08/23(日) 12:56:45.45ID:F3OUjFLN >>609
仕様がわからないと言い訳たれてんのは君だけ
他の人は言われなくても文字列を動的に結合すれば
仕様変更に強いと自分で判断してそうしてる
プログラマとしての能力を持ってるからできること
そうしてくれと言われてできるのはあたりまえでそれは作業でしかない
自分は確認を取った、それでGOされたというのも作業員でしか通用しない言い訳だよね
君は作業員としてしか仕事したことないんじゃない?
仕様がわからないと言い訳たれてんのは君だけ
他の人は言われなくても文字列を動的に結合すれば
仕様変更に強いと自分で判断してそうしてる
プログラマとしての能力を持ってるからできること
そうしてくれと言われてできるのはあたりまえでそれは作業でしかない
自分は確認を取った、それでGOされたというのも作業員でしか通用しない言い訳だよね
君は作業員としてしか仕事したことないんじゃない?
611デフォルトの名無しさん
2026/08/23(日) 13:03:04.51ID:/SMVVWF/ >>609
仕様→設計→コーディング
仕様→設計→コーディング
612デフォルトの名無しさん
2026/08/23(日) 13:04:01.05ID:/SMVVWF/ コードには設計が現れているだろw
613デフォルトの名無しさん
2026/08/23(日) 13:05:56.08ID:/SMVVWF/ コードが悪い=設計が悪い
614デフォルトの名無しさん
2026/08/23(日) 13:08:55.68ID:F3OUjFLN >>611
左様
左様
615デフォルトの名無しさん
2026/08/23(日) 13:13:24.37ID:iasgGq5L >>610
仕様を逸脱したら損害が発生するんだよ。会社経営したことないだろ。
仕様を逸脱したら損害が発生するんだよ。会社経営したことないだろ。
616デフォルトの名無しさん
2026/08/23(日) 13:21:09.56ID:F3OUjFLN >>615
君はFizzBuzzの課題で文字列を動的に結合したら仕様を逸脱して損害が発生して会社の経営が危なくなると思っているのかい、大変だね
君はFizzBuzzの課題で文字列を動的に結合したら仕様を逸脱して損害が発生して会社の経営が危なくなると思っているのかい、大変だね
617デフォルトの名無しさん
2026/08/23(日) 13:28:56.47ID:iasgGq5L618デフォルトの名無しさん
2026/08/23(日) 13:29:48.18ID:/SMVVWF/ 理屈に合わない仕様なら、むしろ仕様を訂正させるw
619デフォルトの名無しさん
2026/08/23(日) 13:36:03.60ID:F3OUjFLN >>617
そうかい、その本の余白に俺との思い出も書き残しておいてくれよ
そうかい、その本の余白に俺との思い出も書き残しておいてくれよ
620デフォルトの名無しさん
2026/08/23(日) 13:39:32.97ID:F3OUjFLN 仕様で決めるのは目的であって方法でも手段でもないからね
文字列の結合方法を仕様で決められてもなあ
文字列の結合方法を仕様で決められてもなあ
621デフォルトの名無しさん
2026/08/23(日) 14:04:47.40ID:HWzbbtqX FIzZBuzzで重箱隅これだけもめて、書いたのはゴミコードって
この人たち本当にこの分野で食べているのだろうか…謎
この人たち本当にこの分野で食べているのだろうか…謎
622デフォルトの名無しさん
2026/08/23(日) 14:32:48.12ID:QvCbW4h1 顧客は無知なもんだから
623デフォルトの名無しさん
2026/08/23(日) 14:38:22.96ID:/SMVVWF/ 動けばいいんだよ
だからコバロで書いてコピペして仕事が完了
だからコバロで書いてコピペして仕事が完了
624デフォルトの名無しさん
2026/08/23(日) 14:50:41.16ID:QvCbW4h1 コバロって何
625デフォルトの名無しさん
2026/08/23(日) 14:59:42.81ID:wVoNaoye >>624
無知かアスペかどっちか
無知かアスペかどっちか
626デフォルトの名無しさん
2026/08/23(日) 15:06:20.12ID:HWzbbtqX やっぱなwナンチャってソフトウエアエンジニアの巣窟だったかw
627デフォルトの名無しさん
2026/08/23(日) 15:28:12.05ID:KkX4SDMy 仕様で決めるのは目的であって方法じゃない、って話なら
結局設計って「どの変更をどこに閉じ込めるか」を決めることなんじゃねえの
FizzBuzzなら3→Fizzを7→Pop追加しても一箇所で済むようにするとか
そういうのが保守性の正体だろ
結局設計って「どの変更をどこに閉じ込めるか」を決めることなんじゃねえの
FizzBuzzなら3→Fizzを7→Pop追加しても一箇所で済むようにするとか
そういうのが保守性の正体だろ
628デフォルトの名無しさん
2026/08/23(日) 15:30:54.39ID:KkX4SDMy ただ変更に強いって言い方も雑なんだよな
Fizz Buzz Popが増える変更には強くても
倍数じゃなくて桁に3が入ってたらFizzに変わったら全部崩れるかもしれない
何の変更に対して局所化してるか、まで言わないと意味ない
Fizz Buzz Popが増える変更には強くても
倍数じゃなくて桁に3が入ってたらFizzに変わったら全部崩れるかもしれない
何の変更に対して局所化してるか、まで言わないと意味ない
629デフォルトの名無しさん
2026/08/23(日) 15:33:32.71ID:KkX4SDMy そう考えると設計の良し悪しって
変更するときにどこまで見に行かされるかでかなり決まる気がする
何についてのコードか
何に依存してるか
どこ直せばいいか
何テストすればいいか
これが近所だけ見て分かるコードは楽
変更するときにどこまで見に行かされるかでかなり決まる気がする
何についてのコードか
何に依存してるか
どこ直せばいいか
何テストすればいいか
これが近所だけ見て分かるコードは楽
630デフォルトの名無しさん
2026/08/23(日) 15:34:15.40ID:tl6J+3gQ631デフォルトの名無しさん
2026/08/23(日) 15:37:49.27ID:KkX4SDMy 逆に一箇所直すのに
親クラス見て
interface見て
DI設定見て
Factory見て
Listener見て
どこでoverrideされてるか検索して
みたいになるとキツい
コード量じゃなくて探索範囲がでかい
親クラス見て
interface見て
DI設定見て
Factory見て
Listener見て
どこでoverrideされてるか検索して
みたいになるとキツい
コード量じゃなくて探索範囲がでかい
632デフォルトの名無しさん
2026/08/23(日) 15:39:26.68ID:QvCbW4h1 関数にしてその中でご自由にどうぞでええやん
633デフォルトの名無しさん
2026/08/23(日) 15:44:28.67ID:KkX4SDMy そうなるとあれ
それって昔OOPが解決しようとしてた問題じゃなかったっけ
データとそれを操作する処理をオブジェクトに閉じ込めて
内部知らなくても使えるようにするって話だろ
本来は局所化するための仕組みだったはず
それって昔OOPが解決しようとしてた問題じゃなかったっけ
データとそれを操作する処理をオブジェクトに閉じ込めて
内部知らなくても使えるようにするって話だろ
本来は局所化するための仕組みだったはず
634デフォルトの名無しさん
2026/08/23(日) 15:48:19.79ID:KkX4SDMy なのに実際のOOPコードだと
継承
動的ディスパッチ
DI
Observer
ORM
フレームワークのライフサイクル
とか乗りまくって
そのオブジェクトが何するか知るために全然違う場所見に行く羽目になるんだよな
継承
動的ディスパッチ
DI
Observer
ORM
フレームワークのライフサイクル
とか乗りまくって
そのオブジェクトが何するか知るために全然違う場所見に行く羽目になるんだよな
635デフォルトの名無しさん
2026/08/23(日) 15:50:25.49ID:F3OUjFLN お前らほんまFizzBuzz好きやなあ
俺はそんなお前らが好きだ
俺はそんなお前らが好きだ
636デフォルトの名無しさん
2026/08/23(日) 15:52:04.46ID:KkX4SDMy つまりオブジェクトが情報を閉じ込める箱じゃなくて
依存関係を集めるハブになっちゃったのが問題なんじゃね
UserServiceとかOrderManagerとかいう名前だけ局所的で
中身はDBもメールも決済もログもイベントも何でも触るやつ
依存関係を集めるハブになっちゃったのが問題なんじゃね
UserServiceとかOrderManagerとかいう名前だけ局所的で
中身はDBもメールも決済もログもイベントも何でも触るやつ
637デフォルトの名無しさん
2026/08/23(日) 15:55:00.72ID:KkX4SDMy そう考えるとOOPは変更に強いじゃなくて
カプセル化がうまくいってれば変更に強いなんじゃね
クラス使ってるだけでは何も保証されないどころか
継承とかshared mutable stateで逆に非局所化することもある
カプセル化がうまくいってれば変更に強いなんじゃね
クラス使ってるだけでは何も保証されないどころか
継承とかshared mutable stateで逆に非局所化することもある
638デフォルトの名無しさん
2026/08/23(日) 15:56:09.08ID:/SMVVWF/ 仕様が変われば設計だって変わるのは当たり前だ
なんでも予測して変更に耐えられる設計なんて存在しないから
変更があるとすれば固定値や特定条件とかくらい、それ以上は仕様からやり直し
なんでも予測して変更に耐えられる設計なんて存在しないから
変更があるとすれば固定値や特定条件とかくらい、それ以上は仕様からやり直し
639デフォルトの名無しさん
2026/08/23(日) 15:58:32.65ID:KkX4SDMy で最近のGoとかRustとか見てると
クラスを捨てたというよりデータメソッド、interface、trait、所有権、可変性をバラして必要なものだけ組み合わせる方向なんだよな
昔class一個に背負わせてた責務を分解してるように見える
クラスを捨てたというよりデータメソッド、interface、trait、所有権、可変性をバラして必要なものだけ組み合わせる方向なんだよな
昔class一個に背負わせてた責務を分解してるように見える
640デフォルトの名無しさん
2026/08/23(日) 16:00:04.51ID:F3OUjFLN >>392
そうね、flatMapは平坦化できることと要素数を変えられるのが特徴
モダンな言語だとジェネレータがあるからflatMapの出番はない気がする
ジェネレータがない言語だとflatMapを使うと良い感じ
たとえば組み合わせを列挙するコードはジェネレータで書くとこう
IEnumerable<ImmutableQueue<T>> CombinationGeneratorStyle<T>(ImmutableQueue<T> queue) {
return F(queue, ImmutableQueue<T>.Empty);
IEnumerable<ImmutableQueue<T>> F(ImmutableQueue<T> q, ImmutableQueue<T> r) {
yield return r;
for (; !q.IsEmpty; q = q.Dequeue()) {
foreach (var sub in F(q.Dequeue(), r.Enqueue(q.Peek()))) {
yield return sub;
}
}
}
}
そうね、flatMapは平坦化できることと要素数を変えられるのが特徴
モダンな言語だとジェネレータがあるからflatMapの出番はない気がする
ジェネレータがない言語だとflatMapを使うと良い感じ
たとえば組み合わせを列挙するコードはジェネレータで書くとこう
IEnumerable<ImmutableQueue<T>> CombinationGeneratorStyle<T>(ImmutableQueue<T> queue) {
return F(queue, ImmutableQueue<T>.Empty);
IEnumerable<ImmutableQueue<T>> F(ImmutableQueue<T> q, ImmutableQueue<T> r) {
yield return r;
for (; !q.IsEmpty; q = q.Dequeue()) {
foreach (var sub in F(q.Dequeue(), r.Enqueue(q.Peek()))) {
yield return sub;
}
}
}
}
641デフォルトの名無しさん
2026/08/23(日) 16:00:38.10ID:HWzbbtqX class原理主義・第一主義よりは良くなってきたし面白くなってきたよな
どう発展していくかな
どう発展していくかな
642デフォルトの名無しさん
2026/08/23(日) 16:00:48.79ID:F3OUjFLN >>640
flatMapで書くとこう
IEnumerable<ImmutableQueue<T>> CombinationMonadicStyle<T>(ImmutableQueue<T> queue) {
return F(queue, ImmutableQueue<T>.Empty);
IEnumerable<ImmutableQueue<T>> F(ImmutableQueue<T> q, ImmutableQueue<T> r) {
return new[] { r }.Concat(
For(q, x => !x.IsEmpty, x => x.Dequeue())
.SelectMany(x => F(x.Dequeue(), r.Enqueue(x.Peek()))));
}
}
IEnumerable<T> For<T>(T seed, Func<T, bool> hasNext, Func<T, T> next) {
return hasNext(seed)
? new[] { seed }.Concat(
new[] { seed }
.SelectMany(x => For<T>(next(x), hasNext, next)))
: [];
}
flatMapで書くとこう
IEnumerable<ImmutableQueue<T>> CombinationMonadicStyle<T>(ImmutableQueue<T> queue) {
return F(queue, ImmutableQueue<T>.Empty);
IEnumerable<ImmutableQueue<T>> F(ImmutableQueue<T> q, ImmutableQueue<T> r) {
return new[] { r }.Concat(
For(q, x => !x.IsEmpty, x => x.Dequeue())
.SelectMany(x => F(x.Dequeue(), r.Enqueue(x.Peek()))));
}
}
IEnumerable<T> For<T>(T seed, Func<T, bool> hasNext, Func<T, T> next) {
return hasNext(seed)
? new[] { seed }.Concat(
new[] { seed }
.SelectMany(x => For<T>(next(x), hasNext, next)))
: [];
}
643デフォルトの名無しさん
2026/08/23(日) 16:04:01.11ID:KkX4SDMy じゃあOOPオワコンって
オブジェクトとかカプセル化がオワコンなんじゃなくて
クラス作って継承とポリモーフィズムで世界をモデル化すれば
自然と変更に強い設計になる
っていう古典的OOP観がオワコンなんじゃね?
局所性を作るために生まれたOOPが
使い方次第で非局所性の発生源になった、という話なら割と筋通る気がする
オブジェクトとかカプセル化がオワコンなんじゃなくて
クラス作って継承とポリモーフィズムで世界をモデル化すれば
自然と変更に強い設計になる
っていう古典的OOP観がオワコンなんじゃね?
局所性を作るために生まれたOOPが
使い方次第で非局所性の発生源になった、という話なら割と筋通る気がする
644デフォルトの名無しさん
2026/08/23(日) 16:05:08.08ID:+hvJAYKo クラスは不要
クラスは時代遅れ
クラスは時代遅れ
645デフォルトの名無しさん
2026/08/23(日) 16:10:43.94ID:xuiTfLZn classを全否定するつもりは無いけどstructとmethodだけでいいし特に継承はオブジェクト指向の負の遺産
646デフォルトの名無しさん
2026/08/23(日) 16:14:12.45ID:HWzbbtqX647デフォルトの名無しさん
2026/08/23(日) 16:16:35.09ID:/SMVVWF/ 大きな仕様変更は関係が変わるんだからそりゃあ既存の設計じゃ満たせないのは当たり前
万能な設計なんて無いんだからそれをオブジェクト指向のせいにするのはお門違いだ
万能な設計なんて無いんだからそれをオブジェクト指向のせいにするのはお門違いだ
648デフォルトの名無しさん
2026/08/23(日) 16:19:21.65ID:iasgGq5L classでなくともよいのだが、関係性の集まりを指示できる対象が必要となる。
これを「場」とみなせば、
場のオブジェクト指向は、場にメッセージを投げ入れると何らかの反応があったり/なかったりするもの、
ということになる。
場の演算子が反応すれば、observableが返ってくる/かもしれない。
これを「場」とみなせば、
場のオブジェクト指向は、場にメッセージを投げ入れると何らかの反応があったり/なかったりするもの、
ということになる。
場の演算子が反応すれば、observableが返ってくる/かもしれない。
649デフォルトの名無しさん
2026/08/23(日) 16:24:20.60ID:HWzbbtqX ひー
650デフォルトの名無しさん
2026/08/23(日) 16:32:26.38ID:iasgGq5L 場のオブジェクト指向が目指すところは可逆演算(可逆計算)と量子コンピューティングだ。
場は「局所」ではない。関数型計算の究極形だろう(理想)。
場の計算理論の前に、数学そのものの正体が場の(量子)情報理論であると考え中。
場は「局所」ではない。関数型計算の究極形だろう(理想)。
場の計算理論の前に、数学そのものの正体が場の(量子)情報理論であると考え中。
651デフォルトの名無しさん
2026/08/23(日) 16:32:53.18ID:QbJdGCa2 >>643
>クラス作って継承とポリモーフィズムで世界をモデル化すれば
>自然と変更に強い設計になる
90~00年頃の考え方だよね
変わりやすい部分と変わりにくい部分を見極めて
どういう種類の変更に強くするか取捨選択する必要がある
オブジェクト指向に限った話ではない
FizzBuzzを動的文字列結合で解決する話も
3と5と両方で割り切れるならWYAAAYYY!! にするような変更にはめっぽう弱いのと同じ
>クラス作って継承とポリモーフィズムで世界をモデル化すれば
>自然と変更に強い設計になる
90~00年頃の考え方だよね
変わりやすい部分と変わりにくい部分を見極めて
どういう種類の変更に強くするか取捨選択する必要がある
オブジェクト指向に限った話ではない
FizzBuzzを動的文字列結合で解決する話も
3と5と両方で割り切れるならWYAAAYYY!! にするような変更にはめっぽう弱いのと同じ
652デフォルトの名無しさん
2026/08/23(日) 16:37:17.16ID:QbJdGCa2653デフォルトの名無しさん
2026/08/23(日) 16:45:22.29ID:HWzbbtqX GUI FWは継承がうまくいった稀な応用だと思うが
654デフォルトの名無しさん
2026/08/23(日) 16:50:32.37ID:/SMVVWF/ 特定用途に偏った設計が別の特定用途に整合できるはずが無いんだよね
最初からそれ以外の用途では使わないなら
それは良いも悪いも無いからね
最初からそれ以外の用途では使わないなら
それは良いも悪いも無いからね
655デフォルトの名無しさん
2026/08/23(日) 16:52:50.80ID:/SMVVWF/ オブジェクト指向は万能みたいな夢を騙るから失敗してるとか訳の分からない話をし出す
どんなソフトウェア技法だって万能なんか無い
どんなソフトウェア技法だって万能なんか無い
656デフォルトの名無しさん
2026/08/23(日) 16:55:54.03ID:HWzbbtqX クラス(カプセル化)、動的インスタンス(動的extent)、継承、多態といったもので
プログラムを現すモデルとして実は適していなかったおそれがあると思う
プログラムを現すモデルとして実は適していなかったおそれがあると思う
657デフォルトの名無しさん
2026/08/23(日) 17:10:09.30ID:/SMVVWF/ おまえら、気づかないうちにクラスメソッド使いまくってるじゃんw
658デフォルトの名無しさん
2026/08/23(日) 17:20:57.83ID:iasgGq5L まとめて計算させるためには素数を使う。
可逆性は確認できたが、量子アルゴリズムはそのうち考えることにして、
javaのThreadPoolで高速化できるか、オーバーヘッドのほうが大きいか確認してみようと思う。
可逆性は確認できたが、量子アルゴリズムはそのうち考えることにして、
javaのThreadPoolで高速化できるか、オーバーヘッドのほうが大きいか確認してみようと思う。
659デフォルトの名無しさん
2026/08/23(日) 17:21:26.65ID:vDqnQhmn660デフォルトの名無しさん
2026/08/23(日) 17:22:54.82ID:iasgGq5L まとめて計算させるためには素数を使う。
可逆性は確認できたが、量子アルゴリズムはそのうち考えることにして、
javaのThreadPoolで高速化できるか、オーバーヘッドのほうが大きいか確認してみようと思う。
可逆性は確認できたが、量子アルゴリズムはそのうち考えることにして、
javaのThreadPoolで高速化できるか、オーバーヘッドのほうが大きいか確認してみようと思う。
661デフォルトの名無しさん
2026/08/23(日) 17:24:02.54ID:iasgGq5L ち、ミスった。ボタン押し間違いで二重投稿になった。
662デフォルトの名無しさん
2026/08/23(日) 17:33:30.22ID:4FpMaXiD663デフォルトの名無しさん
2026/08/23(日) 17:35:18.42ID:HWzbbtqX >>659
動的extent - Google 検索
ttps://www.google.com/search?q=%E5%8B%95%E7%9A%84extent&hl=ja
無知の自慢か
オプション指向が逆に分からん
動的extent - Google 検索
ttps://www.google.com/search?q=%E5%8B%95%E7%9A%84extent&hl=ja
無知の自慢か
オプション指向が逆に分からん
664デフォルトの名無しさん
2026/08/23(日) 17:42:19.56ID:IZSLg4J0665デフォルトの名無しさん
2026/08/23(日) 17:43:22.91ID:HWzbbtqX extent って日本人では使い人少ない感じがするな
life time ならよく使われる。変数の life time など
動的life timeを持つ変数 、インスタンス
life time ならよく使われる。変数の life time など
動的life timeを持つ変数 、インスタンス
666デフォルトの名無しさん
2026/08/23(日) 17:44:22.00ID:HWzbbtqX >>664
ねぇextentもしらないで人に絡むのやめない?
ねぇextentもしらないで人に絡むのやめない?
667デフォルトの名無しさん
2026/08/23(日) 17:46:21.02ID:HWzbbtqX かれはscopeくらいならワカルかな。
これも知らぬと絡んできたらプロログらミングのど素人ちゃん確定だ
これも知らぬと絡んできたらプロログらミングのど素人ちゃん確定だ
668デフォルトの名無しさん
2026/08/23(日) 17:49:29.05ID:K/xiM3u4 >>663
そこに出てくるどの意味かね?
Lispだと動的extentはスコープを抜けると消えるローカル変数束縛のこと
C++だと動的extentは配列や連続体の要素数がコンパイル時ではなく実行時に決まること
そこに出てくるどの意味かね?
Lispだと動的extentはスコープを抜けると消えるローカル変数束縛のこと
C++だと動的extentは配列や連続体の要素数がコンパイル時ではなく実行時に決まること
669デフォルトの名無しさん
2026/08/23(日) 17:49:59.43ID:HWzbbtqX もうそういう人たちがクラスだオジェクトだ言ってんだよな
変な時代になったもんだ
変な時代になったもんだ
670デフォルトの名無しさん
2026/08/23(日) 17:55:43.74ID:HWzbbtqX >>668
その両方がそれぞれextentの種別だよ
下のC++のはあきらかに動的じゃないだろ、言われなきゃわからんとは…
extentはお前が書いた「特定の言語でのみ通用する用語」はない
プログラムの変数やメモリの内容の生存期間に関する一般的な用語だよ
なんでおれがど素人講座ここでやtらなきゃならん
ぶつぶつ、少し反省して無知の知にまで至れ
変数のextent - Google 検索
ttps://www.google.com/search?q=%E5%A4%89%E6%95%B0%E3%81%AEextent&&hl=ja&source=hp
AI による概要
プログラミングにおいて変数のエクステント(extent)とは、その変数がメモリ上に存在し、値を保持している生存期間(有効期間)のことです。
プログラムの中で名前がどこから見えるかを表す「スコープ(有効範囲)」とは区別されます。
エクステントの種類
静的エクステント(Static):プログラムの開始から終了までずっとメモリに存在します。
自動エクステント(Automatic):関数やブロックの実行が始まった時に作られ、終わると消えます。
動的エクステント(Dynamic):プログラムの実行中に明示的な割り当てと解放を行って管理します。
スコープとの違い
スコープ:名前を参照できる範囲(どこで書けるか)
エクステント:メモリに存在している期間(いつ使えるか)たとえば、C言語の static 付きローカル変数は、スコープは関数内だけですが、
エクステントはプログラム全体(静的)になります。
以下略
その両方がそれぞれextentの種別だよ
下のC++のはあきらかに動的じゃないだろ、言われなきゃわからんとは…
extentはお前が書いた「特定の言語でのみ通用する用語」はない
プログラムの変数やメモリの内容の生存期間に関する一般的な用語だよ
なんでおれがど素人講座ここでやtらなきゃならん
ぶつぶつ、少し反省して無知の知にまで至れ
変数のextent - Google 検索
ttps://www.google.com/search?q=%E5%A4%89%E6%95%B0%E3%81%AEextent&&hl=ja&source=hp
AI による概要
プログラミングにおいて変数のエクステント(extent)とは、その変数がメモリ上に存在し、値を保持している生存期間(有効期間)のことです。
プログラムの中で名前がどこから見えるかを表す「スコープ(有効範囲)」とは区別されます。
エクステントの種類
静的エクステント(Static):プログラムの開始から終了までずっとメモリに存在します。
自動エクステント(Automatic):関数やブロックの実行が始まった時に作られ、終わると消えます。
動的エクステント(Dynamic):プログラムの実行中に明示的な割り当てと解放を行って管理します。
スコープとの違い
スコープ:名前を参照できる範囲(どこで書けるか)
エクステント:メモリに存在している期間(いつ使えるか)たとえば、C言語の static 付きローカル変数は、スコープは関数内だけですが、
エクステントはプログラム全体(静的)になります。
以下略
671デフォルトの名無しさん
2026/08/23(日) 17:58:05.85ID:HWzbbtqX プログラミングのすそ野が広がったってことだな
すそ野といえばまだ耳障り良いが、底辺だわ
すそ野といえばまだ耳障り良いが、底辺だわ
672デフォルトの名無しさん
2026/08/23(日) 17:59:02.41ID:HWzbbtqX あと、リンケージっていう大切な概念があんだよね
絶対に知らないだろうけど
絶対に知らないだろうけど
673デフォルトの名無しさん
2026/08/23(日) 17:59:19.29ID:M+PVsTq+674デフォルトの名無しさん
2026/08/23(日) 18:01:33.96ID:HWzbbtqX >>673
なんとなくしかわからないならほんと勉強を基礎からひっしにやらないとまともなエンジニアのレベルに追いつかないぞ
それはお前自身のことだから百歩譲ってまかせるとしてだな
自分が無知なのに他人が悪いみたいなに絡むのはなぜじゃ
せいかくもくさっているのか?
なんとなくしかわからないならほんと勉強を基礎からひっしにやらないとまともなエンジニアのレベルに追いつかないぞ
それはお前自身のことだから百歩譲ってまかせるとしてだな
自分が無知なのに他人が悪いみたいなに絡むのはなぜじゃ
せいかくもくさっているのか?
675デフォルトの名無しさん
2026/08/23(日) 18:02:55.68ID:EWaz+NdE >>670
それは変数のextentだね
最初からそう言いなさい
C++20で導入された動的extentは別の意味
動的extentだと各自が脳内に思い浮かべることが異なることをようやく理解できたかな?
それは変数のextentだね
最初からそう言いなさい
C++20で導入された動的extentは別の意味
動的extentだと各自が脳内に思い浮かべることが異なることをようやく理解できたかな?
676デフォルトの名無しさん
2026/08/23(日) 18:03:08.49ID:HWzbbtqX いんすたんすにだって変数と同様にlife timがあるだろうに
馬鹿垂れが!
なんとなくとはなんだなんとなくとは
そんなんで開発してたら周りに迷惑かけるぞ
馬鹿垂れが!
なんとなくとはなんだなんとなくとは
そんなんで開発してたら周りに迷惑かけるぞ
677デフォルトの名無しさん
2026/08/23(日) 18:05:17.28ID:EWaz+NdE678デフォルトの名無しさん
2026/08/23(日) 18:06:42.18ID:HWzbbtqX >>675
>C++20で導入された動的extentは別の意味
あのなあ、変数やobjectのextentは、高水準言語が深化した
数十年前からあるプログラミングの基本概念なの
おまえがC++20について言っているような「特定の言語でのみ通用する用語」ではないの
>C++20で導入された動的extentは別の意味
あのなあ、変数やobjectのextentは、高水準言語が深化した
数十年前からあるプログラミングの基本概念なの
おまえがC++20について言っているような「特定の言語でのみ通用する用語」ではないの
679デフォルトの名無しさん
2026/08/23(日) 18:08:38.48ID:HWzbbtqX680デフォルトの名無しさん
2026/08/23(日) 18:10:26.18ID:HWzbbtqX >>679 誤記
× extentはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言
○ externはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言
自分がたまたま知っている擁護に、知らない概念を無理と対応付けないほうが良い
キミ、ソフトウエアに適正ないかも知れない
× extentはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言
○ externはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言
自分がたまたま知っている擁護に、知らない概念を無理と対応付けないほうが良い
キミ、ソフトウエアに適正ないかも知れない
681デフォルトの名無しさん
2026/08/23(日) 18:12:00.07ID:kSpVm1vf682デフォルトの名無しさん
2026/08/23(日) 18:12:03.63ID:HWzbbtqX オブジェクト信奉者って、こういうレベルの層が多いんだろうな
どうりでぐちゃぐちゃなコードが量産されるわけだ
どうりでぐちゃぐちゃなコードが量産されるわけだ
683デフォルトの名無しさん
2026/08/23(日) 18:13:38.09ID:kSpVm1vf684デフォルトの名無しさん
2026/08/23(日) 18:14:25.88ID:HWzbbtqX685デフォルトの名無しさん
2026/08/23(日) 18:15:21.58ID:/SMVVWF/ まあ、クラスなんてネームスペースだけあれば良いかったんだよね
686デフォルトの名無しさん
2026/08/23(日) 18:16:47.20ID:HWzbbtqX >>683 きみ、かわいそうなくらいど素人だね。
プログラミンのみならず、頭の回転も悪いみたいだし
ここでextern, extent, scope, static, global それぞれ何か長々説明しろっていうのか?
もう笑うしかない
子ども電話相談室じゃないぞw俺は
プログラミンのみならず、頭の回転も悪いみたいだし
ここでextern, extent, scope, static, global それぞれ何か長々説明しろっていうのか?
もう笑うしかない
子ども電話相談室じゃないぞw俺は
687デフォルトの名無しさん
2026/08/23(日) 18:16:52.87ID:aJFAwnCP 俺は理解できたよ
ID:HWzbbtqXは脳内に勝手な想定や限定や仮定が存在するがそれを言語化して他人に伝えることができない典型的なダメ人間であると
ID:HWzbbtqXは脳内に勝手な想定や限定や仮定が存在するがそれを言語化して他人に伝えることができない典型的なダメ人間であると
688デフォルトの名無しさん
2026/08/23(日) 18:18:01.59ID:HWzbbtqX689デフォルトの名無しさん
2026/08/23(日) 18:19:29.44ID:HWzbbtqX >>687
また変な人が出て来たw
また変な人が出て来たw
690デフォルトの名無しさん
2026/08/23(日) 18:19:36.72ID:aJFAwnCP691デフォルトの名無しさん
2026/08/23(日) 18:20:02.90ID:HWzbbtqX >>690
理解できなかっただけだろ
理解できなかっただけだろ
692デフォルトの名無しさん
2026/08/23(日) 18:20:26.21ID:/SMVVWF/693デフォルトの名無しさん
2026/08/23(日) 18:21:40.52ID:HWzbbtqX ひえー
ど素人たちに取り囲まれたw
ど素人たちに取り囲まれたw
694デフォルトの名無しさん
2026/08/23(日) 18:23:17.74ID:M+PVsTq+695デフォルトの名無しさん
2026/08/23(日) 18:28:26.49ID:H8lujsG7 複数の異なる意味がある用語を使ってしまうことはよくあること
それを指摘されたらこの意味だと説明することで会話や会議や商談が進む
今回のような逆ギレで暴れる人は嫌われる
それを指摘されたらこの意味だと説明することで会話や会議や商談が進む
今回のような逆ギレで暴れる人は嫌われる
696デフォルトの名無しさん
2026/08/23(日) 18:29:14.42ID:H8lujsG7 >>694
同感
同感
697デフォルトの名無しさん
2026/08/23(日) 18:31:33.29ID:HWzbbtqX >>695
extenの概念すら知らないで何でそんなに偉そうなの?
extenの概念すら知らないで何でそんなに偉そうなの?
698デフォルトの名無しさん
2026/08/23(日) 18:33:16.99ID:/SMVVWF/ 慌てず綴りくらいちゃんと書いて
699デフォルトの名無しさん
2026/08/23(日) 18:38:25.76ID:HWzbbtqX700デフォルトの名無しさん
2026/08/23(日) 18:46:38.55ID:/SMVVWF/ つか全く別の話だよね?
701デフォルトの名無しさん
2026/08/23(日) 18:47:53.90ID:+EvqEEFr extentは範囲や程度を意味する一般的な単語なのでプログラミング分野に限っても多様な意味で使われている
今回の「動的extent」も指摘があったようにC++では「動的な範囲」を持つこと意味する
つまり配列などの要素数が静的ではなく実行時に決まることを表している
今回の「動的extent」も指摘があったようにC++では「動的な範囲」を持つこと意味する
つまり配列などの要素数が静的ではなく実行時に決まることを表している
702デフォルトの名無しさん
2026/08/23(日) 18:49:09.14ID:HWzbbtqX703デフォルトの名無しさん
2026/08/23(日) 18:51:43.25ID:HWzbbtqX もう初歩からの質問があってもご遠慮したい
俺にとって発展性がない
俺にとって発展性がない
704デフォルトの名無しさん
2026/08/23(日) 18:52:47.67ID:/SMVVWF/ 時間と空間の違いって解釈したんだが
705デフォルトの名無しさん
2026/08/23(日) 18:53:31.71ID:+EvqEEFr ID:HWzbbtqX氏はextentを時間的な範囲つまり期間だけを指すと誤解していると思われる
706デフォルトの名無しさん
2026/08/23(日) 18:53:46.51ID:HWzbbtqX 「範囲や程度を意味する」って何よw
707デフォルトの名無しさん
2026/08/23(日) 18:55:42.10ID:HWzbbtqX708デフォルトの名無しさん
2026/08/23(日) 18:56:19.44ID:/SMVVWF/ グーグルAIの答えは
プログラム言語(プログラミング)における extent と scope は、どちらも変数やオブジェクトが「どこで、いつまで有効か」を扱いますが、概念が明確に分かれています。一言で言うと、scope は「場所(空間)」であり、extent は「時間(寿命)」です。
プログラム言語(プログラミング)における extent と scope は、どちらも変数やオブジェクトが「どこで、いつまで有効か」を扱いますが、概念が明確に分かれています。一言で言うと、scope は「場所(空間)」であり、extent は「時間(寿命)」です。
709デフォルトの名無しさん
2026/08/23(日) 18:56:22.27ID:HWzbbtqX 程度を意味する
…なんだろう
…なんだろう
710デフォルトの名無しさん
2026/08/23(日) 18:57:28.00ID:HWzbbtqX711デフォルトの名無しさん
2026/08/23(日) 18:59:22.70ID:HWzbbtqX 君らにお願いだけど、基礎的な概念については教科書やWEBや生成AIで勉強してから
議論に臨んでほしい
議論に臨んでほしい
712デフォルトの名無しさん
2026/08/23(日) 18:59:35.65ID:/SMVVWF/ で、scopeはプログラム書く時に静的に決めるけど、extentはそれこそ動的に決まるからコード上で静的に書くには別のやり方になるんじゃないの?
713デフォルトの名無しさん
2026/08/23(日) 19:00:03.42ID:VaEt5gsH ぶっちゃけ一部のお爺ちゃんしか知らない死語
分類法が微妙すぎて意味をなさなくなったんじゃねーのかな
分類法が微妙すぎて意味をなさなくなったんじゃねーのかな
714デフォルトの名無しさん
2026/08/23(日) 19:01:09.45ID:+EvqEEFr >>707
違う
extentは広さや範囲を意味する単語
時間の範囲を意味することもあるがそれは期間などの限定を添えなければ伝わらない
C++のdynamic extentは期間ではなく領域のサイズが実行時に決まること
違う
extentは広さや範囲を意味する単語
時間の範囲を意味することもあるがそれは期間などの限定を添えなければ伝わらない
C++のdynamic extentは期間ではなく領域のサイズが実行時に決まること
715デフォルトの名無しさん
2026/08/23(日) 19:01:17.90ID:HWzbbtqX716デフォルトの名無しさん
2026/08/23(日) 19:03:31.08ID:HWzbbtqX717デフォルトの名無しさん
2026/08/23(日) 19:03:36.23ID:/SMVVWF/ >>715
そんな答えじゃ誰も分からないんだけど?
そんな答えじゃ誰も分からないんだけど?
718デフォルトの名無しさん
2026/08/23(日) 19:05:39.03ID:/SMVVWF/ 概念が違う同士が平行線でw
719デフォルトの名無しさん
2026/08/23(日) 19:05:55.80ID:HWzbbtqX dynamic(allocation)&extent(control???)みたいな意味かね
どこぞに原点があるかもな しらんが
どこぞに原点があるかもな しらんが
720デフォルトの名無しさん
2026/08/23(日) 19:07:43.35ID:HWzbbtqX721デフォルトの名無しさん
2026/08/23(日) 19:08:39.59ID:/SMVVWF/ >>720
だから調べたけど、君と概念が違うんだけどw
だから調べたけど、君と概念が違うんだけどw
722デフォルトの名無しさん
2026/08/23(日) 19:09:32.49ID:GL/OuKQX723デフォルトの名無しさん
2026/08/23(日) 19:09:53.75ID:HWzbbtqX >>721 調べた結果得られた答えが これか
「scopeはプログラム書く時に静的に決めるけど、extentはそれこそ動的に決まるからコード上で静的に書くには別のやり方」
「scopeはプログラム書く時に静的に決めるけど、extentはそれこそ動的に決まるからコード上で静的に書くには別のやり方」
724デフォルトの名無しさん
2026/08/23(日) 19:10:54.08ID:HWzbbtqX >>722
googleでもいいいから基礎概念はまず調べて
googleでもいいいから基礎概念はまず調べて
725デフォルトの名無しさん
2026/08/23(日) 19:11:21.84ID:/SMVVWF/ >>723
コードを時系列に並べる書き方って確立かれてないから面倒だなぁってw
コードを時系列に並べる書き方って確立かれてないから面倒だなぁってw
726デフォルトの名無しさん
2026/08/23(日) 19:13:14.31ID:HWzbbtqX 日本語おk?
727デフォルトの名無しさん
2026/08/23(日) 19:15:01.58ID:/SMVVWF/ オブジェクトがある時間存在してるかどうかを保証する方法ってどう書くんだろ?
728デフォルトの名無しさん
2026/08/23(日) 19:17:12.81ID:/SMVVWF/ 先祖がヌルポと戦って来た歴史から未だに解決しない問題だよぉ
729デフォルトの名無しさん
2026/08/23(日) 19:26:03.06ID:s5u0XSsl extentの英語の意味は「広さ」「広がり」がベースで「範囲」「限度」「程度」を意味する単語だよ
そこに時間的な意味は含まれてない
むしろ空間的な意味が原義
だからプログラミング言語によっては時間的な意味では使われない普遍的な単語
そこに時間的な意味は含まれてない
むしろ空間的な意味が原義
だからプログラミング言語によっては時間的な意味では使われない普遍的な単語
730デフォルトの名無しさん
2026/08/23(日) 19:27:21.45ID:/SMVVWF/731デフォルトの名無しさん
2026/08/23(日) 19:29:47.73ID:HWzbbtqX ttps://nolongerset.com/scope-vs-extent-in-vba/
732デフォルトの名無しさん
2026/08/23(日) 19:30:28.92ID:HWzbbtqX ttps://www.lix.polytechnique.fr/~liberti/public/computing/prog/lisp/cltl/clm/node43.html
733デフォルトの名無しさん
2026/08/23(日) 19:31:32.62ID:HWzbbtqX もう、子ども電話相談室のオジサンとかコテ張るかw
しないけどw
しないけどw
734デフォルトの名無しさん
2026/08/23(日) 19:34:50.96ID:s5u0XSsl >>730
C++の場合
静的なextentは静的に広がりが決まる連続体のこと
動的なextentは動的に広がりか決まる連続体のこと
前者は具体的な要素数がコンパイル時に決まるので具体的な要素数を書く場所で
後者は具体的な要素数がコンパイル時に決まらないことを示すstd::dynamic_extentを使うんだよ
C++の場合
静的なextentは静的に広がりが決まる連続体のこと
動的なextentは動的に広がりか決まる連続体のこと
前者は具体的な要素数がコンパイル時に決まるので具体的な要素数を書く場所で
後者は具体的な要素数がコンパイル時に決まらないことを示すstd::dynamic_extentを使うんだよ
735デフォルトの名無しさん
2026/08/23(日) 19:38:42.12ID:HWzbbtqX 「広がり」っていう言葉が適しているのか?
736デフォルトの名無しさん
2026/08/23(日) 19:39:06.05ID:M+PVsTq+ 英単語としてのextentは程度・範囲という意味であり、プログラミング一般用語として、scopeと対置的に用いられる場合のextentは、名前束縛やオブジェクトの「寿命・ライフタイム」の意味で用いられるのが一般的。決して死語とかではなくて、今でも使われる重要な基本概念といえる。ここら辺までは一応共通理解といって良いと思う。
そこから進んで(ライフタイムの意味の)extentの分類として>>670で挙げられているような自動/動的/静的という三分法が、説明なしで通用するほど一般的な共通理解かというとちょっと疑わしくて、C言語的な感覚からはこの三分法はわかりやすいのだけど、たとえば>>663は三分法でいうところの自動extentの意味で、動的extentという語を用いているように見える。だから疑義が出たら説明の必要があるくらいの概念だと思うけどね。
この手の話でいうと、個人的にはスコープ(プログラムテキストの範囲)と名前空間(名前束縛の集合)の概念が混用されがちなのが気になることが多いかな。文脈でわかると言えば分かるんだけど。
そこから進んで(ライフタイムの意味の)extentの分類として>>670で挙げられているような自動/動的/静的という三分法が、説明なしで通用するほど一般的な共通理解かというとちょっと疑わしくて、C言語的な感覚からはこの三分法はわかりやすいのだけど、たとえば>>663は三分法でいうところの自動extentの意味で、動的extentという語を用いているように見える。だから疑義が出たら説明の必要があるくらいの概念だと思うけどね。
この手の話でいうと、個人的にはスコープ(プログラムテキストの範囲)と名前空間(名前束縛の集合)の概念が混用されがちなのが気になることが多いかな。文脈でわかると言えば分かるんだけど。
737デフォルトの名無しさん
2026/08/23(日) 19:39:17.56ID:/SMVVWF/ どのAIに聞いても
scopeは空間で、extentは時間(期間)
だって答えるよ
scopeは空間で、extentは時間(期間)
だって答えるよ
738デフォルトの名無しさん
2026/08/23(日) 19:40:21.35ID:HWzbbtqX C++ std::dynamic_extent 広がり 連続体 - Google 検索
ttps://www.google.com/search?q=C%2B%2B+std%3A%3Adynamic_extent+%E5%BA%83%E3%81%8C%E3%82%8A+%E9%80%A3%E7%B6%9A%E4%BD%93&hl=ja
「広がり」 「連続体」 検索で見当らないが
造語?
ttps://www.google.com/search?q=C%2B%2B+std%3A%3Adynamic_extent+%E5%BA%83%E3%81%8C%E3%82%8A+%E9%80%A3%E7%B6%9A%E4%BD%93&hl=ja
「広がり」 「連続体」 検索で見当らないが
造語?
739デフォルトの名無しさん
2026/08/23(日) 19:41:42.55ID:vGPmWGdI lifetimeでええやん
740デフォルトの名無しさん
2026/08/23(日) 19:41:52.22ID:HWzbbtqX741デフォルトの名無しさん
2026/08/23(日) 19:42:00.06ID:/SMVVWF/ 静的extentってもプログラムの生存期間とイコールなだけだよなぁ
742デフォルトの名無しさん
2026/08/23(日) 19:44:03.25ID:HWzbbtqX743デフォルトの名無しさん
2026/08/23(日) 19:45:42.76ID:HWzbbtqX744デフォルトの名無しさん
2026/08/23(日) 19:50:31.78ID:LyvdCiRX 四種類あります
【Static lifetime】
プログラム開始から終了まで存在する。
静的変数やグローバル変数が該当。
メモリはプログラムのロード時に確保され、終了時に解放される。
例(C言語):
static int counter = 0; // プログラム全体で生存
【Automatic lifetime】
関数やブロックの実行中だけ存在する。
ローカル変数(スタック上に確保される)が該当。
関数終了時に自動的に解放される。
例(C言語):
void func() {
int x = 10; // 関数終了と同時に消える
}
【Dynamic lifetime】
実行時に明示的に確保し、明示的に解放するまで存在する。
ヒープ領域を使う動的メモリ確保が該当。
例(C言語):
int *p = malloc(sizeof(int)); // 確保
*p = 42;
free(p); // 解放
【Temporary lifetime】
式の評価中だけ存在する一時オブジェクト。
C++ 等の一時オブジェクトや、関数の戻り値として生成される値など。
例(C++):
std::string s = std::string("Hello") + " World"; // 加算結果は一時オブジェクト
【Static lifetime】
プログラム開始から終了まで存在する。
静的変数やグローバル変数が該当。
メモリはプログラムのロード時に確保され、終了時に解放される。
例(C言語):
static int counter = 0; // プログラム全体で生存
【Automatic lifetime】
関数やブロックの実行中だけ存在する。
ローカル変数(スタック上に確保される)が該当。
関数終了時に自動的に解放される。
例(C言語):
void func() {
int x = 10; // 関数終了と同時に消える
}
【Dynamic lifetime】
実行時に明示的に確保し、明示的に解放するまで存在する。
ヒープ領域を使う動的メモリ確保が該当。
例(C言語):
int *p = malloc(sizeof(int)); // 確保
*p = 42;
free(p); // 解放
【Temporary lifetime】
式の評価中だけ存在する一時オブジェクト。
C++ 等の一時オブジェクトや、関数の戻り値として生成される値など。
例(C++):
std::string s = std::string("Hello") + " World"; // 加算結果は一時オブジェクト
745デフォルトの名無しさん
2026/08/23(日) 20:01:56.91ID:HWzbbtqX >>744
その分類では、C,C+の演算過程の値や関数の戻り値を第4のTemporary lifetimeとして分類しているけど
それらは通常CPUレジスタ上に割付けられる。
構造体を返す関数の戻り値は、言語処理系の設計ポリシーにより何種類かあるが
・レジスターにのせて返せるものはレジスターで返す
・callee側に隠れ静的領域を確保しておいてそこに構造体戻り値を格納しポインターをかえす(再帰呼び出し不可)
・caller側の変数領域に隠れ領域を確保しておいてそのpoinerをcaller - callee間の隠れ引数でやり取りする
など、
したがって、バイナリレベルで厳密に見ると、演算過程の値や関数の戻り値は
ちょっと違ったextentをもつともいえる
その分類では、C,C+の演算過程の値や関数の戻り値を第4のTemporary lifetimeとして分類しているけど
それらは通常CPUレジスタ上に割付けられる。
構造体を返す関数の戻り値は、言語処理系の設計ポリシーにより何種類かあるが
・レジスターにのせて返せるものはレジスターで返す
・callee側に隠れ静的領域を確保しておいてそこに構造体戻り値を格納しポインターをかえす(再帰呼び出し不可)
・caller側の変数領域に隠れ領域を確保しておいてそのpoinerをcaller - callee間の隠れ引数でやり取りする
など、
したがって、バイナリレベルで厳密に見ると、演算過程の値や関数の戻り値は
ちょっと違ったextentをもつともいえる
746デフォルトの名無しさん
2026/08/23(日) 20:03:31.84ID:HWzbbtqX まあいいやこういう議論ができる椰子を5chですっかり見かけなくなったな
最近は素人バッカで寂しいことだ
最近は素人バッカで寂しいことだ
747デフォルトの名無しさん
2026/08/23(日) 20:08:24.38ID:LEbYCREd748デフォルトの名無しさん
2026/08/23(日) 20:10:03.03ID:HWzbbtqX749デフォルトの名無しさん
2026/08/23(日) 20:10:42.58ID:/SMVVWF/ で、そのそれぞれのextentを安全に扱える事を保証する書き方ってあるの?
ってのが>>712
ってのが>>712
750デフォルトの名無しさん
2026/08/23(日) 20:12:21.25ID:HWzbbtqX そりゃまた全然別の話だな
安全に扱える事の保証まで話を飛ばした覚えはないぞ
安全に扱える事の保証まで話を飛ばした覚えはないぞ
751デフォルトの名無しさん
2026/08/23(日) 20:17:01.44ID:nqebcotO >>749
Rustのlifetimeの概念は存在する場所を指す参照の有効性まで保証するためメモリ安全性まで保証される
Rustのlifetimeの概念は存在する場所を指す参照の有効性まで保証するためメモリ安全性まで保証される
752デフォルトの名無しさん
2026/08/23(日) 20:19:52.55ID:/SMVVWF/753デフォルトの名無しさん
2026/08/23(日) 20:29:57.00ID:/SMVVWF/ Rustはオブジェクト指向言語じゃ無いとか言ってるけど、全然オブジェクト指向じゃん
なんだよ騙されたわ
なんだよ騙されたわ
754デフォルトの名無しさん
2026/08/23(日) 20:43:32.46ID:bYMp4j3g >>753
何を勘違いしてる?
Rustは公式にオブジェクト指向プログラミングを名乗りサポートしている言語
Rust公式本 第18章
Object-Oriented Programming Features
https://doc.rust-lang.org/book/ch18-00-oop.html
何を勘違いしてる?
Rustは公式にオブジェクト指向プログラミングを名乗りサポートしている言語
Rust公式本 第18章
Object-Oriented Programming Features
https://doc.rust-lang.org/book/ch18-00-oop.html
755デフォルトの名無しさん
2026/08/23(日) 21:07:13.20ID:8BxqUOBF756デフォルトの名無しさん
2026/08/23(日) 21:37:34.30ID:QvCbW4h1 マルチパラダイム言語だよ
757デフォルトの名無しさん
2026/08/23(日) 22:28:26.34ID:ZAzIf/3C 多くの言語がマルチパラダイムなので機能的に備えているかどうかの話になる
Rustはオブジェクト指向プログラミングや関数型プログラミングなど多数に分類されている
Rustはオブジェクト指向プログラミングや関数型プログラミングなど多数に分類されている
758デフォルトの名無しさん
2026/08/23(日) 22:50:38.05ID:RAuysaEg759デフォルトの名無しさん
2026/08/23(日) 22:54:24.86ID:FmydbG/s で結局>>656の「動的インスタンス(動的extent)」のくだりは何が言いたかったわけ?
動的なインスタンスじゃなく静的なインスタンスならプログラムを表すモデルとして適していたということなの?
動的なインスタンスじゃなく静的なインスタンスならプログラムを表すモデルとして適していたということなの?
760デフォルトの名無しさん
2026/08/23(日) 23:28:35.98ID:pEBnUgcx 静的なインスタンスって何?
コンパイル時点でインスタンスを生成すること?
コンパイル時点でインスタンスを生成すること?
761デフォルトの名無しさん
2026/08/23(日) 23:49:43.23ID:FmydbG/s762デフォルトの名無しさん
2026/08/24(月) 00:01:55.87ID:fk+XdLZ4763デフォルトの名無しさん
2026/08/24(月) 00:25:28.72ID:7vbS4728764デフォルトの名無しさん
2026/08/24(月) 00:26:58.71ID:7vbS4728 失礼、630じゃなくて>>663だね。
765デフォルトの名無しさん
2026/08/24(月) 00:33:36.60ID:XdmkfJiJ766デフォルトの名無しさん
2026/08/24(月) 01:13:41.24ID:7vbS4728767デフォルトの名無しさん
2026/08/24(月) 01:35:33.81ID:YY0Bkc3V >>670
>エクステントの種類
>静的エクステント(Static):プログラムの開始から終了までずっとメモリに存在します。
>自動エクステント(Automatic):関数やブロックの実行が始まった時に作られ、終わると消えます。
>動的エクステント(Dynamic):プログラムの実行中に明示的な割り当てと解放を行って管理します。
>エクステントの種類
>静的エクステント(Static):プログラムの開始から終了までずっとメモリに存在します。
>自動エクステント(Automatic):関数やブロックの実行が始まった時に作られ、終わると消えます。
>動的エクステント(Dynamic):プログラムの実行中に明示的な割り当てと解放を行って管理します。
768デフォルトの名無しさん
2026/08/24(月) 01:35:52.80ID:Oc4AU0Vk769デフォルトの名無しさん
2026/08/24(月) 01:37:01.20ID:Oc4AU0Vk >>767
エクステントにそんな意味はない
エクステントにそんな意味はない
770デフォルトの名無しさん
2026/08/24(月) 01:44:46.87ID:YY0Bkc3V ttps://en.wikipedia.org/wiki/Scope_(computer_programming)
ttps://prl.khoury.northeastern.edu/blog/2019/09/05/lexical-and-dynamic-scope/
ttps://prl.khoury.northeastern.edu/blog/2019/09/05/lexical-and-dynamic-scope/
771デフォルトの名無しさん
2026/08/24(月) 01:48:27.94ID:YY0Bkc3V 自分が知らないことだからと言って
この世にそんなことは存在しないというのは
無知の知にすら至っていないということ
この世にそんなことは存在しないというのは
無知の知にすら至っていないということ
772デフォルトの名無しさん
2026/08/24(月) 01:48:54.26ID:HGyeQfyA extentは方言なのよ
もちろん公式にはlifetime
ISO/IEC 9899:2017. p.30
"The lifetime of an object is the portion of program execution during which storage is guaranteed to be reserved for it."
もちろん公式にはlifetime
ISO/IEC 9899:2017. p.30
"The lifetime of an object is the portion of program execution during which storage is guaranteed to be reserved for it."
773デフォルトの名無しさん
2026/08/24(月) 01:50:09.37ID:YY0Bkc3V おっと、「無知の知」が何のことか知らないかもしれないが
774デフォルトの名無しさん
2026/08/24(月) 01:52:28.36ID:YY0Bkc3V >>772 それに
extent is a diarect of lifetime とか書いてあった?
extent is a diarect of lifetime とか書いてあった?
775デフォルトの名無しさん
2026/08/24(月) 01:53:40.31ID:tjHHW3WH C/C++ではlifetimeおよびstoragedurationが正式用語だな
ISO/IEC 9899、JIS X 3010「プログラム言語C」
ISO/IEC 14882、JIS X 3014「プログラム言語C++」
オブジェクトは,その生存期間を決定する記憶域期間(storageduration)をもつ。
記憶域期間は,静的記憶域期間,自動記憶域期間,及び割付け記憶域期間の3種類とする。
オブジェクトの生存期間(lifetime)とは,オブジェクトに対して記憶域の確保が保証されている,プログラム実行の一部分をいう。
オブジェクトは,生存期間を通じて存在し,一定のアドレスをもち,最後に格納された値を保持する。
ISO/IEC 9899、JIS X 3010「プログラム言語C」
ISO/IEC 14882、JIS X 3014「プログラム言語C++」
オブジェクトは,その生存期間を決定する記憶域期間(storageduration)をもつ。
記憶域期間は,静的記憶域期間,自動記憶域期間,及び割付け記憶域期間の3種類とする。
オブジェクトの生存期間(lifetime)とは,オブジェクトに対して記憶域の確保が保証されている,プログラム実行の一部分をいう。
オブジェクトは,生存期間を通じて存在し,一定のアドレスをもち,最後に格納された値を保持する。
776デフォルトの名無しさん
2026/08/24(月) 01:54:55.54ID:tjHHW3WH C#でもいずれもlifetime
ECMA-334 "C# Language Specification"
JIS X 3015「プログラム言語C#」
Microsoft Docs
ECMA-334 "C# Language Specification"
JIS X 3015「プログラム言語C#」
Microsoft Docs
777デフォルトの名無しさん
2026/08/24(月) 01:56:14.03ID:YY0Bkc3V778デフォルトの名無しさん
2026/08/24(月) 01:59:02.21ID:YY0Bkc3V こんなところにも書いてあった、きょうまで知らなんだ
ttps://www.cqpub.co.jp/try/kijidb/yougo/san.htm
ttps://www.cqpub.co.jp/try/kijidb/yougo/san.htm
779デフォルトの名無しさん
2026/08/24(月) 02:01:08.78ID:+DQpda2q780デフォルトの名無しさん
2026/08/24(月) 02:01:12.92ID:YY0Bkc3V 知らないんだよ。それをないない言ってんだよ
アホだから
アホだから
781デフォルトの名無しさん
2026/08/24(月) 02:03:29.13ID:YY0Bkc3V 知らないのは、まあしょうがない
知らないことを、無いことだと決めつけるのは、いわゆるバカ
知らないことを、無いことだと決めつけるのは、いわゆるバカ
782デフォルトの名無しさん
2026/08/24(月) 02:03:29.42ID:+DQpda2q ID:YY0Bkc3Vがextentの公式ソースを出せればまだ逆転のチャンスもある
現状では公式はlifetimeが示されてる
現状では公式はlifetimeが示されてる
783デフォルトの名無しさん
2026/08/24(月) 02:05:27.53ID:YY0Bkc3V784デフォルトの名無しさん
2026/08/24(月) 02:07:42.66ID:PTJtZFr3 どうやら分かったぞ
変数extentはLispの方言らしい
他ではlifetime
だからISOやJISなど公式はlifetimeになってるとのこと
変数extentはLispの方言らしい
他ではlifetime
だからISOやJISなど公式はlifetimeになってるとのこと
785デフォルトの名無しさん
2026/08/24(月) 02:09:52.22ID:YY0Bkc3V C、C++、C# などの言語で、extent も life timeもしばしな使われる
しかしどっちが公式用語だと定義した公式文章は
目にしたことはない
それを知らない人が「extentと言わない」と言っているだけ
以上だ
しかしどっちが公式用語だと定義した公式文章は
目にしたことはない
それを知らない人が「extentと言わない」と言っているだけ
以上だ
786デフォルトの名無しさん
2026/08/24(月) 02:11:38.13ID:PTJtZFr3 >>785
既に公式ソースでlifetimeと示されてるのだからあきらめなされ
既に公式ソースでlifetimeと示されてるのだからあきらめなされ
787デフォルトの名無しさん
2026/08/24(月) 02:12:21.93ID:YY0Bkc3V 変数のextentはLispの方言か? - Google 検索
https://www.google.com/search?q=%E5%A4%89%E6%95%B0%E3%81%AEextent%E3%81%AFLisp%E3%81%AE%E6%96%B9%E8%A8%80%E3%81%8B%EF%BC%9F&hl=ja&source=hp
違います。変数のエクステント(extent)は、Lispの方言ではなく、プログラミング言語一般で使われる「変数の生存期間(メモリ上に存在し続ける時間)」を表す専門用語です。 [1, 2]
多くの場合、空間的な有効範囲である「スコープ(scope)」と対比して使われます。 [3, 4]
## スコープとエクステントの違い
* スコープ (Scope): 変数名がコード内のどこから見える(アクセスできる)かという空間的な範囲(有効範囲)
* エクステント (Extent): 変数がメモリ上で存在し続ける(値が保持される)時間的な長さ(生存期間/ライフタイム) [1, 2, 4, 5]
## 主なエクステントの種類
* 動的エクステント (Dynamic extent): その束縛を作ったフォームや関数を実行している期間だけ存在するもの
* 実質的無限エクステント (Indefinite extent): 関数を抜けた後も、データが参照され続ける限りメモリに残り続けるもの(クロージャなど) [5, 6, 7]
Lisp(特に[Common Lisp](https://ja.wikipedia.org/wiki/Common_Lisp)など)の仕様書(ANSI Common Lispなど)で「スコープとエクステント」が明確に定義されて詳細に解説されているため、Lisp特有の概念のように誤解されやすいですが、元々は計算機科学の一般的な用語です。 [5, 8]
より詳しく知りたい内容はありますか?
* Common Lispでの厳密な定義と解説
* 他の言語(CやPythonなど)での生存期間との比較
知りたいアプローチを選んで教えてください。
(リンク略)
https://www.google.com/search?q=%E5%A4%89%E6%95%B0%E3%81%AEextent%E3%81%AFLisp%E3%81%AE%E6%96%B9%E8%A8%80%E3%81%8B%EF%BC%9F&hl=ja&source=hp
違います。変数のエクステント(extent)は、Lispの方言ではなく、プログラミング言語一般で使われる「変数の生存期間(メモリ上に存在し続ける時間)」を表す専門用語です。 [1, 2]
多くの場合、空間的な有効範囲である「スコープ(scope)」と対比して使われます。 [3, 4]
## スコープとエクステントの違い
* スコープ (Scope): 変数名がコード内のどこから見える(アクセスできる)かという空間的な範囲(有効範囲)
* エクステント (Extent): 変数がメモリ上で存在し続ける(値が保持される)時間的な長さ(生存期間/ライフタイム) [1, 2, 4, 5]
## 主なエクステントの種類
* 動的エクステント (Dynamic extent): その束縛を作ったフォームや関数を実行している期間だけ存在するもの
* 実質的無限エクステント (Indefinite extent): 関数を抜けた後も、データが参照され続ける限りメモリに残り続けるもの(クロージャなど) [5, 6, 7]
Lisp(特に[Common Lisp](https://ja.wikipedia.org/wiki/Common_Lisp)など)の仕様書(ANSI Common Lispなど)で「スコープとエクステント」が明確に定義されて詳細に解説されているため、Lisp特有の概念のように誤解されやすいですが、元々は計算機科学の一般的な用語です。 [5, 8]
より詳しく知りたい内容はありますか?
* Common Lispでの厳密な定義と解説
* 他の言語(CやPythonなど)での生存期間との比較
知りたいアプローチを選んで教えてください。
(リンク略)
788デフォルトの名無しさん
2026/08/24(月) 02:13:29.60ID:YY0Bkc3V せめてさ、無知の知にくらい至れよ
そうじゃないとサル以下の知性だぞ
そうじゃないとサル以下の知性だぞ
789デフォルトの名無しさん
2026/08/24(月) 02:14:26.30ID:YY0Bkc3V 自分がサル以下の知性だと示すのに
何でこんなにレスを長引かせるかな
何でこんなにレスを長引かせるかな
790デフォルトの名無しさん
2026/08/24(月) 02:14:44.27ID:PTJtZFr3791デフォルトの名無しさん
2026/08/24(月) 02:17:51.26ID:44BTsNfK 少なくともC++で動的extentと言ったら配列などの要素数が実行時に決まること
std::dynamic_extentとして公式に定義されてます
std::dynamic_extentとして公式に定義されてます
792デフォルトの名無しさん
2026/08/24(月) 02:18:35.16ID:YY0Bkc3V793デフォルトの名無しさん
2026/08/24(月) 02:19:33.13ID:YY0Bkc3V >>791
あれは名前で誤解を受ける人が多いと今回思った
あれは名前で誤解を受ける人が多いと今回思った
794デフォルトの名無しさん
2026/08/24(月) 02:21:01.31ID:YY0Bkc3V 何であんな名前にしたんだろう
由緒を知らん
由緒を知らん
795デフォルトの名無しさん
2026/08/24(月) 02:21:38.07ID:KXRsacg9 CもC++も規格で決まっていてISO/IECとJISになってるよ
もちろん公式にlifetime
もちろん公式にlifetime
796デフォルトの名無しさん
2026/08/24(月) 02:25:25.15ID:caAmipCZ extentに生存期間の意味はないため
lifetimeが公式になってるようだな
lifetimeが公式になってるようだな
797デフォルトの名無しさん
2026/08/24(月) 02:32:03.86ID:YY0Bkc3V c++のそれらの企画書では時間的な長さ(生存期間)をlifetimeまたはstorage durationとよび
std::dynamic_extent は空間的なサイズ(要素数)に用いて使い分けているな
C言語の標準規格(ISO/IEC 9899)においては、配列のサイズを extent とは呼んでいないようだな
std::dynamic_extent は空間的なサイズ(要素数)に用いて使い分けているな
C言語の標準規格(ISO/IEC 9899)においては、配列のサイズを extent とは呼んでいないようだな
798デフォルトの名無しさん
2026/08/24(月) 02:32:52.68ID:YY0Bkc3V799デフォルトの名無しさん
2026/08/24(月) 02:34:08.35ID:RtsQfhBt800デフォルトの名無しさん
2026/08/24(月) 02:39:28.95ID:RtsQfhBt 英英辞典で調べてもextentに生存期間の意味はない
lengthやsizeの意味はある
だからC++のstd::dynamic_extentが配列などの長さやサイズの意味で用いてることは正しい
つまり動的extentは動的サイズ
lengthやsizeの意味はある
だからC++のstd::dynamic_extentが配列などの長さやサイズの意味で用いてることは正しい
つまり動的extentは動的サイズ
801デフォルトの名無しさん
2026/08/24(月) 02:41:42.77ID:YY0Bkc3V 英英辞典には載っていないだろうなw
802デフォルトの名無しさん
2026/08/24(月) 02:53:04.24ID:RtsQfhBt C/C++/C#の規格書はlifetimeなんだな
あとは規格や公式でextentを用いるプログラミング言語があるのかどうか
あとは規格や公式でextentを用いるプログラミング言語があるのかどうか
803デフォルトの名無しさん
2026/08/24(月) 02:59:57.04ID:RtsQfhBt Rustは規格書がないようだが公式でlifetimeと言ってるな
804デフォルトの名無しさん
2026/08/24(月) 03:12:48.44ID:YY0Bkc3V C++では、C++11以降の標準ライブラリや、C++20/C++23で追加された新しい機能において、
配列などの「(各次元の)要素数、あるいはデータの広がり(長さ)」を指す用語として extent という言葉を使っている。
とのことだ
なお、Cで配列などの空間サイズにextentというコトバを使うことはない
配列などの「(各次元の)要素数、あるいはデータの広がり(長さ)」を指す用語として extent という言葉を使っている。
とのことだ
なお、Cで配列などの空間サイズにextentというコトバを使うことはない
805デフォルトの名無しさん
2026/08/24(月) 03:27:00.00ID:BSEHZD2k なるほど
変数などの生存期間はlifetimeと呼んだほうが良いわけか
変数などの生存期間はlifetimeと呼んだほうが良いわけか
806デフォルトの名無しさん
2026/08/24(月) 03:29:17.82ID:YY0Bkc3V807デフォルトの名無しさん
2026/08/24(月) 03:34:14.48ID:YY0Bkc3V 時価だ空間だ書いているとまた場の理論のおじさんが
妄想を爆発させそうだなw
妄想を爆発させそうだなw
808デフォルトの名無しさん
2026/08/24(月) 03:48:54.71ID:BSEHZD2k >>806
使い分けはその通り
経緯は先にCの標準規格書としてlifetimeの用語が定まった
C++も同じく標準規格書としてlifetimeの用語が定まった
後にC++20の時にdynamic extentを動的なサイズの意味で配列などの要素数に用いた
std::dynamic_extent
使い分けはその通り
経緯は先にCの標準規格書としてlifetimeの用語が定まった
C++も同じく標準規格書としてlifetimeの用語が定まった
後にC++20の時にdynamic extentを動的なサイズの意味で配列などの要素数に用いた
std::dynamic_extent
809デフォルトの名無しさん
2026/08/24(月) 03:51:14.54ID:YY0Bkc3V >>808
サイズ面でextentをつかうよになったのは割と新しめのC++か
サイズ面でextentをつかうよになったのは割と新しめのC++か
810デフォルトの名無しさん
2026/08/24(月) 03:57:58.68ID:YY0Bkc3V 結局話の発端の
>659
>動的extentって何だ?
>例えばC++のdynamic_extentはオプション指向と関係ないように
>概念を話すときに特定の言語でのみ通用する用語は使わないでほしい
とは何だったのか。
>659
>動的extentって何だ?
>例えばC++のdynamic_extentはオプション指向と関係ないように
>概念を話すときに特定の言語でのみ通用する用語は使わないでほしい
とは何だったのか。
811デフォルトの名無しさん
2026/08/24(月) 04:00:23.52ID:YY0Bkc3V 相手する値打ちの無い輩だったということか…
812デフォルトの名無しさん
2026/08/24(月) 04:18:02.26ID:/7yyHiO5 なぜC++で空間サイズに関してextentが使われるようになったか大体分かった
--
C++の標準ライブラリでは、配列のサイズや広がりを表現するために extent(複数形は extents)という言葉が使われるようになりました。
* std::extent (C++11〜)
* 配列型の「指定した次元の要素数(サイズ)」をコンパイル時に取得するための機能です。
* 例えば int arr[3][5]; に対座して、std::extent_v<decltype(arr), 1> とすると、2次元目の広がりである 5 が取得できます。 [2, 3]
* std::span (C++20〜)
* 連続したメモリ(配列や std::vector など)を指し示す軽量な覗き窓(ビュー)です。
* このクラスのテンプレート引数やメンバ定数として、要素数を表す extent が定義されています。ここで要素数が実行時になるものを std::dynamic_extent と呼びます。 [4, 5]
* std::mdspan / std::extents (C++23〜)
* 多次元配列を扱うための機能です。
* C++23からは、多次元配列の「次元の数」を rank、「各次元の要素数(サイズ・広がり)」を extent と明確に呼び分け、それを管理する std::extents というクラスも登場しました。 [1, 6, 7]
## 2. なぜ size や length ではなく extent なのか?
C++において size() や length() は、コンテナにある「すべての要素の総数(合計カウント)」を返すものとして長年使われてきました。 [8]
しかし、多次元配列(例えば、縦3 × 横5 の行列)を扱うようになると、以下のような混乱が生じます。
* 「この行列の size は?」と言われたとき、全体の個数である 15 なのか、縦の長さ 3 なのか、横の長さ 5 なのか区別がつきにくい。
そのため、近代C++では以下のように言葉を使い分けるようになりました。
* rank(階数・次元数): 配列が「何次元」あるか(例: 2次元配列なら 2)。
* extent(境界・広がり): 各次元における「要素の長さ・サイズ」(例: 1次元目の extent は 3、2次元目の extent は 5)。
* size(総サイズ): すべての次元の extent を掛け合わせた「全要素の総数」(例: $3 \times 5 = 15$)。 [1, 6, 7]
## 結論
C++では、配列の「要素の数」や「各次元のサイズ」といった空間的な広がりを公式に extent と呼びます。 [1, 2]
--
C++の標準ライブラリでは、配列のサイズや広がりを表現するために extent(複数形は extents)という言葉が使われるようになりました。
* std::extent (C++11〜)
* 配列型の「指定した次元の要素数(サイズ)」をコンパイル時に取得するための機能です。
* 例えば int arr[3][5]; に対座して、std::extent_v<decltype(arr), 1> とすると、2次元目の広がりである 5 が取得できます。 [2, 3]
* std::span (C++20〜)
* 連続したメモリ(配列や std::vector など)を指し示す軽量な覗き窓(ビュー)です。
* このクラスのテンプレート引数やメンバ定数として、要素数を表す extent が定義されています。ここで要素数が実行時になるものを std::dynamic_extent と呼びます。 [4, 5]
* std::mdspan / std::extents (C++23〜)
* 多次元配列を扱うための機能です。
* C++23からは、多次元配列の「次元の数」を rank、「各次元の要素数(サイズ・広がり)」を extent と明確に呼び分け、それを管理する std::extents というクラスも登場しました。 [1, 6, 7]
## 2. なぜ size や length ではなく extent なのか?
C++において size() や length() は、コンテナにある「すべての要素の総数(合計カウント)」を返すものとして長年使われてきました。 [8]
しかし、多次元配列(例えば、縦3 × 横5 の行列)を扱うようになると、以下のような混乱が生じます。
* 「この行列の size は?」と言われたとき、全体の個数である 15 なのか、縦の長さ 3 なのか、横の長さ 5 なのか区別がつきにくい。
そのため、近代C++では以下のように言葉を使い分けるようになりました。
* rank(階数・次元数): 配列が「何次元」あるか(例: 2次元配列なら 2)。
* extent(境界・広がり): 各次元における「要素の長さ・サイズ」(例: 1次元目の extent は 3、2次元目の extent は 5)。
* size(総サイズ): すべての次元の extent を掛け合わせた「全要素の総数」(例: $3 \times 5 = 15$)。 [1, 6, 7]
## 結論
C++では、配列の「要素の数」や「各次元のサイズ」といった空間的な広がりを公式に extent と呼びます。 [1, 2]
813デフォルトの名無しさん
2026/08/24(月) 04:21:28.45ID:8dfHuOfg extentはLisp用語
空間的なscopeと対比することでextentを時間的な意味でLisp用語にした
本来のextentは時間的ではなく一般的な範囲を示す
Lisp用語としてのみextentが生存期間の意味で使われている
それがLisperによって広まった
一方でC/C++など他の言語から見ると
Lisp用語extentは相応しい用語に見えない
わかりやすいlifetimeが採用された
それでもLisp用語extentを使う人が一部残った
一方でC++はextentを本来の意味で使うことにした
std::dynamic_extentはその本来の意味に沿っている
空間的なscopeと対比することでextentを時間的な意味でLisp用語にした
本来のextentは時間的ではなく一般的な範囲を示す
Lisp用語としてのみextentが生存期間の意味で使われている
それがLisperによって広まった
一方でC/C++など他の言語から見ると
Lisp用語extentは相応しい用語に見えない
わかりやすいlifetimeが採用された
それでもLisp用語extentを使う人が一部残った
一方でC++はextentを本来の意味で使うことにした
std::dynamic_extentはその本来の意味に沿っている
814デフォルトの名無しさん
2026/08/24(月) 04:24:18.55ID:/7yyHiO5815デフォルトの名無しさん
2026/08/24(月) 04:25:13.82ID:/7yyHiO5816デフォルトの名無しさん
2026/08/24(月) 04:33:06.49ID:/7yyHiO5 そんな、必死で検索して探さなくていいよ
もう寝なよ
もう寝なよ
817デフォルトの名無しさん
2026/08/24(月) 06:26:02.29ID:CNRXA6iN >>744を使えばもめることも誤解されることもなくて平和だよん
818デフォルトの名無しさん
2026/08/24(月) 07:54:25.67ID:0OmhbSEr extentを時間的要素に用いるのはかなり一般的じゃ無いって事でOK
819デフォルトの名無しさん
2026/08/24(月) 08:32:51.10ID:m7Qyi1DS オブジェクト指向でプログラム書いてるけどエクステントの言葉は知らなかった
スコープから外れたオブジェクトはいずれGCされるとだけ思ってプログラム書いてるしそれで問題ない
エクステントを意識して書かれたプログラムは何かが良くなるとかそういうのは別にないんでしょ
プログラムの動作を説明するときに役立ちそうではあるけどね
スコープから外れたオブジェクトはいずれGCされるとだけ思ってプログラム書いてるしそれで問題ない
エクステントを意識して書かれたプログラムは何かが良くなるとかそういうのは別にないんでしょ
プログラムの動作を説明するときに役立ちそうではあるけどね
820デフォルトの名無しさん
2026/08/24(月) 08:41:35.36ID:0OmhbSEr821デフォルトの名無しさん
2026/08/24(月) 09:09:17.26ID:m7Qyi1DS マネージドヒープで管理できないものはあるからね
ネイティブメモリはローンパターンとかリソースモナドっぽいものを拵えて管理してるわ
ネイティブメモリはローンパターンとかリソースモナドっぽいものを拵えて管理してるわ
822デフォルトの名無しさん
2026/08/24(月) 09:09:45.80ID:++uoiV4H 誰も真のオブジェクト指向でプログラムできないからねぇ
それっぽい機能使ってるけどforループで回して手続き型プログラムやってる
関数や配列の強化版としてしか使えていない
それっぽい機能使ってるけどforループで回して手続き型プログラムやってる
関数や配列の強化版としてしか使えていない
823デフォルトの名無しさん
2026/08/24(月) 09:25:33.80ID:m7Qyi1DS >>822
誰もできないなら真のオブジェクト指向があると考えてる人がバカなんじゃないの? 違うの?
誰もできないなら真のオブジェクト指向があると考えてる人がバカなんじゃないの? 違うの?
824デフォルトの名無しさん
2026/08/24(月) 10:06:50.63ID:9H+y+Lt4 CのlifetimeとLispのextentとRustのlifetimeは
何かしらの生存期間/有効期間を表現しているという意味では同じだけど
肝心の「何かしら」の中身が違うので同じものとして取り扱わないほうがいい
何かしらの生存期間/有効期間を表現しているという意味では同じだけど
肝心の「何かしら」の中身が違うので同じものとして取り扱わないほうがいい
825デフォルトの名無しさん
2026/08/24(月) 10:45:45.63ID:W8icJp64826デフォルトの名無しさん
2026/08/24(月) 10:56:41.85ID:0OmhbSEr >>822
真のオブジェクト指向でプログラム出来ないとかw
道具を道具として使えない奴の言い訳にしか聞こえないなw
んなもん道具なんだから頭でウジウジ考えて真のオブジェクト指向目指すより
テキトーに道具として使った方が勝ちだ
真のオブジェクト指向でプログラム出来ないとかw
道具を道具として使えない奴の言い訳にしか聞こえないなw
んなもん道具なんだから頭でウジウジ考えて真のオブジェクト指向目指すより
テキトーに道具として使った方が勝ちだ
827デフォルトの名無しさん
2026/08/24(月) 11:22:03.68ID:++uoiV4H つまり用途がないんだよオブジェクト指向にはな
世の中の実業に求められてるのは手続き型プログラムってことよ
世の中の実業に求められてるのは手続き型プログラムってことよ
828デフォルトの名無しさん
2026/08/24(月) 11:30:53.67ID:0OmhbSEr 機能分割くらいに考えて使えればいいんだよ
グダグダ屁理屈並べてああでもないこうでもないで何日も時間潰しても
結局最後は設計が悪かったになるんだからw
グダグダ屁理屈並べてああでもないこうでもないで何日も時間潰しても
結局最後は設計が悪かったになるんだからw
829デフォルトの名無しさん
2026/08/24(月) 11:34:05.39ID:m7Qyi1DS 手続き型とオブジェクト指向は地続きなものだしなあ
手続き型でプログラム書いて必要になったときにオブジェクト指向でまとめるくらいでちょうど良い
手続き型でプログラム書いて必要になったときにオブジェクト指向でまとめるくらいでちょうど良い
830デフォルトの名無しさん
2026/08/24(月) 12:28:27.74ID:hVz7/hAx 手続きは地続き
831デフォルトの名無しさん
2026/08/24(月) 12:30:28.08ID:iOSk3pf4 データとそれを処理する関数をまとめたカプセル化は良いと思う。
細々したことをさらけださなくいいから。
C++ならテンプレートだな。まあ、会社では使用禁止だろうけど。
細々したことをさらけださなくいいから。
C++ならテンプレートだな。まあ、会社では使用禁止だろうけど。
832デフォルトの名無しさん
2026/08/24(月) 12:43:50.88ID:0OmhbSEr テンプレートやマクロって、公的に利用されてるもの以外は混乱の元なんだよね
833デフォルトの名無しさん
2026/08/24(月) 12:50:46.60ID:/rJQvH3P >>656
>クラス(カプセル化)、動的インスタンス(動的extent)、継承、多態といったもので
>プログラムを現すモデルとして実は適していなかったおそれがあると思う
これやっぱりCOBOLのような手続き型を想定した話だったのか
さすがおじいさん
>クラス(カプセル化)、動的インスタンス(動的extent)、継承、多態といったもので
>プログラムを現すモデルとして実は適していなかったおそれがあると思う
これやっぱりCOBOLのような手続き型を想定した話だったのか
さすがおじいさん
834デフォルトの名無しさん
2026/08/24(月) 12:54:25.98ID:ApDDNJ0D 東工大の大学院出てそうだなwww
835デフォルトの名無しさん
2026/08/24(月) 13:08:11.00ID:/7yyHiO5 なぜそう思った?
836デフォルトの名無しさん
2026/08/24(月) 15:41:30.92ID:NI+byBux この使い分けも難しい
ニブル (nibble)
テトラード (tetrade)
カルテット (quartet)
ニブル (nibble)
テトラード (tetrade)
カルテット (quartet)
837デフォルトの名無しさん
2026/08/24(月) 15:46:54.81ID:/TxIyeAu >>835
気分はstatic!だから
気分はstatic!だから
838デフォルトの名無しさん
2026/08/24(月) 16:08:32.29ID:FITgzI9F えらい勢いあるねこのすれωωω
839デフォルトの名無しさん
2026/08/24(月) 16:49:46.42ID:++uoiV4H 不毛なことって延々と続くからね
840デフォルトの名無しさん
2026/08/24(月) 18:18:43.72ID:0OmhbSEr スキー用具が冬季オリンピックの開催国で使われる名称になるみたいな差だからいいんだよw
841デフォルトの名無しさん
2026/08/24(月) 18:46:36.30ID:9P8EVJBT842デフォルトの名無しさん
2026/08/24(月) 19:06:41.35ID:oSCPHv4Q >>29
>>・extentが独立な状態変数は、どうしてもそうしなければならないもの以外、なるべく状態変数にしない
このextentが独立はlifetimeが独立の意味?
生存期間が独立って表現おかしくない?
生存期間が静的と言いたいのかな?
>>特にextentとscope。
>>C言語で明確化された、ネストしたシンプルで分かりやすく
>>そしてextentと対応付きやすいscopy
ネストしたと書かれているから
おそらく多段ブロックスコープの話っぽい
でもextentはscopeと対応しないから意味を持つよね
extentを敢えて出す意味は?
>>・extentが独立な状態変数は、どうしてもそうしなければならないもの以外、なるべく状態変数にしない
このextentが独立はlifetimeが独立の意味?
生存期間が独立って表現おかしくない?
生存期間が静的と言いたいのかな?
>>特にextentとscope。
>>C言語で明確化された、ネストしたシンプルで分かりやすく
>>そしてextentと対応付きやすいscopy
ネストしたと書かれているから
おそらく多段ブロックスコープの話っぽい
でもextentはscopeと対応しないから意味を持つよね
extentを敢えて出す意味は?
843デフォルトの名無しさん
2026/08/24(月) 20:30:04.38ID:SH8uZeIr 馬鹿しかいない
844デフォルトの名無しさん
2026/08/24(月) 22:28:44.89ID:/7yyHiO5 ほんとそう思った
845デフォルトの名無しさん
2026/08/24(月) 23:11:07.53ID:SAx4f3U/846デフォルトの名無しさん
2026/08/24(月) 23:12:21.80ID:SAx4f3U/847デフォルトの名無しさん
2026/08/24(月) 23:56:26.47ID:5ApQpNZr848デフォルトの名無しさん
2026/08/25(火) 03:53:26.26ID:Fbem61UJ staticおじさんは
staticおじいさんに進化しました
staticおじいさんに進化しました
849デフォルトの名無しさん
2026/08/25(火) 06:40:27.48ID:DTj/Nd7/850デフォルトの名無しさん
2026/08/25(火) 09:32:51.45ID:DTj/Nd7/ オブジェクト指向はその仕組みが元凶で悪というよりも
自由度が高かったり色々な(変な・凝った)書き方が出来てしまい
それを使う人間が上手く律し利点だけを引き出すような使い方が結局できない
思い込みと自己流で変な流用の仕方をしがちだった
使う人間側にも問題があったのではないかと最近では思う
それをそれを制限する仕組みをオブジェクト指向は備えていなかった
で、制限する言語が最近出て来た
自由度が高かったり色々な(変な・凝った)書き方が出来てしまい
それを使う人間が上手く律し利点だけを引き出すような使い方が結局できない
思い込みと自己流で変な流用の仕方をしがちだった
使う人間側にも問題があったのではないかと最近では思う
それをそれを制限する仕組みをオブジェクト指向は備えていなかった
で、制限する言語が最近出て来た
851デフォルトの名無しさん
2026/08/25(火) 10:13:57.96ID:oBSBF0sY オブジェクト指向言語自体は洗練されてるからねw
提供されてるライブラリのクラスメソッドの出来の良さよw
提供されてるライブラリのクラスメソッドの出来の良さよw
852デフォルトの名無しさん
2026/08/25(火) 10:26:10.59ID:6vdc+tuL853デフォルトの名無しさん
2026/08/25(火) 10:29:44.33ID:2JbrJHvg delay()を初心者に教えるとその先が壁になって
いつまでもシングルタスクのまま進歩しないのと同じだな
いつまでもシングルタスクのまま進歩しないのと同じだな
854デフォルトの名無しさん
2026/08/25(火) 10:51:57.55ID:kmT7Vw9O >>852
自分で調べろ
自分で調べろ
855デフォルトの名無しさん
2026/08/25(火) 10:58:49.00ID:V26zP6ij856デフォルトの名無しさん
2026/08/25(火) 11:01:52.62ID:kmT7Vw9O >>855
specって何? specが気になってぜんぜん頭に入ってこない
specって何? specが気になってぜんぜん頭に入ってこない
857デフォルトの名無しさん
2026/08/25(火) 11:04:09.41ID:dp5nuGuB satisfied_countってなんやねん!
858デフォルトの名無しさん
2026/08/25(火) 11:10:09.26ID:FPo7YXHj つか、なんでみんなダラダラ条件分岐書き連ねるの?
859デフォルトの名無しさん
2026/08/25(火) 11:18:37.93ID:kmT7Vw9O >>858
他に良いやり方あるんけ? おーん?
他に良いやり方あるんけ? おーん?
860デフォルトの名無しさん
2026/08/25(火) 11:19:36.83ID:oBSBF0sY まあ、バカがループ禁止にしたからかな?
861デフォルトの名無しさん
2026/08/25(火) 11:32:42.57ID:V26zP6ij とりあえず出力ができるものということで書いたので、粗があるのは許してちょ。specは、〜specの並びを見れば、意図するところは分かってもらえるかなと思ったんだけどね(>>593でも書いているし)。
woofルールがなければ述語関数を渡して判定させるという形で書けるのでまだ分かりやすかったと思うんだけど、今回は、woofルールもまとめて一本で書いたので正直分かりにくくなった面はあると思う。
ま、あくまでお試しで書いてみた例にすぎないので、その程度のものとして見てもらえれば。
woofルールがなければ述語関数を渡して判定させるという形で書けるのでまだ分かりやすかったと思うんだけど、今回は、woofルールもまとめて一本で書いたので正直分かりにくくなった面はあると思う。
ま、あくまでお試しで書いてみた例にすぎないので、その程度のものとして見てもらえれば。
862デフォルトの名無しさん
2026/08/25(火) 11:40:36.88ID:FPo7YXHj >>859
辞書作って判定回せばデータ変えるだけだぞ
辞書作って判定回せばデータ変えるだけだぞ
863デフォルトの名無しさん
2026/08/25(火) 11:47:07.75ID:kmT7Vw9O >>862
ほほんw それでやってみ、できないからw
ほほんw それでやってみ、できないからw
864デフォルトの名無しさん
2026/08/25(火) 11:47:53.08ID:kmT7Vw9O エアプが妄想でこうやれば良いと言っててウケるw
865デフォルトの名無しさん
2026/08/25(火) 11:52:07.39ID:FPo7YXHj866デフォルトの名無しさん
2026/08/25(火) 11:59:10.14ID:V26zP6ij867デフォルトの名無しさん
2026/08/25(火) 12:03:40.92ID:FPo7YXHj 最小公倍数で回せなくなったのかw
あと変換後のスペル順番が違う…と
スペル変換をもう一つ噛ませればいいだけじゃん
あと変換後のスペル順番が違う…と
スペル変換をもう一つ噛ませればいいだけじゃん
868デフォルトの名無しさん
2026/08/25(火) 12:06:57.49ID:FPo7YXHj いっその事、1万テーブルの変換表作って
ダイレクトに参照させた方がいいまであるなw
ダイレクトに参照させた方がいいまであるなw
869デフォルトの名無しさん
2026/08/25(火) 13:36:41.58ID:uW9aS2eb870デフォルトの名無しさん
2026/08/25(火) 13:55:36.08ID:kmT7Vw9O >>869
自分で作れ
自分で作れ
871デフォルトの名無しさん
2026/08/25(火) 14:08:10.89ID:V26zP6ij >>869
そう? 組み込みクラスのオブジェクトの便利なメソッドを使うというのも十分にオブジェクト指向だと思うけど。
そういうネジ・クギレベルのことを超えて、ユーザー定義クラスみたいなのを作って色々やるのがいいかどうかは設計時の考え方次第だと思うよ。今回は関数で十分だと思ったから関数にしただけの話で。
そう? 組み込みクラスのオブジェクトの便利なメソッドを使うというのも十分にオブジェクト指向だと思うけど。
そういうネジ・クギレベルのことを超えて、ユーザー定義クラスみたいなのを作って色々やるのがいいかどうかは設計時の考え方次第だと思うよ。今回は関数で十分だと思ったから関数にしただけの話で。
872デフォルトの名無しさん
2026/08/25(火) 15:02:38.17ID:59HjenUa873デフォルトの名無しさん
2026/08/25(火) 15:23:05.74ID:oT3TaD7S >>868
その変換表をどうやって作るつもりなんだよw
その変換表をどうやって作るつもりなんだよw
874デフォルトの名無しさん
2026/08/25(火) 15:34:02.59ID:FPo7YXHj875デフォルトの名無しさん
2026/08/25(火) 15:39:14.70ID:oT3TaD7S >>874
1万までの数字すべての期待結果がドキュメントに逐一書かれてるといいねw
1万までの数字すべての期待結果がドキュメントに逐一書かれてるといいねw
876デフォルトの名無しさん
2026/08/25(火) 15:45:57.28ID:V26zP6ij >>872
ユーザー定義関数もオブジェクトだし、words.appendとか、''.joinとかは普通にメソッド呼び出しだけど。forループやリスト内包では、内部的にiteratorオブジェクトのメソッド呼び出しがされているわけだし。
インスタンスの生成構文みたいなのがないとオブジェクト指向ではないという感覚なの?
ユーザー定義関数もオブジェクトだし、words.appendとか、''.joinとかは普通にメソッド呼び出しだけど。forループやリスト内包では、内部的にiteratorオブジェクトのメソッド呼び出しがされているわけだし。
インスタンスの生成構文みたいなのがないとオブジェクト指向ではないという感覚なの?
877デフォルトの名無しさん
2026/08/25(火) 15:47:28.12ID:FPo7YXHj878デフォルトの名無しさん
2026/08/25(火) 16:34:19.36ID:92tTKry8 >>877
自分のバカさ加減にようやく気付いたようで何よりですww
自分のバカさ加減にようやく気付いたようで何よりですww
879デフォルトの名無しさん
2026/08/25(火) 16:34:41.01ID:59HjenUa880デフォルトの名無しさん
2026/08/25(火) 16:50:03.91ID:kmT7Vw9O >>872
C言語に備わっていたらオブジェクト指向じゃないといつから錯覚していた?
C言語に備わっていたらオブジェクト指向じゃないといつから錯覚していた?
881デフォルトの名無しさん
2026/08/25(火) 16:53:27.38ID:kmT7Vw9O オブジェクト指向とはプログラムをわかりやすくする営みと知れ
882デフォルトの名無しさん
2026/08/25(火) 17:04:08.80ID:XljZ4S3B オブジェクトを作ってそこへメッセージを投げることで動いていく
そのためのメッセージ送受をコーディングしていく
それがオブジェクト指向プログラミング
>>866は今回の目的のためにオブジェクトすら作っていない
そのためのメッセージ送受をコーディングしていく
それがオブジェクト指向プログラミング
>>866は今回の目的のためにオブジェクトすら作っていない
883デフォルトの名無しさん
2026/08/25(火) 17:15:06.41ID:kmT7Vw9O884デフォルトの名無しさん
2026/08/25(火) 17:16:01.79ID:kmT7Vw9O オブジェクトを最小限にすることもオブジェクト指向である
885デフォルトの名無しさん
2026/08/25(火) 17:16:52.90ID:kmT7Vw9O Pythonは数値さえもオブジェクトだったりするんだよな
Pythonで書かれたプログラムはすべてオブジェクト指向の賜物
Pythonで書かれたプログラムはすべてオブジェクト指向の賜物
886デフォルトの名無しさん
2026/08/25(火) 17:24:18.32ID:kmT7Vw9O メッセージパッシングがーと言ってるやつは自分で書いてみろ
できないんだったらメッセージパッシングによるオブジェクト指向は
現実では使い物にならないことの証拠である
できないんだったらメッセージパッシングによるオブジェクト指向は
現実では使い物にならないことの証拠である
887デフォルトの名無しさん
2026/08/25(火) 17:37:38.64ID:1v+8FLb+ オブジェクト指向でプログラミングすること
言語の機能やライブラリがオブジェクト指向で実装されていること
この二つは異なる
違いがわからない人はいないと思うが
言語の機能やライブラリがオブジェクト指向で実装されていること
この二つは異なる
違いがわからない人はいないと思うが
888デフォルトの名無しさん
2026/08/25(火) 17:43:28.83ID:kmT7Vw9O >>887
同じですね、オブジェクト指向エアプか?
同じですね、オブジェクト指向エアプか?
889デフォルトの名無しさん
2026/08/25(火) 17:44:24.87ID:kmT7Vw9O オブジェクト指向がなかったらライブラリも構築できないんだから
オブジェクト指向のライブラリを使うこともオブジェクト指向プログラミングだよ
オブジェクト指向のライブラリを使うこともオブジェクト指向プログラミングだよ
890デフォルトの名無しさん
2026/08/25(火) 17:48:20.35ID:kmT7Vw9O オブジェクト指向で構築されたライブラリを使ってプログラム書いてオブジェクト指向ではありませんは無理がある
濃厚セックスしておきながら私エッチなことに興味ありませんけどみたいな顔してる女みたいなもの
濃厚セックスしておきながら私エッチなことに興味ありませんけどみたいな顔してる女みたいなもの
891デフォルトの名無しさん
2026/08/25(火) 17:54:21.90ID:kmT7Vw9O オブジェクト指向以前からベテランの開発者は優れたデータ構造を選んでコードがシンプルにせよと言ってたんだよな
そのように考えるとオブジェクトは言語機能の代替と考えてそれらを使ってロジックを手続き型や関数型でシンプルに書くのがオブジェクト指向の良いプログラムといえるのではないだろうか
そのように考えるとオブジェクトは言語機能の代替と考えてそれらを使ってロジックを手続き型や関数型でシンプルに書くのがオブジェクト指向の良いプログラムといえるのではないだろうか
892デフォルトの名無しさん
2026/08/25(火) 17:55:18.50ID:kmT7Vw9O 誤:コードがシンプルにせよ
正:コードをシンプルにせよ
正:コードをシンプルにせよ
893デフォルトの名無しさん
2026/08/25(火) 17:57:28.72ID:r1bVOdaF >>866はオブジェクト指向プログラミングの要素が1つもないな
894デフォルトの名無しさん
2026/08/25(火) 18:00:20.67ID:kmT7Vw9O895デフォルトの名無しさん
2026/08/25(火) 18:02:14.96ID:gX3JeEsp 手段の目的化の極み
896デフォルトの名無しさん
2026/08/25(火) 18:10:28.36ID:a1NtL2p3 >>866
読んでみた
糞コードだと思った点の一つはCallable
それは非常に古い使い方でオブジェクト指向に対応していないC言語などで用いる方法
オブジェクト指向プログラミングに対応した言語はその点を解決している
読んでみた
糞コードだと思った点の一つはCallable
それは非常に古い使い方でオブジェクト指向に対応していないC言語などで用いる方法
オブジェクト指向プログラミングに対応した言語はその点を解決している
897デフォルトの名無しさん
2026/08/25(火) 18:19:04.63ID:hVPTaWzW あーキレ散らかしてるのはJavaで書いた人かw
898デフォルトの名無しさん
2026/08/25(火) 18:22:52.56ID:V26zP6ij899デフォルトの名無しさん
2026/08/25(火) 18:24:13.18ID:FPo7YXHj900デフォルトの名無しさん
2026/08/25(火) 19:27:33.50ID:kmT7Vw9O なんて言えば良い!!なんて言えばいいのこれ!!?
901デフォルトの名無しさん
2026/08/25(火) 19:40:39.17ID:wEZKKEj5 オワコンっていうかやって当たり前
902デフォルトの名無しさん
2026/08/25(火) 19:41:00.03ID:3wAPU5Xr メッセージを送ってなんちゃらかんちゃら。small talkはうんざりだよ。所詮、コンピュータ上のお遊び
903デフォルトの名無しさん
2026/08/25(火) 19:47:15.35ID:aTZ3N5IY What Killed Smalltalk Could Kill ほにゃらら, Too
904デフォルトの名無しさん
2026/08/25(火) 19:57:57.21ID:2ED0hgJy BIG MOUTH👄
905デフォルトの名無しさん
2026/08/25(火) 20:19:20.51ID:1JhonwiJ 拡張FizzBuzzも結局Fizzの出力を0回か1回かそれ以上かのバリエーションになっているため
ID:V26zP6ij氏のカウント数を返す抽象化は正しいよ
あとはカウント数を返す抽象メソッドを共通インターフェースとして定めて
各ルールがそのインターフェース実装すればオブジェクト指向になるね
共通インターフェースの例
trait FizzBuzzRule {
fn count(&self, target: usize, number: usize) -> usize;
fn divisible(&self, target: usize, number: usize) -> bool {
target % number == 0
}
fn contains(&self, target: usize, number: usize) -> bool {
target.to_string().contains(&number.to_string())
}
}
count()は各ルールが実装すべき抽象メソッド
残りは各ルールが共通に使える具象メソッド
ID:V26zP6ij氏のカウント数を返す抽象化は正しいよ
あとはカウント数を返す抽象メソッドを共通インターフェースとして定めて
各ルールがそのインターフェース実装すればオブジェクト指向になるね
共通インターフェースの例
trait FizzBuzzRule {
fn count(&self, target: usize, number: usize) -> usize;
fn divisible(&self, target: usize, number: usize) -> bool {
target % number == 0
}
fn contains(&self, target: usize, number: usize) -> bool {
target.to_string().contains(&number.to_string())
}
}
count()は各ルールが実装すべき抽象メソッド
残りは各ルールが共通に使える具象メソッド
906デフォルトの名無しさん
2026/08/25(火) 20:21:14.02ID:1JhonwiJ あとは各ルールがcount()だけ実装すればOK
struct Classic;
impl FizzBuzzRule for Classic {
fn count(&self, target: usize, number: usize) -> usize {
self.divisible(target, number) as usize
}
}
struct Digits;
impl FizzBuzzRule for Digits {
fn count(&self, target: usize, number: usize) -> usize {
self.contains(target, number) as usize
}
}
struct Boom;
impl FizzBuzzRule for Boom {
fn count(&self, target: usize, number: usize) -> usize {
(self.divisible(target, number) || self.contains(target, number)) as usize
}
}
struct Woof;
impl FizzBuzzRule for Woof {
fn count(&self, target: usize, number: usize) -> usize {
self.divisible(target, number) as usize + self.contains(target, number) as usize
}
}
struct Classic;
impl FizzBuzzRule for Classic {
fn count(&self, target: usize, number: usize) -> usize {
self.divisible(target, number) as usize
}
}
struct Digits;
impl FizzBuzzRule for Digits {
fn count(&self, target: usize, number: usize) -> usize {
self.contains(target, number) as usize
}
}
struct Boom;
impl FizzBuzzRule for Boom {
fn count(&self, target: usize, number: usize) -> usize {
(self.divisible(target, number) || self.contains(target, number)) as usize
}
}
struct Woof;
impl FizzBuzzRule for Woof {
fn count(&self, target: usize, number: usize) -> usize {
self.divisible(target, number) as usize + self.contains(target, number) as usize
}
}
907デフォルトの名無しさん
2026/08/25(火) 20:37:39.47ID:DTj/Nd7/ >>881
そしたらなぜ君の書くプログラムはそんなに分かりにくいのよ?
そしたらなぜ君の書くプログラムはそんなに分かりにくいのよ?
908デフォルトの名無しさん
2026/08/25(火) 20:57:36.49ID:kmT7Vw9O >>907
そこは謎のままで良いじゃないですか、謎のままにしときましょう
そこは謎のままで良いじゃないですか、謎のままにしときましょう
909デフォルトの名無しさん
2026/08/25(火) 21:11:25.28ID:RlQeYlwg オブジェクト指向という幻想
概念はわかりやすい理想的なものだが
実装したところで無駄ばかりで趣味の世界
概念はわかりやすい理想的なものだが
実装したところで無駄ばかりで趣味の世界
910デフォルトの名無しさん
2026/08/25(火) 21:12:58.03ID:2JbrJHvg なんていうか、猿でも作れるツクール的な感じ
だけどツールでもないしな
プロでも作れないオブジェクト指向のための言語になってる
だけどツールでもないしな
プロでも作れないオブジェクト指向のための言語になってる
911デフォルトの名無しさん
2026/08/25(火) 21:16:16.70ID:1JhonwiJ >>909
無駄じゃないだろ
無駄じゃないだろ
912デフォルトの名無しさん
2026/08/25(火) 21:20:57.24ID:DTj/Nd7/ >>911
削り落とせるぞ
削り落とせるぞ
913デフォルトの名無しさん
2026/08/25(火) 21:21:16.82ID:2JbrJHvg CPUはかなり遠回りで無駄なことをしてるんだよ
人間様用の高級言語のせいでね
人間様用の高級言語のせいでね
914デフォルトの名無しさん
2026/08/25(火) 21:22:14.14ID:DTj/Nd7/ つまり0721か
915デフォルトの名無しさん
2026/08/25(火) 21:34:08.05ID:kmT7Vw9O >>912
それが無駄な作業なのでは?
それが無駄な作業なのでは?
916デフォルトの名無しさん
2026/08/25(火) 21:39:26.92ID:kmT7Vw9O オブジェクトをなくしたところで状態が必要なくなるわけではないからなあ、状態を管理しようと思ったらオブジェクトで操作とセットにしておけばわかりやすいだろ、その努力こそがオブジェクト指向なんだよ
917デフォルトの名無しさん
2026/08/25(火) 21:42:54.15ID:kmT7Vw9O 状態も操作もバラバラにあっちこっちに散りばめたら管理できなくなる、100億を超える大規模なシステム開発が失敗して損害賠償の裁判が起きたという話をたまに聞くだろ、ああいうのも元をたどればオブジェクト指向が原因なんですか?
918デフォルトの名無しさん
2026/08/25(火) 22:04:51.61ID:hHo/2XBn >>599 ruby
https://ideone.com/TZGLeB
・>>846の委譲でなんとかするやつの移植
・Javaの発想からスタートしたからRubyっぽくないかも
>>884
> オブジェクトを最小限にすることもオブジェクト指向である
かもね
やっぱクラスにせよインスタンスにせよ不必要に増やしたらあとで苦しいよ
https://ideone.com/TZGLeB
・>>846の委譲でなんとかするやつの移植
・Javaの発想からスタートしたからRubyっぽくないかも
>>884
> オブジェクトを最小限にすることもオブジェクト指向である
かもね
やっぱクラスにせよインスタンスにせよ不必要に増やしたらあとで苦しいよ
919デフォルトの名無しさん
2026/08/25(火) 22:13:35.74ID:1JhonwiJ 異なる種類のオブジェクトを共通のインターフェースに結びつけることは
オブジェクトの意味と立ち位置をはっきりさせる
オブジェクト間の関係もはっきりさせる
それらを使う側から見ると
インターフェース抽象型として同一に扱える
つまりコードの共通化ができる
インターフェースを実装してないオブジェクトに間違って適用してしまうバグも防げるため型安全性もある
C言語の関数ポインタやPythonのCallableと比べると使い勝手も安全性も格段に良くなっている
インターフェースを用いたオブジェクト指向プログラミングは可読性も保守性も良くなりバグも減らす
オブジェクトの意味と立ち位置をはっきりさせる
オブジェクト間の関係もはっきりさせる
それらを使う側から見ると
インターフェース抽象型として同一に扱える
つまりコードの共通化ができる
インターフェースを実装してないオブジェクトに間違って適用してしまうバグも防げるため型安全性もある
C言語の関数ポインタやPythonのCallableと比べると使い勝手も安全性も格段に良くなっている
インターフェースを用いたオブジェクト指向プログラミングは可読性も保守性も良くなりバグも減らす
920デフォルトの名無しさん
2026/08/25(火) 22:35:05.17ID:E8remrnh921デフォルトの名無しさん
2026/08/25(火) 22:44:34.17ID:1JhonwiJ922デフォルトの名無しさん
2026/08/25(火) 23:21:32.61ID:DTj/Nd7/ >>915
それなら最初から無駄を付けない・省くのが最強だろ
それなら最初から無駄を付けない・省くのが最強だろ
923デフォルトの名無しさん
2026/08/25(火) 23:24:12.29ID:jUy9So8k プログラマじゃなく管理する側に都合のいいのがオブジェクト「至高」
プログラムを書かないのでどんな処理をするにはどんな書き方があるとか分かって無いけど、オブジェクト指向なら纏められるってので飛びついてオブジェクト指向が目的となってる
プログラムを書かないのでどんな処理をするにはどんな書き方があるとか分かって無いけど、オブジェクト指向なら纏められるってので飛びついてオブジェクト指向が目的となってる
924デフォルトの名無しさん
2026/08/25(火) 23:33:49.21ID:ERS3Iam5 インターフェイスを共通にするというのは良いとしても、コールバック関数で済むことなら個人的にはわざわざオブジェクトにはしたくないとやっぱり思っちゃうかな。
Pythonならユーザー定義クラスを作って継承するなりtyping.Protocolを使うなりすることはできるけど、特に状態管理が必要な場合等でなければコールバック関数の方が好ましいと思っちゃうな。
Pythonならユーザー定義クラスを作って継承するなりtyping.Protocolを使うなりすることはできるけど、特に状態管理が必要な場合等でなければコールバック関数の方が好ましいと思っちゃうな。
925デフォルトの名無しさん
2026/08/25(火) 23:38:44.16ID:0Y/Xd6X8 >>924
全てオブジェクトなのにオブジェクトにしたくないとはどういう意味?
全てオブジェクトなのにオブジェクトにしたくないとはどういう意味?
926デフォルトの名無しさん
2026/08/25(火) 23:40:53.88ID:DTj/Nd7/ >>920
言葉に酔って本質を見失うタイプでしょw
言葉に酔って本質を見失うタイプでしょw
927デフォルトの名無しさん
2026/08/25(火) 23:44:47.08ID:ERS3Iam5 あー、ごめん、ユーザー定義クラスのインスタンスにはしたくないというニュアンスで受け取ってもらえれば。関数1つで済むところを、その代わりにクラスを作ってメソッドを定義するというのは、もちろんメリットもあるのだろうけど、本当に手間に見合うだけのメリットなのかというくらいの感じ。
928デフォルトの名無しさん
2026/08/25(火) 23:45:31.01ID:yTdodo0t >>924
そこで使えるコールバック関数一覧をどうやって管理するのかな
そこで使えるコールバック関数一覧をどうやって管理するのかな
929デフォルトの名無しさん
2026/08/25(火) 23:49:02.90ID:ERS3Iam5 FizzBuzzの拡張ルールくらいならそんなに多くはならないだろうし、仮に数十個、数百個になるというなら、専用モジュールを作ってそれに放り込んでおけばいいんじゃない?
930デフォルトの名無しさん
2026/08/26(水) 00:12:54.49ID:qdTH26se インターフェースは異なる型に対して共通のメッセージを送れる仕組み
一般的にはコールバックに置き換えられない
一般的にはコールバックに置き換えられない
931デフォルトの名無しさん
2026/08/26(水) 00:17:59.86ID:z15V+4Gv インターフェイスが一般的にはコールバックに置き換えられないというのはもちろんそうで、今疑問を提示しているのは、コールバックで済むような場合に、わざわざインターフェイスを持ち出す必要はないのではないかということね。
932デフォルトの名無しさん
2026/08/26(水) 00:30:47.65ID:aHX34kXI コールバックが複数あってそれぞれに異なる名前を付けるということは複数のオブジェクトを作っているのと同じだね
それならメソッドとして実装した方が型安全性もよいかな
それならメソッドとして実装した方が型安全性もよいかな
933デフォルトの名無しさん
2026/08/26(水) 04:39:13.97ID:g57AhbG+ 本当は君らプログラミングやソフトウエア開発が苦手なんじゃない?
苦手なのにその自覚がないだけなんじゃない?
苦手なのにその自覚がないだけなんじゃない?
934デフォルトの名無しさん
2026/08/26(水) 04:49:18.83ID:suXVoFGf プログラミングで一番大事なことは型安全だからラップして別の型に
935デフォルトの名無しさん
2026/08/26(水) 04:56:22.38ID:g57AhbG+ 違うだろ、もっとも必要なものは合理的な考え方だろ
936デフォルトの名無しさん
2026/08/26(水) 05:05:16.08ID:qkiKzIk8 全てをイミュータブルにすることが大切
937デフォルトの名無しさん
2026/08/26(水) 08:14:33.47ID:FBlplv6V 関数定義はユーザー定義クラスを定義する等してオブジェクトを作るより簡単だし、コールバック関数は渡された関数内で呼ばれるだけだから、呼び出そうとしたメソッドが存在していなかったという類の問題はもともと生じないと思うんだけど。
たとえば、Pythonの組み込み関数sorted(あるいはlist.sort)は引数keyとしてコールバック関数を取るんだけど(str.lowerなんかを指定する)、これを、特定のインターフェイスを備えたオブジェクトを受け取る形に変更した方が望ましいということにはならないと思う。
たとえば、Pythonの組み込み関数sorted(あるいはlist.sort)は引数keyとしてコールバック関数を取るんだけど(str.lowerなんかを指定する)、これを、特定のインターフェイスを備えたオブジェクトを受け取る形に変更した方が望ましいということにはならないと思う。
938デフォルトの名無しさん
2026/08/26(水) 09:19:21.67ID:sdi3yqbK939デフォルトの名無しさん
2026/08/26(水) 10:04:49.49ID:HFCsEuKA940デフォルトの名無しさん
2026/08/26(水) 10:06:16.63ID:sdi3yqbK >>939
バカ乙
バカ乙
941デフォルトの名無しさん
2026/08/26(水) 10:24:33.47ID:XAtO2pPN942デフォルトの名無しさん
2026/08/26(水) 10:42:25.83ID:p1kFnG2q Woofのルールは303ならFizzFizzじゃなくてFizzFizzFizzみだいたよ
943デフォルトの名無しさん
2026/08/26(水) 10:45:24.36ID:NdwH3mi0944デフォルトの名無しさん
2026/08/26(水) 10:45:25.18ID:sdi3yqbK >>942
キャー助けてー
キャー助けてー
945デフォルトの名無しさん
2026/08/26(水) 10:46:01.13ID:sdi3yqbK >>943
バカ乙
バカ乙
946デフォルトの名無しさん
2026/08/26(水) 11:07:33.27ID:HZ2sBvRV >>938
オブジェクト指向のスレなのにMainしかなくて酷いコード草
オブジェクト指向のスレなのにMainしかなくて酷いコード草
947デフォルトの名無しさん
2026/08/26(水) 11:16:45.19ID:sdi3yqbK >>946
酷いのはお前の頭で大草原、シマウマさんが走ってるわ
酷いのはお前の頭で大草原、シマウマさんが走ってるわ
948デフォルトの名無しさん
2026/08/26(水) 11:20:56.72ID:C23DyjBn >>942
そうなの? だとすると、>>866のwoof_rule関数は、
if str( given_nubmer ) in str( i ): satisfied_count += 1 の行を
satisfied_count += str( i ).count( str( number ) ) に修正する感じかな。
ついでに引数名もちょっと変えてみた。本質的な変更ではまったくないのだけれど。
https://paiza.io/projects/0xwLMmS5rjnLke8sh9ExMg
そうなの? だとすると、>>866のwoof_rule関数は、
if str( given_nubmer ) in str( i ): satisfied_count += 1 の行を
satisfied_count += str( i ).count( str( number ) ) に修正する感じかな。
ついでに引数名もちょっと変えてみた。本質的な変更ではまったくないのだけれど。
https://paiza.io/projects/0xwLMmS5rjnLke8sh9ExMg
949デフォルトの名無しさん
2026/08/26(水) 11:25:19.71ID:sC8u3BU+ >>938は関数型プログラミングをわかっていないのだと思われる
foldやreduceを知らない
foldやreduceを知らない
950デフォルトの名無しさん
2026/08/26(水) 11:28:41.50ID:C23DyjBn >>941
コールバック関数を渡す設計にするのは、1つの引数に1つの関数を渡すというケースだと思うけど。複数のメソッドを持つオブジェクトを渡すことが必要な場合ならもちろんオブジェクトで渡すけれども、sortedのkey引数のように単一の関数を渡せば済むようなケースで、あえて単一メソッドのオブジェクトを作って渡す必要はないんじゃないかと思う。
コールバック関数を渡す設計にするのは、1つの引数に1つの関数を渡すというケースだと思うけど。複数のメソッドを持つオブジェクトを渡すことが必要な場合ならもちろんオブジェクトで渡すけれども、sortedのkey引数のように単一の関数を渡せば済むようなケースで、あえて単一メソッドのオブジェクトを作って渡す必要はないんじゃないかと思う。
951デフォルトの名無しさん
2026/08/26(水) 11:38:52.55ID:sdi3yqbK >>949
バカ乙
バカ乙
952デフォルトの名無しさん
2026/08/26(水) 11:39:45.46ID:N0ZXk9lg953デフォルトの名無しさん
2026/08/26(水) 11:55:56.95ID:JrGcaWVK オブジェクト指向はオワコン? part3
https://mevius.5ch.io/test/read.cgi/tech/1787712923/
https://mevius.5ch.io/test/read.cgi/tech/1787712923/
954デフォルトの名無しさん
2026/08/26(水) 11:58:22.44ID:sdi3yqbK >>953
ありがとー仕事が早い
ありがとー仕事が早い
955デフォルトの名無しさん
2026/08/26(水) 12:04:02.43ID:sdi3yqbK オブジェクトの状態を変えられるか否かが可変性(ミュータブル/イミュータブル)
変数への再代入ができるか否かが再代入可能性(リアサイナブル/ノンリアサイナブル)
これらは異なるものなんよ
変数への再代入ができるか否かが再代入可能性(リアサイナブル/ノンリアサイナブル)
これらは異なるものなんよ
956デフォルトの名無しさん
2026/08/26(水) 12:08:33.08ID:C23DyjBn >>952
たとえば、Pythonの組み込みソート関数sortedの引数keyには、引数を1つとって1つの値を返すコールバック関数を渡すんだけど、このコールバック関数の引数になるのはソート対象のコンテナの各要素なので、イメージとしてはコンテナの各要素に対して(コンテナの各要素を引数として)コールバック関数を呼び出す感じになる。
で、このコールバック関数を仮にオブジェクトのメソッドに置き換えるとした場合、何をレシーバーにする(どのオブジェクトに属するメソッドにする)のが、設計上無難なのかというのは、コールバック派の自分にはよく分からないかな。何らかの管理用オブジェクトを作ってそのメソッドにする方向になるのかなとも思うけれども。
メソッドのレシーバーをどのように渡すのかという問いに対しては、そもそもどういったものがレシーバーとして想定されているかがよく分からないのでそれを明らかにしてもらえると助かるかなという感じなのだけれど。
たとえば、Pythonの組み込みソート関数sortedの引数keyには、引数を1つとって1つの値を返すコールバック関数を渡すんだけど、このコールバック関数の引数になるのはソート対象のコンテナの各要素なので、イメージとしてはコンテナの各要素に対して(コンテナの各要素を引数として)コールバック関数を呼び出す感じになる。
で、このコールバック関数を仮にオブジェクトのメソッドに置き換えるとした場合、何をレシーバーにする(どのオブジェクトに属するメソッドにする)のが、設計上無難なのかというのは、コールバック派の自分にはよく分からないかな。何らかの管理用オブジェクトを作ってそのメソッドにする方向になるのかなとも思うけれども。
メソッドのレシーバーをどのように渡すのかという問いに対しては、そもそもどういったものがレシーバーとして想定されているかがよく分からないのでそれを明らかにしてもらえると助かるかなという感じなのだけれど。
957デフォルトの名無しさん
2026/08/26(水) 12:10:23.44ID:sU6/QjKC958デフォルトの名無しさん
2026/08/26(水) 12:16:38.05ID:sdi3yqbK >>957
何をデスカ?
オブジェクトがイミュータブルならオブジェクトを変数に入れてもオブジェクトの状態は書き換えられませんよ
変数への代入とオブジェクトの状態を変える操作はまるで違うものだということを理解したが良い
何をデスカ?
オブジェクトがイミュータブルならオブジェクトを変数に入れてもオブジェクトの状態は書き換えられませんよ
変数への代入とオブジェクトの状態を変える操作はまるで違うものだということを理解したが良い
959デフォルトの名無しさん
2026/08/26(水) 12:25:10.38ID:5yDcdQ0U960デフォルトの名無しさん
2026/08/26(水) 12:36:00.57ID:vdIJI+q7 >>958
そこは言語によって千差万別だから意味のない主張
さらに全てがオブジェクトの言語もあれば
言語仕様にオブジェクトの概念が存在せず型とその値とそれを格納する変数しか存在しない言語も多い
オブジェクトだけがイミュータブルという主張こそ馬鹿げている
そこは言語によって千差万別だから意味のない主張
さらに全てがオブジェクトの言語もあれば
言語仕様にオブジェクトの概念が存在せず型とその値とそれを格納する変数しか存在しない言語も多い
オブジェクトだけがイミュータブルという主張こそ馬鹿げている
961デフォルトの名無しさん
2026/08/26(水) 12:36:50.80ID:C23DyjBn 「コールバック関数で済む場合に、わざわざオブジェクトを渡す設計にする必要はないよね」という主張なので、「コールバック関数で済む場合もたしかにあるね」ということになると、主張の対立するポイントがなくなって話は終わってしまうのだけど。別に何でもかんでもコールバックでやりましょうと言いたいわけではないので。
962デフォルトの名無しさん
2026/08/26(水) 12:43:56.53ID:sdi3yqbK >>960
イミュータブルなオブジェクトを変数に代入しても
オブジェクトが可変になるわけじゃないでしょ
> オブジェクトを変数に入れれば書き換えてもいいんだな
と言っておられたからオブジェクトの状態は書き換えられないよってこと
再代入しても良いかという問いならやりたければやれば良いと思う、が僕の主張だよ
言語によって千差万別だというのが君の主張だね
その主張に意味があるとは僕は思えないな、シマウマ追っかけてた方がまだ有意義だよ
イミュータブルなオブジェクトを変数に代入しても
オブジェクトが可変になるわけじゃないでしょ
> オブジェクトを変数に入れれば書き換えてもいいんだな
と言っておられたからオブジェクトの状態は書き換えられないよってこと
再代入しても良いかという問いならやりたければやれば良いと思う、が僕の主張だよ
言語によって千差万別だというのが君の主張だね
その主張に意味があるとは僕は思えないな、シマウマ追っかけてた方がまだ有意義だよ
963デフォルトの名無しさん
2026/08/26(水) 12:51:45.29ID:wdN0r8cQ >>961
横からだが
特化した処理部分をコールバック関数という形で受け取って処理するか
インターフェースを実装したオブジェクトを定義して特化した処理をメソッドの中に書くか
を比較してるんじゃないのかな?
横からだが
特化した処理部分をコールバック関数という形で受け取って処理するか
インターフェースを実装したオブジェクトを定義して特化した処理をメソッドの中に書くか
を比較してるんじゃないのかな?
964デフォルトの名無しさん
2026/08/26(水) 12:53:37.51ID:nPTCa+m2 >>961
コールバック関数が一つだけなら大丈夫だよ
しかし今回は多数の種類があるから話が別かな
多数ある関数が同じ場所で使われる同類だとコード上で示す必要があるよ
たまたま同じ型の関数が間違って使われることを防ぐことも必要だね
それらを一気に解決する方法としてラップがあるよ
値オブジェクとも言われてその値だけをラップしたオブジェクトを作る方法
今回の場合はコールバックとして使われる関数をすべて同じオブジェクトとしてラップだね
もちろんメソッドは要らないし他の値は持たないから手間もかからないよ
これだけで同種のオブジェクトとしてコード上に明示されると共に型安全性も保証されるメリットがあるよ
コールバック関数が一つだけなら大丈夫だよ
しかし今回は多数の種類があるから話が別かな
多数ある関数が同じ場所で使われる同類だとコード上で示す必要があるよ
たまたま同じ型の関数が間違って使われることを防ぐことも必要だね
それらを一気に解決する方法としてラップがあるよ
値オブジェクとも言われてその値だけをラップしたオブジェクトを作る方法
今回の場合はコールバックとして使われる関数をすべて同じオブジェクトとしてラップだね
もちろんメソッドは要らないし他の値は持たないから手間もかからないよ
これだけで同種のオブジェクトとしてコード上に明示されると共に型安全性も保証されるメリットがあるよ
965デフォルトの名無しさん
2026/08/26(水) 12:58:49.29ID:yH/m4JlP966デフォルトの名無しさん
2026/08/26(水) 12:58:58.05ID:wdN0r8cQ >>964
色んな種類の関数を受け取れるようにするためにコールバック関数があるんだから多数の種類がない場合なんてない
色んな種類の関数を受け取れるようにするためにコールバック関数があるんだから多数の種類がない場合なんてない
967デフォルトの名無しさん
2026/08/26(水) 13:01:35.44ID:sdi3yqbK >>965
ローカル変数がミュータブルでも関数が純粋であることには変わりはないから
変数への再代入を禁止することが大切だというのはただの君の思い込み
君は昔から思い込みが激しい、僕のコードを100回読んで心を浄化したが良い
礼はいらないよ、僕のコードで君が救われるなら本望だ
ローカル変数がミュータブルでも関数が純粋であることには変わりはないから
変数への再代入を禁止することが大切だというのはただの君の思い込み
君は昔から思い込みが激しい、僕のコードを100回読んで心を浄化したが良い
礼はいらないよ、僕のコードで君が救われるなら本望だ
968デフォルトの名無しさん
2026/08/26(水) 13:05:31.82ID:sdi3yqbK ミュータブル変数と言った場合は変数の型がミュータブルであることを表すから
再代入できるという意味なら可変束縛の方が良いかもね
再代入できるという意味なら可変束縛の方が良いかもね
969デフォルトの名無しさん
2026/08/26(水) 13:09:45.53ID:NsymNjtw970デフォルトの名無しさん
2026/08/26(水) 13:22:13.27ID:C23DyjBn >>963
その比較で「コールバック関数で済む場合もある」と「オブジェクトを渡す方が常に優れている」との違いというのが見解の実質的な対立点かなと。
>>964
同種の機能・役割を果たすことを示すための箱・入れ物としてオブジェクトを使うというのは、(それしか道具立てがない言語なら仕方ないのかもしれないけれど)ちょっと抵抗感があるかな。もし本当にそうすることが必要なら(そのような場合がどの程度あるのかというのも考え方が分かれそう)名前空間なりモジュールなりを使うのが最近の言語の考え方なのかなと。
たまたま同じ型の関数が誤って呼ばれることを防ぐということを型安全性と呼ぶなら、もしそれが本当に深刻な問題になるようなケースなら、Protocolとかインターフェイス的なものを使うことになると思うけれども(ラップはうーん……どうなんだろう)、そんなケースがどの程度あるのかな。少なくとも、ソートのkey引数に指定するのが裸のコールバック関数なのは型安全性に欠けて困ると思ったことはないけど。
その比較で「コールバック関数で済む場合もある」と「オブジェクトを渡す方が常に優れている」との違いというのが見解の実質的な対立点かなと。
>>964
同種の機能・役割を果たすことを示すための箱・入れ物としてオブジェクトを使うというのは、(それしか道具立てがない言語なら仕方ないのかもしれないけれど)ちょっと抵抗感があるかな。もし本当にそうすることが必要なら(そのような場合がどの程度あるのかというのも考え方が分かれそう)名前空間なりモジュールなりを使うのが最近の言語の考え方なのかなと。
たまたま同じ型の関数が誤って呼ばれることを防ぐということを型安全性と呼ぶなら、もしそれが本当に深刻な問題になるようなケースなら、Protocolとかインターフェイス的なものを使うことになると思うけれども(ラップはうーん……どうなんだろう)、そんなケースがどの程度あるのかな。少なくとも、ソートのkey引数に指定するのが裸のコールバック関数なのは型安全性に欠けて困ると思ったことはないけど。
971デフォルトの名無しさん
2026/08/26(水) 13:22:47.79ID:MCEvoZYr972デフォルトの名無しさん
2026/08/26(水) 13:26:32.89ID:sdi3yqbK973デフォルトの名無しさん
2026/08/26(水) 13:26:54.38ID:sdi3yqbK > 意味は
君は
君は
974デフォルトの名無しさん
2026/08/26(水) 13:27:39.42ID:/aytuK8b >>970
型安全性のためのラップはオブジェクトやオブジェクト指向とは独立してそれ以前からある技術です
受け付ける側がラップ型しか受け付けなくなるためラップして持つだけで型安全性が保証されます
生で扱うのはやめましょう
型安全性のためのラップはオブジェクトやオブジェクト指向とは独立してそれ以前からある技術です
受け付ける側がラップ型しか受け付けなくなるためラップして持つだけで型安全性が保証されます
生で扱うのはやめましょう
975デフォルトの名無しさん
2026/08/26(水) 13:37:15.37ID:KzCaqnIk まだやってんの?
手続き型で数十行で済んじゃうコードを
わざわざ複雑にしてw
オブジェクト指向プログラミングってのは
そんな馬鹿な使い方の為にあるんじゃ無いのにw
手続き型で数十行で済んじゃうコードを
わざわざ複雑にしてw
オブジェクト指向プログラミングってのは
そんな馬鹿な使い方の為にあるんじゃ無いのにw
976デフォルトの名無しさん
2026/08/26(水) 13:39:01.55ID:C23DyjBn >>974
そのラップというのは、メンバー・属性として持ついわゆるhas-a的なものという理解でいいのかな。
正直、そこで想定されているような意味での型安全性が深刻な問題になる場合がどの程度あるのかという点についてかなり懐疑的に思っているんだけど。
sorted( some_iterable, key = wrapped_cb ) と書きなさいということでしょ。その方が良いよと言われても、にわかにうんとは言いづらいかな……。
そのラップというのは、メンバー・属性として持ついわゆるhas-a的なものという理解でいいのかな。
正直、そこで想定されているような意味での型安全性が深刻な問題になる場合がどの程度あるのかという点についてかなり懐疑的に思っているんだけど。
sorted( some_iterable, key = wrapped_cb ) と書きなさいということでしょ。その方が良いよと言われても、にわかにうんとは言いづらいかな……。
978デフォルトの名無しさん
2026/08/26(水) 13:40:11.49ID:sdi3yqbK >>975 が手続き型で数十行で書けるってよ、みんなで見ようぜ
979デフォルトの名無しさん
2026/08/26(水) 13:47:55.93ID:fGjq5Quw 引数が値だけの関数だけではなく
引数にミュータブルなオブジェクトの不変参照を渡しても
その時のオブジェクトの値が使われるだけなので問題ない
同様にミュータブルなオブジェクトの可変参照を渡しても
その時のオブジェクトの値が使われるだけであり
変更が反映される対象は使う側が可変参照を渡したオブジェクトだけに限定されるためこれも問題がない
問題が起きるのはグローバル変数の変更だ
使う側から見て指定していないものが変更されるからである
これを副作用と言う
副作用を持たない関数を純粋関数と呼ぶ
オブジェクトがミュータブルかどうかは関係ない話だ
引数にミュータブルなオブジェクトの不変参照を渡しても
その時のオブジェクトの値が使われるだけなので問題ない
同様にミュータブルなオブジェクトの可変参照を渡しても
その時のオブジェクトの値が使われるだけであり
変更が反映される対象は使う側が可変参照を渡したオブジェクトだけに限定されるためこれも問題がない
問題が起きるのはグローバル変数の変更だ
使う側から見て指定していないものが変更されるからである
これを副作用と言う
副作用を持たない関数を純粋関数と呼ぶ
オブジェクトがミュータブルかどうかは関係ない話だ
980デフォルトの名無しさん
2026/08/26(水) 13:55:17.86ID:i+Y8ddFj981デフォルトの名無しさん
2026/08/26(水) 14:05:33.88ID:C23DyjBn 948を書いた者としては、「示された」としてもらえたらよりありがたかったかな。手続型ベースと評価されるのは別に構わないんだけど、一応、オブジェクト指向で設計された組み込みライブラリを利用しているよ。
982デフォルトの名無しさん
2026/08/26(水) 14:10:28.01ID:FMhbZ524983デフォルトの名無しさん
2026/08/26(水) 14:31:13.76ID:5Osq5JzV984デフォルトの名無しさん
2026/08/26(水) 14:35:38.30ID:eQHg//XX C言語でもオブジェクト指向プログラミングできるよ
逆も然り
逆も然り
985デフォルトの名無しさん
2026/08/26(水) 14:36:13.95ID:+7JqDwP8 >>969
それだと、たまたま同じ型の関数が間違ってラップされることも防ぐ義務もあることになるよね?
でそれを実現しちゃうと使う側は新たにラップした型を作れないから拡張できなくなる
今回のようなケースでそんなことする義務とか意味とかあるのかな?
それだと、たまたま同じ型の関数が間違ってラップされることも防ぐ義務もあることになるよね?
でそれを実現しちゃうと使う側は新たにラップした型を作れないから拡張できなくなる
今回のようなケースでそんなことする義務とか意味とかあるのかな?
986デフォルトの名無しさん
2026/08/26(水) 14:42:53.84ID:Ai9eAceU >>985
ある型へとラップした側はその型だと確信しているからそこは全く問題がない
使われる側もある型だけ受け付けると確信しているからそこは全く問題がない
きちんと型付けをすると読みやすくなる
そして型付けシステムが型安全性を保証してくれる
ある型へとラップした側はその型だと確信しているからそこは全く問題がない
使われる側もある型だけ受け付けると確信しているからそこは全く問題がない
きちんと型付けをすると読みやすくなる
そして型付けシステムが型安全性を保証してくれる
987デフォルトの名無しさん
2026/08/26(水) 14:55:41.78ID:sdi3yqbK >>980
はよ書けや
はよ書けや
988デフォルトの名無しさん
2026/08/26(水) 14:58:23.63ID:sdi3yqbK > 975 デフォルトの名無しさん 2026/08/26(水) 13:37:15.37 ID:KzCaqnIk
> まだやってんの?
> 手続き型で数十行で済んじゃうコードを
> わざわざ複雑にしてw
あれあれ〜〜〜??? まだ書けないんですか〜〜〜???
手続き型ってそんなに時間がかかるんですか〜〜〜??? お〜ん?
> まだやってんの?
> 手続き型で数十行で済んじゃうコードを
> わざわざ複雑にしてw
あれあれ〜〜〜??? まだ書けないんですか〜〜〜???
手続き型ってそんなに時間がかかるんですか〜〜〜??? お〜ん?
989デフォルトの名無しさん
2026/08/26(水) 15:02:16.92ID:+7JqDwP8 >>986
じゃ、ある関数にコールバック関数を渡した側はその関数が用途に沿ったものだと確信してるからそこは全く問題がないね
間違いやすいものならともかく今回のような例でラップする型を作ってそれぞれラップしていく手間をかけるほどのメリットは全くないな
じゃ、ある関数にコールバック関数を渡した側はその関数が用途に沿ったものだと確信してるからそこは全く問題がないね
間違いやすいものならともかく今回のような例でラップする型を作ってそれぞれラップしていく手間をかけるほどのメリットは全くないな
990デフォルトの名無しさん
2026/08/26(水) 15:05:25.17ID:g57AhbG+ 横からだけど、>>599は仕様が良く分からんなー
上に書かれている他人のコードは難読だし
上に書かれている他人のコードは難読だし
991デフォルトの名無しさん
2026/08/26(水) 15:11:44.79ID:k59DuRx5992デフォルトの名無しさん
2026/08/26(水) 15:43:10.24ID:UKAdFl7a test
993デフォルトの名無しさん
2026/08/26(水) 15:43:22.12ID:UKAdFl7a 梅準備
994デフォルトの名無しさん
2026/08/26(水) 15:43:37.61ID:UKAdFl7a 梅合わせ
995デフォルトの名無しさん
2026/08/26(水) 15:43:53.85ID:UKAdFl7a うめろん
996デフォルトの名無しさん
2026/08/26(水) 15:44:06.79ID:UKAdFl7a 終了
997デフォルトの名無しさん
2026/08/26(水) 15:44:17.78ID:UKAdFl7a 糸冬
998デフォルトの名無しさん
2026/08/26(水) 15:45:04.44ID:UKAdFl7a999デフォルトの名無しさん
2026/08/26(水) 15:45:59.95ID:UKAdFl7a Rustはオブジェクト指向言語ではないωωω
1000デフォルトの名無しさん
2026/08/26(水) 15:46:13.81ID:UKAdFl7a doubt!
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 13日 1時間 8分 11秒
新しいスレッドを立ててください。
life time: 13日 1時間 8分 11秒
10021002
Over 1000Thread 5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。
▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.io/
▼ UPLIFTログインはこちら ▼
https://uplift.5ch.io/login
運営にご協力お願いいたします。
───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。
▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.io/
▼ UPLIFTログインはこちら ▼
https://uplift.5ch.io/login
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 【アジア大会】サッカー表彰式でトラブル… 優勝の韓国の国旗掲揚されず 韓国の旗だけ下がったまま国歌 応援団ブーイング、選手は困惑 [冬月記者★]
- 自民党幹部「辞めさせない」 簗大臣の発言「格好つけて言ってしまっただけ」 [バイト歴50年★]
- 【テレビ】『都道府県魅力度ランキング』 佐藤栞里、埼玉県の最下位脱出に歓喜「すごーい!」 ワースト3は佐賀県、茨城県、群馬県 [冬月記者★]
- 【実況】アジア大会 男子サッカー決勝 『日本 vs 韓国』 TBS系 19:30~ [冬月記者★]
- 【芸能】広瀬すず「私は異性の友情はあると思っている」 女子高生の恋愛の悩みに真剣回答 [冬月記者★]
- 【海】「全員浮上してこない」ダイビング客など8人が行方不明 八丈島で水難事故 下田海上本部などが捜索中 [ぐれ★]
- 柏レイソル🏡
- 【速報】死後の世界、あった [308389511]
- 結婚も子供も居ないのに働き続けてる人って何が目的なの?
- 【悲報】トランプ「選挙前にジジババ2000万人へ1万4000円配るぞ」 [834922174]
- ジャップの自動車産業、EVで出遅れて終了へ。トヨタが中国で販売台数7ヶ月連続減少、豪州でBYDに追いつかれる [603416639]
- 【高市悲報】小渕優子「減税は次世代へのツケ」 [856698234]