探検


オブジェクト指向はオワコン? part2

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん
垢版 |
2026/08/13(木) 14:38:03.02ID:pdAcKRXu
前スレ
オブジェクト指向はオワコン?
https://mevius.5ch.io/test/read.cgi/tech/1721393540/
2026/08/13(木) 14:52:49.47ID:lo6KubsW
メッセージパッシング自体はもちろん片方向
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のアセンブラでコルーチンを記述していたこのワシに向かって何という暴言
まだまだ、若いもんには負けん!
そこに直れ、根性叩き直してくれるわ
喝っー
2026/08/13(木) 20:59:20.13ID:sSd0uIXu
冗談さておき、むかしコルーチンを記述しやすかった言語があったけど
あれなんだったっけな
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デバイスなど長寿命の処理に向いてるそう

ソフトウェアよりミドルウェアに近いものなんかね
11デフォルトの名無しさん
垢版 |
2026/08/13(木) 21:52:36.06ID:pdAcKRXu
>>5
ゴルチンで何やってるの?
エッチな画像の収集とか?
12デフォルトの名無しさん
垢版 |
2026/08/13(木) 22:20:01.05ID:beXELhsO
世も末じゃ
2026/08/13(木) 22:30:09.16ID:mqqnxowM
>>9
そう。
Mofulaは誤記な。
2026/08/13(木) 22:41:40.15ID:thl5TbU4
静的で同期なmthod callで済むことをわざわざ動的で非同期に書けば書ける、
実装のしやすさ、動作の把握・理解のしやすさ、視認性、メンテ性、テストデバッグのしやすさなど
すべての面でディメリットばかり増える。

静的に書けるものはなるべく静的に、同期で書けるものはなるべく同期でかく
というのがプログラミングの鉄則であり基本セオリー

それでも動的で非同期な記述がオブジェクト指向のメッセージパッシングにあたる一環というならばw
そのせいでオブジェクト指向の欠点:視認性の悪さ、scopeやextentの把握しにくさが
動的非同期によりまた一つ増えるだけのような気がする
2026/08/13(木) 22:45:38.03ID:51v2ue8P
なぜ各プログラミング言語が非同期に対応したのか理解できてないやつがいるな
2026/08/13(木) 22:50:01.83ID:oaHWRr6T
>>15
そりゃ必要だからだろあほか
非同期がオブジェクト指向だと蘊蓄垂れて乱用するためではない
2026/08/13(木) 22:55:34.62ID:2XNZo5jp
>>10
今は知らんけど少し前ならニコニコ(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
>>22
メッセージで内部状態変数管路を行ってプログラムを動作させるなんて
よせよそれものすごくわかりにくいプログラムになる
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
これがソフトウエア開発にどのくらい役に立ったか
これもダメにしちゃった
2026/08/14(金) 00:22:55.55ID:UF3wd4nI
クラスとか継承というものがさ、有効な場面てのはあるよ
それはそんなに多くのシーンではないと個人的には考えているけどあることはあるよ。

でもそういう有用なシーンに上手く絞って、律した使い方をし、有効な特徴だけを
上手くひきだすことができたかというと、どうも人間にはできなかったみたいで、
使い方に自由度があったり、ちょとした便利機能があれば近視眼的によさそうだと使ってみたり
よく言えば応用、悪く言えば濫用が止まらない。害のある面をコントロール抑制できない。

そしてオブジェクト指向とは、といえば、皆それぞれ変な妄想が膨らんで止まらない

便利かな点はあるかもしれないけど、害を性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のようなインターフェースにはいまいち使いにくいし
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がその典型だ
2026/08/14(金) 03:10:41.44ID:2yA0m3fH
クラス継承というものがあると
どうしても使っちゃう人がいっぱい出てきちゃう
だから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
2026/08/14(金) 14:03:10.83ID:j/tRNb4z
クラス継承が失敗した原因は世間でも出尽くしてるもんな。
突き詰めれば、複数から継承したくなるにも関わらず、クラス継承は実装継承だから複数継承すると色んな矛盾が出る。
2026/08/14(金) 14:46:10.55ID:kBqLUOsM
小さなプログラムならいざ知らず
ある程度規模が大きくなると
あちこち定義が分散し飛んで
追っかけきれなくてとてもわかりにくくなるしな
初期CD時は先のこと気にせずがんがん定義し
継承で紐付け依存紡ぎまくって、あとで見て何だこりゃって
2026/08/14(金) 14:49:11.75ID:kBqLUOsM
しばらく前まではその視認性の悪化を疑問視したら
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
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!
51デフォルトの名無しさん
垢版 |
2026/08/14(金) 18:45:52.36ID:eEi1c8Nt
どこから動くのか動かすまでわからない
オブジェクト指向すぎるプログラム
2026/08/14(金) 19:46:52.72ID:LThgHuK6
>>50
なぜ英語なのか謎だがそういうことだよな
その後半部分
結局サブタイプやクラスの祖先型も含めて抽象型を指定してコーディングしている場合
そのメソッド呼び出しは各々の具象型のメソッドへの動的ディスパッチが基本で遅くなってしまう
だからRustのように指定がなければ常に単相化で高速化しつつ
必要な場合のため動的ディスパッチ利用の指定もできる形が現実解なんだろうな
53デフォルトの名無しさん
垢版 |
2026/08/14(金) 20:31:09.86ID:85jyUaLi
理想のオブジェクト指向だとメンバー見なくてもメソッド名でどんな動きするかわかるって世界なんだわな。
だからメンバーも継承されても問題ないでしょ?って態度になるわけ。
まあ現実的ではないわな。
2026/08/14(金) 20:36:41.17ID:b0Pen2Wt
>>53
抽象型から具象型への継承は全く問題を起こさない
具象型から具象型への継承のみ問題が起き得る
55デフォルトの名無しさん
垢版 |
2026/08/14(金) 20:43:47.27ID:85jyUaLi
>>54
抽象とか具体とかを粒度の問題だと認識するわけだ。
特に多段継承する場合はね。
だからそんな理屈付けは現実には無意味なの。
56デフォルトの名無しさん
垢版 |
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
テストやデバッグの時にモックやダミーな型に入れ替えても動作する
その抽象型を継承していれば動くため
2026/08/14(金) 22:46:11.79ID:Ezt31ZDh
>>54
君、前スレで抽象型からの継承使って問題引き起こしてたやんww
もう忘れたの?
2026/08/14(金) 23:26:22.37ID:L7BBT3dp
クラスの継承は抽象型からの継承ではないね
変数を持たない抽象クラスなら抽象型になりえるけど
2026/08/15(土) 00:51:56.36ID:sm2DXHtx
抽象型のメリットは多重継承できることもあるよ
クラスは抽象型じゃないので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:TQSPkWiN
>>66
知らないの? 知らないのに批判してるの?
わかろうとはした? それでもわからなかった?
2026/08/15(土) 11:09:01.77ID:Yv1XFEHU
オブジェクト指向の弱点の一つは過剰に紐付けして引き回して依存を張り巡らしたところ
即ちモジュラ利ティーを欠くところにああったと思うけど
その呪縛から逃れられないのかと
2026/08/15(土) 11:10:24.03ID:Yv1XFEHU
>>68
お前の好みやオツムの中など知るわけないだろ
71デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:10:34.43ID:TQSPkWiN
>>67
> クラスは抽象型じゃないのでNG

と言ってる人がいたので抽象型とクラスの関係はそういうものではないよって話だよ
2026/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
実は大して大事じゃないよね、便宜上そういう概念を基にすることもできるということ
クラスとは違う、そうだ。クラスは色々まずかった
まずかったことと<それほど大事でもないもの、それぞれを元に牽きまわしてとか
そういう狭い考え方省みてはってのは俺の意図なんだけれど
それを理解できないで頭に血が昇っちゃったみたいだね
76デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:19:26.24ID:TQSPkWiN
>>72
>>67の失礼な発言をお前は俺に謝罪するべきだと思う
2026/08/15(土) 11:21:05.63ID:Yv1XFEHU
何でソフトウエア作るときにいちいち抽象型みたいなものいちいち設けて継承したりして書く必要があるのよ
2026/08/15(土) 11:22:53.41ID:Yv1XFEHU
>>76
それのどこが失礼か客観的に説明出来たらな。
単にお前が頭に血が上て癇に障っただけのことならそれはお前の性格の問題で俺には関係ない
79デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:23:37.06ID:TQSPkWiN
>>77
そんな事する必要があるとは誰も言ってないから
それはただの藁人形論法じゃんか
2026/08/15(土) 11:23:59.01ID:Yv1XFEHU
型とか階層間を引き回すのやめなよ
2026/08/15(土) 11:25:05.50ID:Yv1XFEHU
>>79
それが好きなことに口挟まれると気に入らないらしい
変な人もいるもんだ
82デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:25:50.03ID:TQSPkWiN
>>78
関係ないで済むわけないじゃんか
>>65の俺の発言が>>64に対する返信だと思ってそんな話じゃないと
俺に言ってきたんだから、君がいうべきなのは間違いましたすみません
ということだよ
83デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:27:01.22ID:TQSPkWiN
>>81
ちょっと何言ってんのかわからない
いまのところの俺の中で変な人は君だけだ
2026/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
87デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:28:45.25ID:TQSPkWiN
まず謝れよ!!!
2026/08/15(土) 11:28:54.59ID:Yv1XFEHU
>>85
お前に言ったんじゃないのに反すなよw
2026/08/15(土) 11:29:28.68ID:Yv1XFEHU
>>87
お前さんを相手にして時間を無駄にしてすみませんでした
90デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:30:24.58ID:TQSPkWiN
>>86
俺の性格の話をしてるんじゃない
お前が間違って俺に迷惑を書けたことについて非礼を詫びろと言っている
いいかげんにしろよ、ネットのやり取りだからといってごまかして逃げられると思うなよ
2026/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:TQSPkWiN
>>88
そういうのは通用しないよ、アンカーつけてなくても文脈で判断できるから
裁判所舐めない方が良いよ
2026/08/15(土) 11:31:47.90ID:Yv1XFEHU
>>90
俺が関係ないと書いたのはお前に正確についてだぞw
それに名何お迷惑だよ示してみろ
朝腹が立って気分が悪くなったレベルならざまーみろざ
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
98デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:33:24.49ID:TQSPkWiN
謝れない人っているよねえ
99デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:34:05.36ID:TQSPkWiN
クソジャップは謝罪もできない劣等民族
2026/08/15(土) 11:34:09.65ID:Yv1XFEHU
必要がないからな
そそそも謝罪ポイントがない
腹が立ったのは分かったw
101デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:34:21.46ID:TQSPkWiN
テポドン落としたってもええねんど
2026/08/15(土) 11:34:31.15ID:Yv1XFEHU
>>99
日本語上手くなったね
2026/08/15(土) 11:34:52.85ID:Yv1XFEHU
>>101
裁判所に言ってこい
104デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:35:31.16ID:TQSPkWiN
>>102
お前は下手だな
2026/08/15(土) 11:36:06.79ID:Yv1XFEHU
ここに日本語では書いてないがw
106デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:36:33.10ID:TQSPkWiN
>>103
お前が行け、ちんちんの調子が悪いんですけど判決をお願いしますと言って警察に捕まって森の奥の病院で包茎の治療を受けろ
2026/08/15(土) 11:38:11.85ID:Yv1XFEHU
マジ韓国だったのか
急に火病るとは話に聞いていたが
薬飲んでも直らなそうだな
2026/08/15(土) 11:39:25.17ID:Yv1XFEHU
>>106
本性現したなw
挑発に弱すぎ、これも人柄の表れか
2026/08/15(土) 11:40:23.17ID:Yv1XFEHU
何の薬が効くのやら
やっぱトンスル飲んでるんだろうな
110デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:41:32.47ID:TQSPkWiN
テポドンは北朝鮮の人工衛星だよ
北朝鮮と韓国の違いもわからんのか
ジャップの義務教育はどうなってんだ
こんな義務教育の落ちこぼれはネットにアクセスさせるな
我が国で再教育してやろうか
2026/08/15(土) 11:42:42.55ID:IzVYAgKs
>これまで刷り込まれた既成概念で思考停止してない?
などと書いておいて
>他人のおツムの中で起きているこは(´・ω・`)知らんがな
自分は思考停止以前に思考放棄

結局このレベルなのよねぇ
少しはオツム使えよ
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
2026/08/15(土) 11:43:58.28ID:Yv1XFEHU
>>110
脱北者だったのか…
2026/08/15(土) 11:45:59.67ID:Yv1XFEHU
日本に文句バッカ言って何で居るんだろう
いつでもお帰り頂いて結構なのに
なぜじゃ
2026/08/15(土) 11:46:44.54ID:Yv1XFEHU
ま・さ・か・ 生活保護もらったりしてないだろうな
116デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:51:24.27ID:TQSPkWiN
>>115
もらってたらどうなんだ、お前が助けてくれるのか?
お前が俺に手を差し伸べるなら俺はそれに感謝するだろう
そして>>111とお前と俺と三人で助け合って生きていこう
俺たちズッ友だからな
117デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:52:56.91ID:TQSPkWiN
これが俺たち三人の出会いでした
2026/08/15(土) 11:54:54.93ID:Yv1XFEHU
>>116
っ�I

できる仕事探して働けよ

お前は俺の友達として物足りない
119デフォルトの名無しさん
垢版 |
2026/08/15(土) 11:58:10.07ID:TQSPkWiN
>>111
最後のオチをお願いしても良いでしょうか?
2026/08/15(土) 11:59:46.06ID:Yv1XFEHU
俺の知人に朝鮮籍の椰子がいて
東工大学部出てうちの大学に入ってきて結構頭は良いかった
卒業後仲間と会社を興してその後どうなったかは知らん
虚勢は張るタイプではあったがここまでふぁびょって人に変に絡むことはなかったなー
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/

ここでの継承の問題は↑のようなもの
123デフォルトの名無しさん
垢版 |
2026/08/15(土) 13:29:23.70ID:TQSPkWiN
Javaの良くないところはメソッドをデフォルトで上書き可能にしたところだ
クラスを書いた人が意図したときだけ上書き可能にするべきだった
C++やC#はそうなっている
オブジェクト指向言語と言ったらJavaのイメージが強いが
実際にオブジェクト指向言語として完成度が高いのはC#やKotlinだな
2026/08/15(土) 13:33:50.38ID:fk/8MezU
>>122
そのページをちゃんと読んだ?
interface継承ならその問題は起きません
class継承だから発生した問題です
125デフォルトの名無しさん
垢版 |
2026/08/15(土) 13:34:51.45ID:TQSPkWiN
継承は問題があるから委譲を使おうとなって
困るのは委譲メソッドの実装コストなんよな

C#やKotlinは拡張メソッドの言語機能によって
委譲メソッドの実装コストが高いことを解決した

そこからするとJavaはまだ言語機能が未熟であるが
ゆえに継承を使わざるを得ないというのが実際のところだ
126デフォルトの名無しさん
垢版 |
2026/08/15(土) 13:36:05.05ID:TQSPkWiN
>>124
めちゃくちゃ読んだし
写経もした
interfaceで同じことが起きることも確認した
2026/08/15(土) 13:37:22.52ID:sdc2zI/7
>>126
ウソついたらダメ
interfaceで起きるならコード示して
128デフォルトの名無しさん
垢版 |
2026/08/15(土) 13:41:23.66ID:TQSPkWiN
>>127
お前w そういうときはわからないので教えてくださいって言うものだよ
煽って何かを教えてもらおうなどとは
お前のそういうところ俺は好き、ちょっと待ってて
129デフォルトの名無しさん
垢版 |
2026/08/15(土) 13:50:18.16ID:3CRH9xzf
>>122
おまえバカだろ
そのサイトは密結合のクラス継承をしているために起きる問題を解説してくれている
疎結合のインターフェース継承ではもちろんその問題は起きない
まずはその違いを理解しろ
130デフォルトの名無しさん
垢版 |
2026/08/15(土) 14:01:08.16ID:TQSPkWiN
>>127
ほい
https://paiza.io/projects/FT1LVWXCazREqX01yD4ZIw
131デフォルトの名無しさん
垢版 |
2026/08/15(土) 14:02:49.82ID:TQSPkWiN
メソッド名などは変えた
豆蔵さんに著作権侵害だと怒られたくなかった
132デフォルトの名無しさん
垢版 |
2026/08/15(土) 14:13:37.01ID:hZdK+yJb
変えるなよ
わけわからなくなってるぞ
2026/08/15(土) 14:23:37.18ID:Z3IQ+P4P
>>130
super使ってるから密結合だよ
疎結合にしなさい
2026/08/15(土) 14:26:02.01ID:+nxHL2x0
>>122
やっと気がついたか
原因を知ってればインターフェースのデフォルト実装でも発生することは自明なのにな
2026/08/15(土) 14:29:33.88ID:nx8TJyDG
>>134
起きないよ
デフォルト実装を完全に書き換えても実装継承にならないため疎結合になる
元のデフォルト実装を利用しつつデフォルトを書き換えられる言語が存在すればそれは実装継承なので密結合になるがそんな本末転倒な仕様にするのは愚かすぎる
2026/08/15(土) 14:36:56.36ID:+nxHL2x0
にしても最近は豆蔵のエンジニアでもQiitaレベルなんだな
OOで存在感があったころを知ってるなんかがっかり
2026/08/15(土) 14:41:55.11ID:+nxHL2x0
>>135
具体例を見てもまだ気づけないのかぁ
愚かだなぁ

30年も前から原因も対策も一般常識化してる問題なのになぁ
138デフォルトの名無しさん
垢版 |
2026/08/15(土) 14:43:57.08ID:TQSPkWiN
>>136
昔からこんなもんじゃね?
昔デザインパターンの本読んだけど
雑に書いてベテランっぽさを演出してるだけで中身はあまりなかったよ
139デフォルトの名無しさん
垢版 |
2026/08/15(土) 14:46:41.95ID:TQSPkWiN
>>134
だよねー
90年代には継承の問題は実装の上書きにあるから純粋仮想関数なら問題ないと言われてた
2026/08/15(土) 15:04:03.59ID:Yv1XFEHU
90年代からクラス継承が嫌いでたまらなかったオレ様が通りますよっと
2026/08/15(土) 15:10:53.23ID:/ef9Thsi
>>139
あるっれぇ〜?
別スレで複おじとともに問題は起きないと主張してなかったっけ〜?


637 デフォルトの名無しさん[sage] 2026/07/10(金) 00:03:13.15 ID:bAT5n0dl

>>635
保証できるが……
デフォルト実装は内部構造に触れないから定義できるもので、触れるなら定義できんのだわ

638 デフォルトの名無しさん[sage] 2026/07/11(土) 14:38:59.33 ID:EKW8EhdF

>>635
どうやって決まってもいない内部構造に依存するんだよ
その時点で矛盾しとる
2026/08/15(土) 15:12:14.49ID:Yv1XFEHU
( *´艸`)クスクス
2026/08/15(土) 15:15:42.64ID:cilU02p9
状況がわかったのでまとめてみる

【インターフェース継承】
(インターフェースに変数を持たないものなら抽象クラスやトレイトなども含む。)
①デフォルト実装を持たない言語 →疎結合
②デフォルト実装を持つ言語
②-A デフォルト実装を書き換えられない言語 →疎結合
②-B デフォルト実装を書き換えられる言語
②-B-α その場合にはデフォルト実装を継承できない言語 →疎結合
②-B-β その場合でもデフォルト実装を継承できる言語 →密結合❌

Javaは「②-B-β」だからアウト
C#やRustなどは「②-B-α」だからセーフ

ということでJavaはcクラスと同じノリで実装継承できてしまう変な言語仕様みたい
疎結合のインターフェース継承を台無しにしてしまう誤仕様
2026/08/15(土) 15:22:31.14ID:VAdMHfIa
またJavaが変な言語仕様で問題を引き起こしたパターンかよ
いつもJavaが戦犯だよな
2026/08/15(土) 15:31:32.75ID:SrZtcHJ3
インターフェース継承は密結合を起こさないための機能
昔のJavaは>>143の①だから疎結合で問題は起きなかった
Javaが仕様を拡張した時にミスをして密結合を招く道を作り出してしまった
2026/08/15(土) 15:44:25.52ID:fSG6hCiZ
>>133
super を使わないなら、default メソッドではなく static メソッドで良いのでは?

密結合か疎結合かは、そういう絶対的な条件で決まるものではなく相対的な評価でしかない。
一般には、あるプログラム要素の変更による他のプログラム要素への影響の多寡に対して評価される。
2026/08/15(土) 15:45:53.34ID:silBGnFG
>>143
Rustでも同じ問題起こるぞ
どこまで節穴なんだよ
2026/08/15(土) 15:46:28.97ID:Py4EuqFd
なるほどな
一般的にはデフォルト継承を用いてもインターフェース継承は疎結合
ただしデフォルト実装を継承しつつ書き換えられる間違った抜け道のあるJavaは注意ってことか
2026/08/15(土) 15:48:45.83ID:0Bu7lId9
>>147
AIに聞いたらRustのデフォルト実装は継承か書き換えどちらかしか選べないから問題は起きないってさ
2026/08/15(土) 15:52:33.11ID:PxTLs4UK
>>146
superをoverrideで使えるのはclassの仕様
それをinterfaceでも使えてしまうという言語仕様の拡張に失敗したJavaで起きている問題
2026/08/15(土) 15:54:18.43ID:silBGnFG
>>149
もう少しまともなAI使うか
もう少し基礎を勉強しろ
2026/08/15(土) 16:01:21.42ID:oBPlyySV
>>147
RustでこのJava問題は生じない
superメソッド呼び出しに相当するものがRustに存在しないため
2026/08/15(土) 16:10:40.42ID:fSG6hCiZ
C++ だと通常メンバ変数と仮想メンバ変数でどちらのケースもあるから、C++を知っていればすぐに分かる話だけれど、
どちらかしかない言語を習得した人だと、どちらかのケースを元に考えるから分かりにくいんだろうな。

C++の通常メンバ変数=GoやRustのメソッド
現在の型によって決まるメソッド。キャストされたら呼ばれるメソッドが変わる。
ソースコード上、使用時の型は静的に決定できるので、コンパイル時に呼ばれるメソッドも固定される。

C++の仮想メンバ関数=Javaのメソッド
インスタンス生成時の型によって決まるメソッド。キャストされても呼ばれるメソッドは変わらない。
ソースコード上、インスタンス生成時の本当の型を決定できないので、コンパイル時に呼ばれるメソッドを特定できない。
2026/08/15(土) 16:16:03.46ID:silBGnFG
>>151
まともなAIを使っても使う側がまともじゃなければ意味なかったな
2026/08/15(土) 16:16:45.06ID:fSG6hCiZ
>>153
> C++ だと通常メンバ変数と仮想メンバ変数でどちらのケースもあるから、C++を知っていればすぐに分かる話だけれど、

> C++の通常メンバ変数=GoやRustのメソッド

あ、しまった、関数を変数と間違えて書いてしまった。
通常メンバ関数と仮想メンバ関数、に訂正。
2026/08/15(土) 16:18:44.23ID:silBGnFG
>>153
すぐ分かる話といいつつあんま分かってなくないか?
インターフェースのデフォルト実装の話だぞ?
2026/08/15(土) 16:25:53.62ID:+6/lj6CD
>>151
俺もいくつかのAIに聞いてみた
いずれもRustはこの問題を起こさない結論
2026/08/15(土) 16:31:59.68ID:r7+Cc7Q7
C#でもデフォルト実装を書き換えるなら元のデフォルト実装を呼び出せないってさ
再帰定義になるため不可能とのこと
問題を引き起こすのはJavaだけの問題みたいね
2026/08/15(土) 16:41:03.86ID:0WCtanUv
>>157
はい、やり直し〜w
ヒントをやるとRustは問題起こすけどGoは起こさない
2026/08/15(土) 16:42:09.41ID:r7+Cc7Q7
Rustでもデフォルト実装を書き換えるなら元のデフォルト実装を呼び出せないってさ
再帰定義になるため不可能とのこと
2026/08/15(土) 16:42:48.33ID:S4+pqC1p
>>155
仮想メンバ変数でかなり悩んでしまったぞ笑。いつのまにC++の仕様が...と思って悩んだ。
C++と違うjavaのメンバ変数の上書きは、コードの難読化に使うのだ。
>>122の例は親クラスにおける継承可能なメソッドを使用した改変ですね。
親と子が別会社で作成されているとたいへんですね。
仕様に明記してあれば子を作った側のバグ、明記してなければ親を作った側のバグ。
javaのライブラリでもよくあるのでunittestは重要。
明記してあっても、親側の改修は、継承可能なメソッドを呼び出さないように変更すべき。
2026/08/15(土) 16:43:49.96ID:0WCtanUv
>>141
そのレスはID:Yv1XFEHU(二代目複おじ)のほうでID:TQSPkWiNはまた別のやつだろう
2026/08/15(土) 16:44:51.38ID:0WCtanUv
>>160
問題のフレーミングが間違ってるからAIから間違った答えしか引き出せないんだよ
2026/08/15(土) 16:51:14.97ID:Fg8L11Lx
>>159
Rustでこの手の問題は起きんよ
親のメソッドを呼び出す機構を敢えて設けていない
2026/08/15(土) 17:05:20.37ID:g+lgHL/9
Rustはクラス継承に相当するものがないからスーパーメソッド呼び出しがそもそもなくて問題が起きないわけだけど
C#はクラス継承もスーパーメソッド呼び出しもあるにも関わらずインターフェースでは使えない言語仕様だから問題が起きない
Javaはインターフェースでもスーパーメソッド呼び出しを使える間違った言語仕様にしたので問題が起きてる
166デフォルトの名無しさん
垢版 |
2026/08/15(土) 17:17:01.46ID:TQSPkWiN
>>161
なるほど、勉強になります、あなた只者じゃないですね
2026/08/15(土) 17:32:13.56ID:2vg9s13q
>>126
Javaだけ問題が生じるんだな
Javaを完全に捨てさるべきかもな
168デフォルトの名無しさん
垢版 |
2026/08/15(土) 17:36:22.11ID:TQSPkWiN
>>167
うーん、そうねー、Javaでこの問題が起こりやすいのは間違いない
他の言語では問題が起きにくくはあるけど起きないわけじゃないってところかな
>>161が言語化してくれてるけど、継承可能なメソッドに依存してるのが問題の本質だと思われる
2026/08/15(土) 17:40:54.70ID:ILo7VsC4
>>168
ちょっと違うな
メソッドを改変せずそのまま継承なら問題が起きない
メソッドを改変しても親からそれを継承しないなら問題が起きない
メソッドを改変するくせに親からそれを継承すると問題が起きる
2026/08/15(土) 17:46:09.20ID:nidKMiVb
>>168
他でも問題が起きると言うならC#やRustで実例コードを作ってみてよ
2026/08/15(土) 17:47:39.14ID:fSG6hCiZ
C# は使ったことがなかったんで知らなかったが、
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:TQSPkWiN
>>170
だからお前w ふつうは教えてくださいと言うところよ
かわいいからちょっと考えてみるよ
174デフォルトの名無しさん
垢版 |
2026/08/15(土) 18:05:32.04ID:nt5T4P0f
クラス委譲のある言語 いいなあ
便利なんだろうなあ
2026/08/15(土) 18:09:12.27ID:Xb26COoO
>>171
クラスではなくてインターフェースのデフォルト実装の時の話だよ
2026/08/15(土) 18:24:42.13ID:H74NynC0
self-use of overridable methodっていう有名パターンなのに知らないやつが多すぎやろw
昔々から初心者が2冊目に読むような本で紹介されてる基本中の基本やで〜
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
2026/08/15(土) 18:31:56.78ID:H74NynC0
クラス継承で発生する問題の原因と対策を知らないからクラスという名前を持つ言語要素のないRustなどの言語でも同種の問題が発生するかどうかも分かってないんだよな

反省して勉強してね〜
2026/08/15(土) 18:34:06.19ID:H74NynC0
あ、ちなみにRustはインターフェースのデフォルト実装を上書き禁止にできない欠点があるよ
中の人はそれを理解してるから今後機能拡張される予定ではあるけど
2026/08/15(土) 18:49:30.39ID:FRwuYJVI
>>177
その変更をしても壊れていない
スーパー・キャンペーン・ポイントは変更に応じて追随している
181デフォルトの名無しさん
垢版 |
2026/08/15(土) 19:01:27.59ID:nt5T4P0f
Javaだって final、private、protected abstractを守れば継承抽象化したって大きな問題無い
override可能な箇所を必要最小限にして親クラスが守るべき不変条件を finalやprivate で閉じ込めてやるのが大事なんよ
182デフォルトの名無しさん
垢版 |
2026/08/15(土) 19:03:36.72ID:nt5T4P0f
>>174
ちょっと言い方ミスってんな 例えばKotlinのbyみたいな手軽な書き方ができるといいなってことを言いたかった
2026/08/15(土) 19:04:49.04ID:sXETHyYr
>>177
そのRustコードは問題が発生していない
コメントのコードに入れ替えればその意図通りに変更される
184デフォルトの名無しさん
垢版 |
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;
 }
}
185デフォルトの名無しさん
垢版 |
2026/08/15(土) 19:30:03.40ID:TQSPkWiN
>>181
そうなのよねー、今回の例だとJavaは抽象クラスを使えば
オーバーライドを禁止できるからインターフェイスよりも壊れにくくなる
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.について完全に誤解していました。🙇
2026/08/15(土) 20:29:02.06ID:S4+pqC1p
どう転んでも、どんな言語であっても、期待されないことを書くことはできる。
extendsやjavaがevilなのではなく、プログラミング言語がevilなのだ。
基本クラスで継承可能なメソッドを使うなということでもなく、
継承可能なメソッドでなければならない設計もある。
意図を初心者でもわかるように明記すること。そして意図を検証するunittestがあること。
継続的にインテグレーションテストができること。
ともかく、ソフトウェア工学の進歩に追いつけていないメインフレーム系のメーカーや、
どうしようもない教育しかうけていないプログラマーがいる限り、闘いは続く。
188デフォルトの名無しさん
垢版 |
2026/08/15(土) 20:40:13.32ID:2hYalLTI
そもそもインターフェースって継承のための抽象化というより依存性逆転とかテスト時の差し替え可能性を確保するために使うものくらいに考えてる
とりあえずインターフェース切っとけで実装クラスと1:1対応させるのはむしろ抽象化を増やしてるだけでは
2026/08/15(土) 20:43:09.49ID:lG8RMaHa
そういうわけでクラスは不要でインターフェースだけあればよいとわかった
それがモダンな言語の仕様に反映されている
2026/08/15(土) 21:13:29.52ID:vxBg0KLF
イベントドリブンなオブジェクトだらけになる
2026/08/15(土) 21:22:20.54ID:GQznZi9p
>>186
その通りでRustはdyn宣言しない限りどのメソッドも単相化されて普通の関数呼び出しと同じになりゼロコストで実行されて速い
dyn宣言した時のみ動的ディスパッチになり各型のvtableを引いて呼ぶ関数を決める
192デフォルトの名無しさん
垢版 |
2026/08/15(土) 22:59:10.16ID:nt5T4P0f
>>189
それは実装継承が不要ってことをクラスが不要ってことに飛躍させてるよ
Rustだってtraitだけで完結させてるわけじゃなくてstructとimplで状態と振る舞いを分けてる
Javaのclassの責務を別のものに分解しただけなんよ
もちろんclassという大きな責務を分割するのは良いことだよ
2026/08/15(土) 23:04:20.24ID:AbqGm+Ug
>>180>>183
複おじはRust信者なのにRust読めないの?
2026/08/15(土) 23:11:30.09ID:M3QQ7wMC
>>192
RustもGoのマネして名前を変更するまでは
structとimplのセットがclassという名前だった
2026/08/15(土) 23:55:19.69ID:pd5pYsOL
>>194
それは現在のRustが2015年に登場するよりもっと遥か昔の色んなことを試行錯誤していたRust未完成の時代の話だぞ
2026/08/16(日) 00:31:09.64ID:0CvMbO4G
>>194
「構造体 + メソッド = クラス」なんだから当然だな
2026/08/16(日) 00:33:05.01ID:poIe7pLM
>>196
それなら良かったんだけど
クラスには悪魔のクラス継承があるため違う
2026/08/16(日) 10:04:08.54ID:tjwwNDs7
>>197
クラスに継承機能は必須ではない
継承機能はオプション

クラスにクラス to クラスの継承がない言語もあれば
構造体に構造体 to 構造体の継承がある言語もある

概念と実装を区別しよう
2026/08/16(日) 10:09:53.00ID:J2pSiYC1
クラス継承なんかしないで
使いたいクラスを取り込めばいいだけ
2026/08/16(日) 10:43:43.08ID:sS+cH1fU
>>197
Rustはクラスがないのに
悪魔のクラス継承と同じ問題が発生するww
意味ないじゃんwwwww
2026/08/16(日) 10:55:36.25ID:a4RxNiOb
インラインで展開かw
2026/08/16(日) 11:02:38.33ID:Okvwqdtm
>>200
Rustでは問題起きないよ
203デフォルトの名無しさん
垢版 |
2026/08/16(日) 11:29:32.30ID:Q/5wpQBy
クラスが悪ってのはさすがに行きすぎな気がするがな
そのレベルでダメならどんな概念もこじつけで悪いものにできると思うわ。
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おじさんパターンとかね
2026/08/16(日) 13:07:18.35ID:Y1CXBzVZ
デザインパターン系も継承関係はクラス継承よりインターフェース継承が良いですよパターン
209デフォルトの名無しさん
垢版 |
2026/08/16(日) 13:20:43.77ID:8yz0P3zw
>>208
GoFのデザインパターンはそもそも継承よりコンポジションと言われてるから
それってただの反復ですよね
2026/08/16(日) 13:26:23.74ID:+BV6GwVc
>>209
クラス継承よりコンポジションな
2026/08/16(日) 13:34:13.73ID:FW6ktTKM
>>209
GoFのデザインパターンにそんなこと書かれてないぞ
2026/08/16(日) 13:42:39.48ID:nyOyVcBG
>>209
GoFのデザインパターンはインターフェース継承を使おうという話で構成されてる
例えばStrategyパターンはインターフェース継承で抽象化しておけば簡単に切り替えららるよという話
Template Methodパターンは振る舞いははインターフェースで決めておいてインターフェース継承した各型が実装する話
VisitorパターンはVisitorインターフェースを作っておいてそれを実装する各型へディスパッチする話
213デフォルトの名無しさん
垢版 |
2026/08/16(日) 14:06:41.06ID:8yz0P3zw
>>212
そうなのよ、それはみんなわかってるのよ
君は電車を見て電車だと言い続けてるのと同じなのよ
2026/08/16(日) 14:06:53.11ID:a4RxNiOb
あんなくちゃくちゃした書き方をなでもかんでもしなくてもいいだろ>デザインパターン
いや、しない方が良いだろ
2026/08/16(日) 14:07:35.06ID:a4RxNiOb
もう、エンタープライズに続く道再びだな
216デフォルトの名無しさん
垢版 |
2026/08/16(日) 14:08:55.86ID:8yz0P3zw
ハル夫くんの反復横跳びを眺めるスレッド
2026/08/16(日) 14:10:06.00ID:a4RxNiOb
ttps://qiita.com/mogamoga1337/items/564a3d657a80e396dae1
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:8yz0P3zw
>>214
んだ、GoFのデザインパターンは
高階関数が書きにくかった時代に考えられた内包的な設計だ
高階関数で外延的に書いたら必要ないものだ
2026/08/16(日) 14:23:32.50ID:a4RxNiOb
カルトだ、見るとPTSDになりそうとかえらい言われようだけど
正直だと思う
2026/08/16(日) 14:26:52.76ID:a4RxNiOb
>>219
同意だな、関数型で関数変換し細分化されていくにしたがって
ビックリするくらいシンプルな関数になっていくことがあるのには目を見張った。
複合型も必要性がなくなるというか、細分化の過程でシンプルな局所変数や引数のcall treeのscopeの中に構成されていくような不思議な感覚
2026/08/16(日) 14:28:36.72ID:a4RxNiOb
ただ、毎回何でもかんでもうまくいくとは限らないし
再帰や関数変化の考え方など頭に少し負担がかかる
2026/08/16(日) 14:36:36.64ID:9AyjbUVF
デザインパターンのうち複数の型が出てくるものは二つのパターンにまとめられるよ。

(1) 利用する関係なら、インターフェースを境界にして、利用する側はインターフェースのみ使い、利用される側はインターフェースを実装してそれのみ公開しましょう。
そうすれば両者を疎結合にできますよ。

(2) 機能や動作に共通事項があるなら、それをインターフェースして、各型で実装しましょう。
そうすればそのインターフェース抽象型を用いた共通コードにできますよ。

もちろん(1)(2)は部分的に重なっているからね。
さらに高階関数を引数に取るものもこのインターフェース抽象型パターンは使われているね。
高階関数とは両立する話だよ。
2026/08/16(日) 15:02:31.66ID:Ody7f1dX
Fizz buzzって知らなかってけど、wikipediaでルールを読んでみると曖昧で、
いくつかの解釈ができてしまう。
英語版と日本語版では異なる解釈もできる。
だめな仕様書の例ですね笑(jokeですからね念のため)。
オブジェクト(指向)を使うという限定で、extends/interfaceなどを使って書いてみるのはたしかにおもしろい。
225デフォルトの名無しさん
垢版 |
2026/08/16(日) 15:24:35.35ID:4EyRDcWH
別にインターフェースである必要すらなくて
1. 利用する関係なら利用側が必要とするものだけを依存関係の境界にして 利用側は相手の具体的な実装詳細に依存しないようにする
2. 機能や動作に共通事項があるならそれを共通の抽象として切り出す
かな?
Rustにあわせてインターフェースを抽象的な契約と言い換えてもいいけどZigだと必要な操作を満たす型をcomptimeで決めれば済むからねえ
Rustに合わせてインターフェースを抽象的な契約と言い換えてもいいけど Zigだと抽象的な契約を用意せずに利用側が必要とする操作をcomptimeで要求して具体型がそれを満たすことをコンパイル時に検証すれば済むからね C++のテンプレートの考え方と似てる
226デフォルトの名無しさん
垢版 |
2026/08/16(日) 15:28:09.68ID:4EyRDcWH
Zigよ もっと流行れ
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();
}
228デフォルトの名無しさん
垢版 |
2026/08/16(日) 16:52:26.67ID:4EyRDcWH
>>227
Zigはinterfaceがないから型安全性が低いという指摘は論点がずれてる気がする
不便なのはともかくとしてね
Zigのstatic polymorphismは利用側が要求する操作を満たしているかのほうを何の型なのかよりも重要視してる
comptimeとanytypeで具体的な型がコンパイルで決まるしその型に必要な操作がなかったらコンパイルエラーにちゃんとなる
だから型安全性が低いんじゃなくて名前付きの契約で型を分類制約する仕組みがないというほうが近い
Rustのtrait/interfaceをそのまま使えないのと型安全性が低いのは分けて考えるべき
2026/08/16(日) 17:01:36.86ID:bGqhVQCa
interfaceで明示した方が可読性も保守性も良い
2026/08/16(日) 17:19:52.45ID:0pgo/mMd
>>228
Zigのような構造的型付けはインターフェース明示より型安全性が低いと言われているね
例えばたまたまメソッド名とシグネチャが一致していれば別のものでも区別できず通ってしまうため
231デフォルトの名無しさん
垢版 |
2026/08/16(日) 17:20:26.30ID:4EyRDcWH
>>229
考え方の違いだね
RustやJavaは抽象的な契約を一箇所にまとめることで可読性や保守性を高めるのに対して
Zigは不要な抽象を作らずに実際に必要な操作だけを書くことでコードを単純にするっていう考えだから
232デフォルトの名無しさん
垢版 |
2026/08/16(日) 17:26:17.84ID:4EyRDcWH
>>230
RustやJavaにあるような抽象的な契約の考えをZigに持ち込むのがそもそもパターンとして間違ってる
2026/08/16(日) 17:36:12.25ID:D1LzEAcA
>>231
Zigで型をanytypeと書く暇があったら代わりにinterface名を書けばいいよね
そこでのコードの長さは変わらなくてZigは可読性の低下だけ招いてるような
Zigが節約できたのはinterface宣言つまりmethod名と型signatureを列挙することだけかな
可読性の低下と引き換えにZigが得たものが小さすぎて割に合わない気がする
234デフォルトの名無しさん
垢版 |
2026/08/16(日) 18:50:20.61ID:4EyRDcWH
>>233
間違ってないよ 可読性や保守性の問題は抱えている
それと型安全性とは別の話だよねってこと
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
型安全じゃないなら何と表現するのが良いのかな、意図安全?
2026/08/16(日) 21:38:31.47ID:3V/Fi6zs
Zigはそのanytypeの時に複数の異なる型がやって来るわけだけど
生成コードは単相化?それとも動的ディスパッチ?
2026/08/16(日) 22:34:55.59ID:Co7DsicL
Zigとかどうでもよくね
思想が他と違うだろあれ
2026/08/16(日) 22:37:18.88ID:SoMBue1h
>>202
>>177を見れば一目瞭然だけどRustでも問題起きてるよ
Fragile Base Class Problemと同じFragile Trait Problem
Rustと違ってGoでは起きないけどね
2026/08/16(日) 23:34:48.38ID:4RZhk79G
それ起きるのなぜかfinalがないRustだけだろ
2026/08/17(月) 00:16:26.92ID:38V+3mdM
そもそもRustでは起きない
2026/08/17(月) 00:19:02.71ID:O4jJSPJp
>>242
どうしてそう考えるの?
2026/08/17(月) 09:45:51.74ID:UewEXcwQ
>>242
主語や目的語を誤魔化しているところを見ると
「(複おじの考える問題は)Rustでは起きない」ということなんだろう

Rustで起きないならJavaならなおさら起きないけどね
2026/08/17(月) 12:16:16.38ID:CJr3tgZ2
論破されても同じ主張を根拠無く延々と繰り返す
それが複おじ!!
246デフォルトの名無しさん
垢版 |
2026/08/17(月) 13:29:22.69ID:wAb5rDbA
で、お前ら実際にクラス継承なんか使ってんのか?
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見て時間の無駄は草
2026/08/17(月) 14:58:45.13ID:GxsMwSQY
>>249
それどこよ?
253デフォルトの名無しさん
垢版 |
2026/08/17(月) 15:01:13.59ID:9dsT8/CZ
>>252
うそやで
2026/08/17(月) 15:03:07.13ID:GxsMwSQY
>>247
害が少なくて役に立つところには、たまにor稀に使う
そうじゃないと多用したらプログラムがわかりにくくなってしょうがない
拡張などメンテでは解読とあっちこっち目を通して整合させたり手が掛かるし
2026/08/17(月) 15:03:50.96ID:GxsMwSQY
>>253
だよな
つかはったりもええ加減にせーや
2026/08/17(月) 15:05:08.29ID:GxsMwSQY
>>254
バグ紛れ込むし見つけにくいし
257デフォルトの名無しさん
垢版 |
2026/08/17(月) 15:52:04.48ID:DZRCEu47
今まで単に使う場面が無かったから使ったことがないな
2026/08/17(月) 17:38:40.01ID:hu6Kc+Um
みんな仕事したことないのか
259デフォルトの名無しさん
垢版 |
2026/08/17(月) 18:00:39.50ID:9dsT8/CZ
いやまあライブラリ作るのでない限り継承が必要になることはないでしょ
お仕事では既存のライブラリを使ってアプリ作るほうが圧倒的に多いだろうしそんなもんじゃないかな
2026/08/17(月) 18:37:49.03ID:GiCS5tuu
そんな小規模な開発じゃ使わないからw
2026/08/17(月) 19:17:05.30ID:P355WQDR
大規模な開発で濫用すると滅びるぞ
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してないやつはいないよな?
俺はどっちもやってないけどな
2026/08/17(月) 22:32:08.18ID:kjYhoonu
>>217 >>218 2012年ころ試しに書いたFiizBuzzのPerlコード見つかった

for (1..20) {
 $a = '';
 $a = 'fizz' if 0 == $_ % 3;
 $a .= 'buzz' if 0 == $_ % 5;
 $a ||= $_;
 print "$a\n";
}


$ perl FizzBuzz.pl
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
266デフォルトの名無しさん
垢版 |
2026/08/18(火) 06:20:16.09ID:9HbNxAXp
>>265
きたねー言語だなぁ
2026/08/18(火) 07:06:16.69ID:mY9waEio
>>266
綺麗に書いてみて
2026/08/18(火) 07:09:42.79ID:mY9waEio
抽象型やinterfaceやtraitやZigを活用したらどのくらいきれいになるんだろう
2026/08/18(火) 07:52:58.90ID:qWsaXKMs
そりゃ文字列"fizzbuzz"は直書きせずともcomptimeで生成だろ
270デフォルトの名無しさん
垢版 |
2026/08/18(火) 09:09:48.18ID:CwdGUKcu
>>267
見せてやるよ
オブジェクト指向の真髄ってやつをな
https://paiza.io/projects/jndrJpCJ34RQgtrNFNvG9g?locale=ja-jp
271デフォルトの名無しさん
垢版 |
2026/08/18(火) 09:21:01.28ID:s6UVuJiP
テンポラリ変数嫌いすぎて可読性落とす書き方するやつってけっこういるよな
2026/08/18(火) 09:49:26.70ID:dgmmJ4dW
10行で書けるけどそれだと金にならないから100行に水増ししてかっこいい雰囲気を醸し出せる
それがオブジェクト指向
273デフォルトの名無しさん
垢版 |
2026/08/18(火) 10:05:16.38ID:kPRCdywZ
オブジェクト指向前だって#defineがズラズラ並んでる見づらいコードだったけど
2026/08/18(火) 10:53:18.24ID:gcpAV276
>>270
目的の関数とメイン関数は分けなければいけない
今回は無限FizzBuzzイテレータを返すだけの関数を分離すると望ましい
データ生成とそのデータのビューアーも分離しなければいけない
文字列化するのはビューアーの役目であり途中のデータは可能な限り軽い小さなものにする
固有のロジック部分の分離も望ましい
今回はもちろんFizzBuzzへの変換部分を分ける
2026/08/18(火) 11:29:29.44ID:mY9waEio
>>270
ヒー、よくこんな糞コードを人前に晒せるな
笑いをとるネタでやってるなら役者だわ
2026/08/18(火) 11:39:15.61ID:mY9waEio
凝った技術を使って 後退している感じ
まあ遊びとしてはありかな
2026/08/18(火) 11:44:50.67ID:FI1FzRN/
>>271
長い数式や条件式がある場合は短く分けて意味が分かる一時変数名を付けることが必須だけど>>270に一時変数が必要な部分はないよ
役目毎に関数を分けて意味が分かる関数名を付ける必要はあるけどね
278デフォルトの名無しさん
垢版 |
2026/08/18(火) 11:58:25.60ID:s6UVuJiP
>>277
この内容で関数分けは逆にやりすぎだよ
2026/08/18(火) 12:03:00.45ID:mr91AiPO
>>278
Mainに本体を書くやつは恥
20個という前提にない指定が本体に紛れ込んでいるのも恥
280デフォルトの名無しさん
垢版 |
2026/08/18(火) 12:09:50.58ID:s6UVuJiP
>>279
レビューポイントがずれてるところ見ると例の人か
2026/08/18(火) 12:12:44.41ID:yVjtC2wq
ビュー部分とロジック部分は分けるべきだろうね
2026/08/18(火) 12:12:55.79ID:mY9waEio
レビュー言ってる人が書くともっとヒデ―んだろうな…
2026/08/18(火) 12:22:41.95ID:zZZZox/S
ノウハウが盗まれないように最初から難読化しているのに、
それをextendsがevilだといわれちゃうと心外ですよねぇ笑。
それは単なるtrapだ。trapに引っかかるようなバカは不要という世界。
2026/08/18(火) 12:25:26.30ID:Wbf7Xhfh
少なくとも個別テストができるレベルでの関数分けは常に義務付けられる。
データ生成部分とデータ表示部分を分離しなさいという常識も、混在は可読性を下げるだけでなくテストを困難にするためだ。
2026/08/18(火) 12:30:03.24ID:zZZZox/S
test firstはtestを先に書け、ということではなく、
testすること/できることを前提に設計しろ、ということ。
Unit testできないもの、integration testできないプログラムはゴミでしかない。
2026/08/18(火) 12:41:42.10ID:mY9waEio
結局、カルトな迷信から抜け出せないのね
2026/08/18(火) 12:54:55.98ID:BvR5dCBy
文字列への変換はできる限り遅延させて可能なら表示の直前まで遅延させることが望ましいという原則
これは抽象的なデータとして持っていた方が可読性と保守性に勝るだけでなく
高速化や省メモリ化の観点からでもあるね
文字列にして持っていると格納メモリが増えて比較も遅くなっちゃう
2026/08/18(火) 12:56:42.55ID:zZZZox/S
Fizz buzzについては、wikipediaのルールを基準として、それを仕様とみなせば、
仕様をみたしていないプログラムが多い(日本語版wikipediaを含む)。
これを試験に出すとすると、仕様というものを理解できていない会社が多い。
結果が同じであればよいのではなく、保守や運用を考えると仕様を満たしていることが必要。
2026/08/18(火) 14:51:02.89ID:mY9waEio
wikipediaのルールが実は違ったらどーすんの?
290デフォルトの名無しさん
垢版 |
2026/08/18(火) 16:49:24.64ID:CwdGUKcu
>>288
FizzBuzzじゃなくてFizz Buzzが正しいんだとかそういうこと?
291デフォルトの名無しさん
垢版 |
2026/08/18(火) 16:50:03.29ID:CwdGUKcu
>>275
…はー…我慢!我慢!
2026/08/18(火) 17:04:30.03ID:mY9waEio
もしかして頑張って書いてくれたんだ、ゴメンチャイ
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点だろう。
また、確認したら逆切れされた、とかいう場合は、その会社には行かない/やめることが重要だ笑。
2026/08/18(火) 18:45:23.15ID:UHB640UT
>>291
あのフリからのあのコードだから普通の人はネタだと分かるから心配しなさんな
2026/08/18(火) 19:03:06.87ID:mY9waEio
>>293
かたいのはチンチンだけにした方がいいよ
2026/08/18(火) 19:07:28.34ID:1F5abdGh
>>278
関数分けされてないことだけが今回のコードの問題点だよ
少なくともテストができるように分離かな
テストではなくprintするだけにしてもメイン側に書いていいことは1から20までやprintのみ
2026/08/18(火) 19:37:50.56ID:4nWkMale
ネタで5chに晒すトイプログラムは、あれこれ欲張って機能付帯するよりエッセンスだけ凝縮したような物でいいと思うがな
極論だが、one linerでも話のネタになればそれでもいいんジャマイカと思う
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/
結果だけなら無限ジェネレータ、イテレータ使うのがシンプルで無駄ないけど
初学者が分岐と文字列出力駆使してコーディングできるかのお題だから
経験者はあたたかくみまもるのが正解
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(())
}
}
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);
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")
}})->();
2026/08/19(水) 05:53:05.29ID:jKqAYIeP
>>299
添え木するか ト
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:PkKxELQ5
>>301-303
どれも汚くて読みにくい言語だなぁ

やっぱりBASIC言語がいいな
307デフォルトの名無しさん
垢版 |
2026/08/19(水) 09:25:42.01ID:zfDVRijx
>>306
はよ
2026/08/19(水) 09:26:57.21ID:AOQ3QAZ6
>>301
これは明らかにやっちゃいけない役割分担
>>287や>>300でRustの自演お膳立てしておいてこれはない
2026/08/19(水) 11:30:51.59ID:JEHGtM5b
オブジェクト指向をバカにしてるやつ(≒苦手にしてるやつ)ほど役割分担下手だよな
2026/08/19(水) 11:32:25.08ID:jKqAYIeP
>>309
>>268
2026/08/19(水) 12:47:31.88ID:6v15mJkM
>>309
めちゃくちゃわかる
脳の使い方に違いがありそう
2026/08/19(水) 13:00:20.84ID:IT0gHGzs
Javaは書いたことがないけど、>>270の内容は大体分かる(と思う)。分かるんだけど、たとえば>>265みたいなごくシンプルなコードと比べて、コード量が増えたことに見合うだけのメリットがあるのかよくわからない。
2026/08/19(水) 13:13:14.33ID:Wk2G6dYo
>>308
FizzBuzzは数値をあるルールで文字列に変換する問題だよね
そしてRustで文字列に変換する時はDisplayトレイトを実装するのがお約束
>>301のコード以外に適切な方法ある?
314デフォルトの名無しさん
垢版 |
2026/08/19(水) 13:25:34.76ID:DVblsqcj
>>312
前者は数列処理にFizzBuzzのルールを与えたプログラム
後者はFizzBuzzの問題を解く為に構成されたプログラムという理解
メリットは…なんだろう
315デフォルトの名無しさん
垢版 |
2026/08/19(水) 14:46:16.71ID:zfDVRijx
>>306
はよ
https://www.jdoodle.com/execute-freebasic-online
2026/08/19(水) 15:09:53.60ID:clBhGGD3
>>313
煽られただけだと思うよ
317デフォルトの名無しさん
垢版 |
2026/08/19(水) 16:47:55.93ID:GgmociGN
やるとしたらfmt::Displayの実装とFizzBuzz判定の実装を別々に分担するくらいか?
あと個人的にはifじゃなくてmatchでよくね?と
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(())
}
}
2026/08/19(水) 17:27:41.72ID:76BzD64w
他の例のように20まで表示したい時は

fn main() {
for z in FizzBuzz::iter().take(20) {
println!("{z}");
}
}

>>317
FizzBuzzのルール
3で割り切れる時はFizzと言い
5で割り切れる時はBuzzと言い
結果として15で割り切れる時はFizzBuzzと言うことになる
これをそのまま実装したのが>>318
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); }
}
2026/08/19(水) 18:32:05.09ID:h5yOG9hX
これは想定外の重症度
汚コード複製おじさん酷すぎだろ
2026/08/19(水) 19:33:00.25ID:1B1Sgr4M
immutableなclassとstreamでmonadicに、各methodは1行の式とした例。
改行制限と空白制限で、ちょっとおかしな表記になっている。
2026/08/19(水) 19:34:16.89ID:HQ3bB/34
>>320
100までとか
main関数とか
なぜclass FizzBuzzの中にあるんだよ草
2026/08/19(水) 19:40:28.85ID:1B1Sgr4M
くすくす。仕様を満たすためだよ。
2026/08/19(水) 19:48:00.60ID:yaDN1rR6
ここはオブジェクト指向でFizzBuzzを書くとどうなるかの話だよな
class FizzBuzzに属するものと外部のものを分けないとな
2026/08/19(水) 20:06:36.33ID:1B1Sgr4M
generator込みの完結したclassだがね。UnitTestにも対応してるし。
プログラム書いたことある?
2026/08/19(水) 20:31:50.49ID:xLZSPR7N
>>318は改行しまくりスカスカでも収まってるのに
>>320は改行を詰めてぎっしりコード量が多くて見にくいのはなぜ?
328デフォルトの名無しさん
垢版 |
2026/08/19(水) 20:47:05.92ID:gE5f7kH9
糞言語ってことよ
2026/08/19(水) 22:27:30.40ID:KYbvI00a
>>320はgcd最大公約数を求めてるけど
その方が速いとか有利とか何かあるの?
2026/08/19(水) 22:31:51.05ID:1B1Sgr4M
https://paiza.io/projects/zW-QQAk1SV2qaU7Iv3Kqtw
FizzBuzz classがMain classになっちゃったけど、しかたない。
最大公約数で扱ったほうが楽だし、意味的にはGCD使ったほうが正しい。
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();
};
2026/08/19(水) 22:58:17.52ID:Oc+7d+Ap
>>330
class Mainとclass FizzBuzzに分けようぜ
2026/08/19(水) 23:06:14.82ID:1B1Sgr4M
plaza.ioは複数class書けるね。しばらくはこれを使おう。java18らしいし。
でも、本来はclass FizzBuzzひとつのオブジェクト指向の例なので、
MainはFizzBuzzに読み替えてほしい。
334デフォルトの名無しさん
垢版 |
2026/08/19(水) 23:32:28.93ID:DVblsqcj
1文字でFizzBuzz解ける言語があるらしいな
2026/08/19(水) 23:59:25.63ID:iJ3dDJMB
>>330
意味的にGCDを使うのは間違っている
さらにGCDは計算時間がかかり不利だ
途中で除数が定数でなくなるためDIV命令が必要になるためだ
普通に3で割る余りと5で割る余りの計算ならDIV命令が不要で速い
2026/08/20(木) 00:06:45.18ID:QLX9OLVH
定数で割った時の余りは掛け算とシフトと引き算で済むから速いんだよな
2026/08/20(木) 00:21:35.93ID:IBxNVMcV
DIV命令? あったっけ?
2026/08/20(木) 00:47:45.39ID:IBxNVMcV
めんどくさいのでBigInteger#gcd(BigInteger)使ってるけど、
15とのGCDで3,5,15の判定だけなので自作すればもっと速いだろう。しかし、速さの指定は仕様にない。
意味的には15との最大公約数で振り分ける。保守しやすい。
if文が2つ以上あるとバグが出やすくなる笑。
2026/08/20(木) 00:56:39.43ID:QLX9OLVH
CPUの割り算命令DIVは遅いんだよ
ただし定数での割り算は掛け算とシフトで代替できるから速い
2026/08/20(木) 01:32:57.14ID:ijUJjMtb
その前にだな、
まともに見れるコードも書けんくせに
オブジェ指向で蘊蓄垂れていたのか君らは
2026/08/20(木) 01:36:09.50ID:IBxNVMcV
GCDアルゴリズム実装ではなくCPUのDIVの話ね。
アルゴリズムならマルチコア上で速そうなのを考えてみよう。少しだけ思いついたので。
342デフォルトの名無しさん
垢版 |
2026/08/20(木) 01:56:28.80ID:aOa274Oy
https://paiza.io/projects/BA7H5VNcMAbOvwmXRnPAmw
343デフォルトの名無しさん
垢版 |
2026/08/20(木) 02:00:43.32ID:aOa274Oy
compactの前に.lazyわすれた
遅くなるけど概念的にそうしたい
2026/08/20(木) 03:02:21.65ID:PMhZJhSw
FizzBuzzのように定数で割る時
商は魔法により掛け算とシフトで求まる
余りはさらに商に掛け直して元から引き算で求まる

ところがだ
FizzBuzzで余りを求める必要ないのだ
余りが0かどうか判ればいい
強力な魔法を使うと掛け算と比較で求まる
2026/08/20(木) 03:19:24.13ID:PMhZJhSw
Fizz判定は x % 3 == 0 が真かどうか
xがeaxレジスタに入っている時
imul eax, -1431655765
cmp eax, 1431655766
この結果CFフラグ=1ならFizzだとわかる
強力な魔法のおかげで実は速い
346デフォルトの名無しさん
垢版 |
2026/08/20(木) 08:18:28.31ID:kHN2H/5S
>>320
Fizz、Buzzに加えてPop、Jazz、Rockに対応してください

3 → Fizz
5 → Buzz
7 → Pop
11 → Jazz
13 → Rock

>>322
> immutableなclassとstreamでmonadicに、各methodは1行の式とした例。

モナドを使ってないのにモナディック ( ⊙ω⊙ ) !!?
347デフォルトの名無しさん
垢版 |
2026/08/20(木) 09:08:56.05ID:q4+A3WuM
オブジェクト指向じゃないほうがシンプルに作れるものを
オブジェクト指向で作ろうとするのは無駄でしかなく、オブジェクト指向の啓蒙にはならない
348デフォルトの名無しさん
垢版 |
2026/08/20(木) 09:32:50.30ID:o7Pb5BUg
AI時代に最適な言語とは
2026/08/20(木) 09:39:55.23ID:m8+NKV8o
>>348
英語、次点で日本語
350デフォルトの名無しさん
垢版 |
2026/08/20(木) 11:01:49.24ID:o7Pb5BUg
日本語は文字圧縮率高いからAIに向いてるよな
2026/08/20(木) 12:05:54.04ID:vH5dPVEC
>>350
向いてない

対AIの情報圧縮率は情報量/文字数じゃなくて情報量/トークン数なので日本語の情報圧縮率はむしろ低い
日本語に最適化された生成AIが出てきたとしても今の汎用生成AIで英語を使うのと同じレベルにはまずならない
ちなみに文字数ベースの情報圧縮率で言えば日本語より中国語のほうが上
352デフォルトの名無しさん
垢版 |
2026/08/20(木) 13:24:05.04ID:q4+A3WuM
言語ってやれることに縛りがないマシン語一択よ
2026/08/20(木) 13:47:22.14ID:m8+NKV8o
バイナリなんて扱いが面倒で
しかもCPUやOSによって全く使い物にならないから
それだけは無い
2026/08/20(木) 14:18:30.50ID:s0ayJ18Z
>>345
余りで場合分けしたりGCD求めるより素直に判定する方がええんか
2026/08/20(木) 16:44:10.19ID:qoBWelP1
>>354
数値リテラルならな
>>346の様な(素数,表示文字列)のリストを受け取る形式にすると
3とか5が定数じゃなくなってコンパイラが>>345の最適化をしてくれない
2026/08/20(木) 16:59:35.71ID:Q5WTv99g
「FizzBuzzのプログラム書いて」の指示だけで済むのになに前時代的なことやってんの?www
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による言語の二層化とかあるみたいね
2026/08/20(木) 19:40:52.66ID:IBxNVMcV
>>346
まあ、モナドではあるが、厳密なモナド則には従わない。
と、思ったのですが、この限定的な状況では、モナド則を満たしていました。

また、そりゃ、void main(String[])内で、ベタに手続き型で書けば速いわけですが、
15と固定でGCDを作ってみたら、同じ速さになりました。手動展開するとベタなものと同じです。
オブジェクト指向設計の形式は同じとして計測。
360デフォルトの名無しさん
垢版 |
2026/08/20(木) 19:43:41.33ID:v7D8p6Cq
>>356
trait implをあえて使うとそうなるっていう説明用サンプルじゃないの
361デフォルトの名無しさん
垢版 |
2026/08/20(木) 21:03:19.48ID:kHN2H/5S
>>359
いやー俺も圏論詳しくないけど
君が言ってることはデタラメすぎる気がする
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がモナドです
ご清聴ありがとうございました
2026/08/20(木) 22:16:51.48ID:C4aTds+L
error: Unexpected symbol `['
2026/08/20(木) 22:20:08.69ID:IBxNVMcV
>>361
モナドですけど何か?
2026/08/20(木) 22:57:28.02ID:vi4f/pAg
>>362
SelectManyは他言語では単なるflatmapだぞ
誰でも日常的に使うものに過ぎない
2026/08/20(木) 23:13:28.71ID:z4h/0sw5
>>361
flatMapがモナドじゃなくてflatMappableがモナドやで
>>362で言えばmsのほうやで
2026/08/20(木) 23:52:42.25ID:h+f/dAtq
>>362の無能さは(1, 100)でよくわかる
100にするなら少なくともそこは105だろ
368デフォルトの名無しさん
垢版 |
2026/08/21(金) 00:12:08.26ID:Gi1J9j3d
>>364
違うと思うけど明日AIに聞いてみるわ、お休みモナ
2026/08/21(金) 05:47:35.54ID:beX5364R
>>362
生成AI製か
2026/08/21(金) 10:51:05.66ID:I6E5haBJ
>>368
引っかかってるのは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
> モナド則を満たしていました

これも偽だよ
372デフォルトの名無しさん
垢版 |
2026/08/21(金) 11:47:36.75ID:Gi1J9j3d
>>370
どうでも良いといえばどうでも良いんだけどさ
暇だからモナドで何か話を広げてもらえない?
2026/08/21(金) 11:48:44.92ID:ZIDlXGUM
( ´∀`)
374デフォルトの名無しさん
垢版 |
2026/08/21(金) 12:29:56.97ID:2CvgJbgX
>>372
Functor, Applicative は合成も Functor, Applicative になるけど, Monad は閉じてない.
他言語知らぬが, Haskell では少なくともそう.
2026/08/21(金) 12:58:18.07ID:r0Io5phJ
>>371
モナドですけど何か?
2026/08/21(金) 13:15:32.17ID:iTOGPWmY
>論破されても同じ主張を根拠無く延々と繰り返す
>それが複おじ!!

汚コードを披露したがるところといい精神構造が一緒だよね
二代目複おじと呼ばれるのも納得
2026/08/21(金) 14:34:41.44ID:Ox2yfRDK
flatMapすら使ってない方は論外として
こんな日常使うものを使っているだけでモナドと呼ぶかどうかという話だろ
flatMap: Stream<A> -> (A -> Stream<B>) -> Stream<B>
2026/08/21(金) 14:59:07.32ID:Eo21n+pB
>>377
日常使うものかどうかと
モナドと呼ぶかどうかに
何の関係が?
2026/08/21(金) 15:01:40.43ID:KDkdbSVN
リストってモナディックだぜっ!!
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";
}
381デフォルトの名無しさん
垢版 |
2026/08/21(金) 15:33:07.11ID:Gi1J9j3d
>>377
モナド則満たすしモナドでしょ
https://paiza.io/projects/vlUBccWkc0ctYRvsyFJJnw

モナド則もそりゃそうなるでしょってものだしモナドはそういうものってことでいんじゃないかな
382デフォルトの名無しさん
垢版 |
2026/08/21(金) 15:35:38.76ID:Gi1J9j3d
>>374
わかりみが深い、むかしflatMapを自作しててわけわからんとなった経験がある、そういうことだったのね
2026/08/21(金) 15:44:14.76ID:HqsLRPon
もっと単純なMaybeやOptionもモナドだぞ
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)
2026/08/21(金) 16:20:56.65ID:JOjsNGZv
結論
FizzBuzzでモナドを使うメリットはない
386デフォルトの名無しさん
垢版 |
2026/08/21(金) 16:32:46.73ID:+7OJU/se
適当なお題としてはGraphQLの応答とか
2026/08/21(金) 16:54:22.13ID:beX5364R
>>385
どういうものにメリットがあると思う?
2026/08/21(金) 16:57:15.65ID:oEi9UUz1
純粋関数縛りなHaskellで、モナド則を満たすデータ構造で副作用を表したのが肝であって
縛りのない言語でモナドを強調しても意味ない、ただ関数型チックな書き方がしたいだけの人
2026/08/21(金) 17:15:28.71ID:beX5364R
ま確かに興味本位だなw
2026/08/21(金) 17:18:42.94ID:MKiwKoi2
普通の言語ならモナドに縛られずに書いた方が書きやすく見やすい
flatmapなどもモナドの観点なく使えばよい
2026/08/21(金) 17:34:36.23ID:r0Io5phJ
https://paiza.io/projects/OHbT6kBvhYGdSm036ZGHCg
モナドプログラミングではなくMonadicプログラミング。
純粋ではないがMonadとみなせるものを扱う。
2026/08/21(金) 17:36:15.66ID:beX5364R
普通の言語でモナドにこだわらずにflatmapを使うメリットって逆に分からん
階層リストの一層平坦化変形にメリットがあるとかかい?
2026/08/21(金) 17:41:42.40ID:beX5364R
>>391
もしかして、正直者だけにMainの他にも見えるのかな?
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の性質を「受け継いでいる」。
この部分は場のオブジェクト指向に相当する。
2026/08/21(金) 17:44:00.83ID:8LreK5vZ
>>392
flatmapは各種データを扱う時にいつも使う
どんな分野のデータにも同じ構造が出てくるけど
説明しやすい例だと
アーティストは複数のアルバムを出している
アルバムには複数の曲が入っている
アーティストが出している曲全てを得るにはflatmap
2026/08/21(金) 17:45:01.94ID:r0Io5phJ
>>393
うむ、正直者にだけ見えます。
2026/08/21(金) 17:47:27.65ID:beX5364R
>>395
なるほどね
おれは普段祖いうのはアクセス演算子繋いでリテラルに書いてるわ
2026/08/21(金) 17:49:01.43ID:fMkK+Qnb
>>394
場のオブジェクト指向なんて用語は存在しない
2026/08/21(金) 17:51:30.66ID:fMkK+Qnb
>>397
普通にプログラミングしていたら一覧を遅延リスト(イテレータやストリーム)で欲しいからflatmapが良いね
わざわざ一覧のリスト生成するのは無駄
2026/08/21(金) 17:53:42.88ID:beX5364R
遅延リストの登場が必要なシーンて実践では意外と少ないんだよね。
使ってもいいんだろうけどもね。
データ構造は既にメモリ上にDOMみたいに展開されている場合が殆どだし
2026/08/21(金) 17:54:27.71ID:r0Io5phJ
詳細は語らないが、Stream<String>が、class FizzBuzzの性質を受け継いでいることに気づいた。
これは本家 場の量子論や量子アルゴリズムに応用できるだろう。
(量子コンピューティングにおける)位相kickbackの正しい姿が見えた感じ。
くだらないことをやっていたら、かなりのお宝を発見した、と思う。
2026/08/21(金) 17:57:46.76ID:r0Io5phJ
>>398
そりゃそうだ、お盆前におれが作ったやつだから。
2026/08/21(金) 17:58:49.03ID:beX5364R
もうご先祖様は帰ったぞ
2026/08/21(金) 17:59:49.88ID:2k7SrpH+
>>394
Stream関手がListやMaybe/Optionなどと同じくモナド則を満たすのは良い

ただしFizzBuzz -> Stringの射を作れる段階で関手によるリフト(fmap)で
Stream<FizzBuzz> -> Stream<String>が得られるので
モナド則によるbind( >>= )はあえては必要ない
2026/08/21(金) 18:01:09.54ID:I1Nsd4kh
>>400
すでにメモリ上にあっても一覧にはなっていないでしょ
あなたの言うように階層構造になっているんてしょ
それならflatmapなどを使えばそのまま一覧を得られるでしょ
あなたはflatmapを使わずにどうコードを書いてるの?
2026/08/21(金) 18:12:47.06ID:beX5364R
>>405
深い方向に成長した階層構造ならループとアクセス演算子になっちゃうな
2026/08/21(金) 18:14:27.74ID:ulIeP98F
なんかオブジェクト指向と関係なくね?
2026/08/21(金) 18:18:43.06ID:r0Io5phJ
>>404
ジェネリックをどう扱うかによって変わると思う。
ドットでつなぐというのはbindに相当する。
ともかく、純粋ではないので、「みなし」によってMonadとして扱い、
Monadの利便性を使う。圏論における自然変換っては(数学的な)「みなし」の一種なのかも。
2026/08/21(金) 18:20:48.47ID:sroAx62X
>>406
ループなんか使ってお子様プログラミングしていたら一覧を他の関数に渡せないぞ
様々な一覧を共通の関数に渡せないダメなコードになる
2026/08/21(金) 18:25:11.45ID:r0Io5phJ
>>407
Monadという対象(概念も含む)を扱っているのでオブジェクト指向でよいと思う。

とはいえ、おれの興味は量子コンピューティングへの応用(位相kickback)に移ってしまった。
わざわざ定数をclass FizzBuzzに押し込めたのは、それを場とみなすためだった。
2026/08/21(金) 18:38:48.61ID:ulIeP98F
局所的な実装方法をウダウダやってるのがオブジェクト指向?
2026/08/21(金) 18:48:20.85ID:8pVoXpeO
動くコード書けないやつがウダウダ長文連レス書くクソスレがこちらです
2026/08/21(金) 18:58:30.38ID:C/iR3xUF
まともなプログラミングをすると自然にオブジェクト指向になる
普通に関連データを構造体にまとめるとオブジェクト指向の第一歩
その構造体を用いる関数をそこに集めればオブジェクト指向の完成

言語によっては構造体に関連関数を紐付ける機能がある
構造体をクラスと呼ぶ言語もある
414デフォルトの名無しさん
垢版 |
2026/08/21(金) 19:10:15.58ID:+7OJU/se
良し悪しの話ではないけど
クラス指向だと限界があるからOOP言語にはほぼAOP/DIな魔法がついてくる
2026/08/21(金) 19:29:01.99ID:YiF5GLcE
そこは結局interfaceやtraitを使え!という結論になるよな
416デフォルトの名無しさん
垢版 |
2026/08/21(金) 20:29:52.42ID:p4A6Ej6J
そもそもなんでこんなに沢山プログラム言語があるんだ
何個かでいいだろ
2026/08/21(金) 20:37:11.24ID:tuPqJn8K
>>416
実用的な言語の観点だと
C言語は速いけど安全性と機能不足に難があった
そこで速さを犠牲にして安全で機能豊富な言語がたくさん生まれた
ところが
2026/08/21(金) 20:42:54.89ID:tuPqJn8K
ところがC言語とほぼ同じ速さで動くRustが登場
これまでより高い安全性を満たしつつ機能も洗練されている
ただし習得に少しかかる問題があった

ところがAIにより学習問題は解決
コンパイルが通るだけで様々な安全性を満たしてくれるため
コード生成させる時もAIと相性が抜群に良い
419デフォルトの名無しさん
垢版 |
2026/08/21(金) 21:00:17.29ID:Gi1J9j3d
でもコンパイルが遅くてプログラムの規模が大きくなると
コンパイルが終わらないんだろ、大変だな
2026/08/21(金) 21:05:03.75ID:lo3FELaH
>>414
クラス指向なんて言葉ないだろ
421デフォルトの名無しさん
垢版 |
2026/08/21(金) 21:21:14.34ID:+7OJU/se
>>420
わかった
みなさんどっちも使われてるけどbasedをつかうね
プロトタイプベースと分けたかったのは伝わった?
422デフォルトの名無しさん
垢版 |
2026/08/21(金) 21:50:54.93ID:Gi1J9j3d
モデリングすることが良いことだというバイアスが
オブジェクト指向の印象を良くないものにしているような気がする
シンプルな処理をシンプルに書くのが大事だ
Enterprise Hello Worldを見てそう思った

https://github.com/Wolfdp/Hello-World-Enterprise-Edition-CSharp
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で全てが書ける」わけではないと言うことになるし
2026/08/21(金) 23:17:11.89ID:vPcZCoYZ
>>425
これまで長い年月をかけて書かれたコードのメモリ安全性を証明する試みがいくつも行われてきた
しかしいずれも完成しておらず与えられたコードが安全かどうか確実に判定できない現実がある
これはAIが出力したコードが安全かどうか100%の判定ができないことを意味する
427デフォルトの名無しさん
垢版 |
2026/08/21(金) 23:20:29.95ID:Gi1J9j3d
> AIで完全に書ける

Rustじゃないと確認できなくね?
428デフォルトの名無しさん
垢版 |
2026/08/21(金) 23:22:58.22ID:1+5SHfXi
プログラミング言語の中でRustだけがメモリ安全性からデータ競合安全性までRustの言語仕様により100%保証できるよ
つまりコンパイルが通れば100%保証される
AIはコンパイルエラーを見ながらコンパイルが通るまで頑張るだけで100%保証されるからAIとRustは相性が最高に良いんだよ
429デフォルトの名無しさん
垢版 |
2026/08/21(金) 23:25:20.18ID:Gi1J9j3d
JavaScriptラインタイムのBunはAIで作られていて
プログラム言語をZigからRustに変えた
Zigだとメモリ管理のバグが頻発して開発コストが高かったからだ
いまのAIでは無理だな、Rustへのトランスパイラを定理証明器で作るとか
そういう方向が現実的なんじゃねえかな
430デフォルトの名無しさん
垢版 |
2026/08/21(金) 23:29:28.16ID:kGpPvADd
コンパイルパスさせるために
端折ったりバグ埋め込んだり平気でやりそう
431デフォルトの名無しさん
垢版 |
2026/08/21(金) 23:35:21.17ID:Gi1J9j3d
たしかに、人間だとそういうのあまり心配しなくて良いけど
それは人間の性格によるところがあるように思う
AIにも人格を芽生えさせてある程度の時間言動を追跡して
信頼できる人格か判定しないといけないのかのー
432デフォルトの名無しさん
垢版 |
2026/08/21(金) 23:37:21.28ID:bIYKcSt2
>>430
それはコンパイル関係なく
人間の指示にわずかな漏れがあればAIは何でもやる

だから穴を検知するためAIにテストを生成させる
テスト生成に漏れがないかだけに専念させるAIに漏れをチェックさせる
その生成されたテストをコンパイル頑張るAIに与えてテストも同時に通させる
433デフォルトの名無しさん
垢版 |
2026/08/21(金) 23:52:29.29ID:YfDi7NQj
>>425
AIで全部書けるのとAIが全部書くのとは違うよ
検証された既存のものを使えば楽ちんなのはAIも同じ
機械的な検証の責務を今までどおりにコンパイラに委譲するのはこれからも変わらない
2026/08/22(土) 00:15:51.49ID:zJHTHuDu
>>425
現実のコードはそんな単純なパターンでないため安全なコードが書けたかどうかは悪魔の証明になっちゃうよ
だからAIがコード生成する時代になってもC/C++は捨てましょうのまま進んでるよ
435デフォルトの名無しさん
垢版 |
2026/08/22(土) 06:26:02.05ID:k3gSlcbb
AIはマシン語で書けばいいんだよ
チェックするときはそれを逆コンパイルして好きな言語で読めばいいのさ
436デフォルトの名無しさん
垢版 |
2026/08/22(土) 06:30:48.14ID:o8Yeunra
C++はそのうちメモリ安全性も取り込むと思うけど
2026/08/22(土) 06:43:46.82ID:bgDHCveK
>>436
それC++11から15年間頑張って来たけど無理だった
2026/08/22(土) 07:51:36.35ID:5sbOUOoc
>>382
flatMap自作できるの?
2026/08/22(土) 07:58:34.83ID:06Fuc+wc
ソフトウエアとして実現されているものはすべからく自作可能である(ニーチェ)
ただし、それが面倒くさくて煩雑だったり、既にあるモノをわざわざ作る意義が乏しいことは多々ある(プラトン)
2026/08/22(土) 09:31:26.30ID:06Fuc+wc
そしてオブジェクト指向を迂闊に導入すると
ソフトウエアはぐちゃぐちゃになる
ここまで得られた知見ということで一旦結論
2026/08/22(土) 09:35:48.28ID:qikEO/T7
処理単位を明確に分割するのがオブジェクト指向のメリットでもあるんだけど
どうやったらオブジェクト指向でプログラムがぐちゃぐちゃになるってんだか
それは単にクラス分けとか失敗してるだけだろうね
2026/08/22(土) 09:38:45.72ID:06Fuc+wc
そういう局所の書き方話ではなくてソフトウエアシステム全体に影響を及ぼす話

というか「処理単位を明確に分割する」って何だよw

そういうおためごかしがどのくらい混乱を招いて来たか反省する脳は
たぶん君にはなさそうだな
2026/08/22(土) 09:39:43.51ID:06Fuc+wc
さー、オブジェクト指向厨にけんかを売りましたw
2026/08/22(土) 09:42:15.91ID:06Fuc+wc
オブジェクト指向って何でこんなカルト迷信みたいに広まったんだろうね
ほんと、人によるの物事の受け止め方や、それによって脳に生じたノイズって面白い
いや詰まらない
445デフォルトの名無しさん
垢版 |
2026/08/22(土) 09:42:24.26ID:W68OZL8L
関数の切り分け方に比べるとメンバーやオブジェクトをどう設定するかは人によって相当分かれる。
その事実を明らかに無視したバカがオブジェクト厨になる
2026/08/22(土) 09:47:50.99ID:06Fuc+wc
オブジェクト指向厨って結構、感覚的で
その方が直感的にわかりやすいと思ったからとか
平然と言ってくちゃくちゃしたコード書いて悦に入ったり不況活動した理り人を批判する
人畜無害じゃないんだよね。有害

オブジェクト指向が流行ったココ30年くらい、それは日本で丸投げ中抜き派遣作業が発展した時期と奇遇にも一致するんだけれど
この時代は、コンピューターサイエンス、ソフトウエア工学の暗黒時代だったと思っている
2026/08/22(土) 09:48:10.63ID:qikEO/T7
まあ、例外処理があると一気に調和が崩れていくのはあるあるだけどな
たいていの場プロジェクトが進んだ後半に発覚しやすくて
もうトンネル掘るしかなかっりするw
2026/08/22(土) 09:50:14.47ID:06Fuc+wc
きっとこんな人でも家ではいいお父さん役をやっているのかもしれないと思うと
やるせない
2026/08/22(土) 09:50:18.36ID:qikEO/T7
結局ここの住人は、大規模プロジェクトに対してどんなアプローチが適切だと言いたいんだろ?
オブジェクト指向に代わる何かを提唱したりもしないでさw
450デフォルトの名無しさん
垢版 |
2026/08/22(土) 09:54:05.52ID:MVi0Z0Uj
>>441
>>320 こいつを見てくれ、こいつをどう思う?
2026/08/22(土) 09:55:20.61ID:06Fuc+wc
>>448
オワコンかどうかがまずテーマであってだな、代替え案の有無が正当化の理由には全くならない
屁理屈にもならない

それにモジュラリティ―の確保であれば、各言語それこそ様々な手段が既存で
そういうことを論じるスレなのか?ここは。違うよな

それすら自分が分かっていないんだったらそう言うのが、人としてだだしい姿勢だろ
2026/08/22(土) 09:58:32.16ID:06Fuc+wc
>>450
>>320 はある意味いい教師だと思う。反面教師というやつ
わざわざ320を書いた椰子は分かっていてネタとしてイロニーで書いたかもしれない


(いやたぶん本気で地で書いてると個人的には思うがなw
あれが彼にとってのプログラミングであり、ソフトウエアの実装形態なんだろう)
2026/08/22(土) 10:00:07.35ID:06Fuc+wc
小僧相手についムキになっちまったわ

風説に惑わされずせいぜい精進しなされ
2026/08/22(土) 10:00:43.46ID:qikEO/T7
何かを作る時、機能別に分けて作るのは
プログラムに限らず物作りの基本ではある
車しかり、テレビ然り、家然りだ
2026/08/22(土) 10:02:42.42ID:06Fuc+wc
>>454
大上段に振りかぶって何そんな当たり前のことをw

だれがこれまで機能分割を否定したよw

おれが思ったよりも頭ヨワイやつだったんだなw
相手して時間を無駄にした
2026/08/22(土) 10:11:18.42ID:qikEO/T7
瑣末な実装をああだこうだやってるうちは何も分かって無いって事だよ
いちメソッドの実装方法なんて
そんなものは仕様通り動けばどうでもいいんだよ
そんな重箱の隅をつつき合ってオブジェクト指向を語るなんて100年早いわw
2026/08/22(土) 10:15:10.61ID:06Fuc+wc
分かっているなら…(ry

言わせるなよな
2026/08/22(土) 10:17:07.35ID:06Fuc+wc
>>456
こんなにブーメランを自分にザクザク刺す奴って始めて見たかも…
2026/08/22(土) 10:22:49.69ID:qikEO/T7
数十人、数百人規模のプロジェクトの全体設計に導入するから意味があるもので
一人で完結するする様な規模のソフトウェアのいちメソッドに何日も掛けて導入するものじゃ無いからなぁ
2026/08/22(土) 10:25:36.17ID:06Fuc+wc
>>459
そんな大規模プロジェクトに本当に関わって実績を残しているなら

>>441
こういうこと書くかな
もしほんとうにそう思っているなら周りに迷惑かけているだけかもよ
2026/08/22(土) 10:28:07.07ID:qikEO/T7
おまえが分かって無いだけw
2026/08/22(土) 10:29:42.66ID:06Fuc+wc
最後は感情論なんだよなオブジェクト指向厨
結構若輩だったりする
2026/08/22(土) 10:31:59.99ID:SeTr1MjI
オブジェクト指向アレルギーがすごいなww

>>451
オブジェクト指向がオワコンかどうかを判断する基準として、有効な代替え案の有無というのは最も大事な要素の一つなんじゃないのか?
2026/08/22(土) 10:32:19.60ID:qikEO/T7
今ではオブジェクト指向なんてイチイチお題目建てて設計なんかしなくてもだいたいオブジェクト指向の考え方で設計するからなぁ
2026/08/22(土) 10:34:49.79ID:06Fuc+wc
代替え案は各種モジュラリティ―いっぱいあるけど

代替え案の有無は全然重要じゃないよ

考えてもみろよ、代替え案がない問題はこの世に一杯あるが
問題じゃない、無いことにするしかないと言いたいのか?
そしたらこの世の問題のかなりが無問題ということになるぞ

>>463
おまえも頭ヨワイな
2026/08/22(土) 10:35:09.86ID:06Fuc+wc
>>464
しねぇよインチキ言うなw
2026/08/22(土) 10:39:05.58ID:qikEO/T7
>>466
あ、おまえん中がアンチ過ぎただけかw
世の中に追いつけよぼうず
2026/08/22(土) 10:40:07.43ID:06Fuc+wc
>>467
オブジェクト指向を使ってFizzBuzz書いてみて

俺は絵にかいてある
2026/08/22(土) 10:41:41.40ID:qikEO/T7
もしかして、ここのスレ主って、オブジェクト指向はオブジェクト指向言語の事だと思ってないかな?
2026/08/22(土) 10:42:44.88ID:06Fuc+wc
>>468
絵に ー>上に な
2026/08/22(土) 10:43:32.43ID:06Fuc+wc
>>469
そっちへ逃げたかw
煙に巻く気だな
2026/08/22(土) 10:45:24.15ID:06Fuc+wc
>>469
じゃあプログラミング言語でなくてもいいから
オブジェクト指向でFizzBuzzを「記述」してみて
2026/08/22(土) 10:47:03.78ID:SeTr1MjI
>>464
そうなんだよな
上下水道と同じように当たり前のものになったからわざわざ話題として取り上げるものではなくなったという意味のオワコンなら納得
2026/08/22(土) 10:47:15.32ID:06Fuc+wc
「記述」できまいw ニヤニヤ
2026/08/22(土) 10:50:20.53ID:06Fuc+wc
>>473 にとって上下水道と同じように当たり前のものになったオブジェクト指向

オブジェクト指向はオワコン?
https://mevius.5ch.io/test/read.cgi/tech/1721393540/753
2026/08/22(土) 10:52:30.90ID:SeTr1MjI
>>465
めっちゃ詭弁だね

代替案がない問題があるとして
その問題に対する既存の解決策はオワコンなのか?

オブジェクト指向がオワコンかどうかを判断する基準として
君は何が重要だと考えてるのかすら提示できないのなら
ただ議論から尻尾巻いて逃げてるだけだよ
2026/08/22(土) 10:57:05.02ID:06Fuc+wc
>>476
代替案のない問題だとしてもオワコン化は決定できないだろ
誰がそんなこと書いた。ミスリーディングのいい加減にしろ

代替案がないからといって問題では無いということが、問題を正当化する根拠にはならんと書いているのだよ

もう少し理にかなった物の考え方してくれないといくら5chでも
話あいてしててげんなりするぞ
2026/08/22(土) 11:00:08.79ID:06Fuc+wc
モジュラリティ―の方法は様々にあるわけだし
オブジェクト指向に害があって最近はどう回避されるつあるか上で散々論じられている

それに対しオワコンでないというならその根拠を客観的にしめさないと
個人的このみの問題で終わるのは自明だ
2026/08/22(土) 11:02:01.72ID:06Fuc+wc
で、プログラミング言語でなくてもいいから
オブジェクト指向でFizzBuzzを「記述」してみてみ

FizzBuzzが分からないというならもっと簡単なものでもいい
2026/08/22(土) 11:03:52.44ID:06Fuc+wc
「記述」できまいw ニヤニヤ

それが根拠だよ
2026/08/22(土) 11:04:51.40ID:qikEO/T7
確かにカプセル化とか継承とか付随した概念は否定されつつあるが
機能別にまとめたり同じ概念で扱うって考えは新しい言語にも引き継がれてるからなぁ
2026/08/22(土) 11:06:16.41ID:06Fuc+wc
>>480
「機能別にまとめたり同じ概念で扱う」
そのオブジェクト指向でFizzBuzzを「記述」してみてみ
2026/08/22(土) 11:08:09.39ID:qikEO/T7
>>479
そんな単一メソッドに収まるものをわざわざオブジェクト指向で書くって事自体がオブジェクト指向を分かって無いって言ってるんだがw
484デフォルトの名無しさん
垢版 |
2026/08/22(土) 11:09:15.05ID:2u24m9Db
OOPについてオワコンどうこう以前にOOPに厳密な定義を与えられた人間が人類史上いたか?
2026/08/22(土) 11:09:53.57ID:06Fuc+wc
「記述」できまいw ニヤニヤ

まずClass作って、インスタンスメンバ変数作って、getter setter property アクセス修飾設定して
method 書いて、…くちゃくちゃ くちゃくちゃ
2026/08/22(土) 11:11:26.09ID:06Fuc+wc
>>483
大規模だともっと作りにくいぞw
2026/08/22(土) 11:12:17.55ID:06Fuc+wc
なんで調べないかな>>484
2026/08/22(土) 11:13:20.57ID:qikEO/T7
>>486
それはむしろ逆だから否定させてもらう
大規模プロジェクトほど機能単位に分けなきゃ破綻する
489デフォルトの名無しさん
垢版 |
2026/08/22(土) 11:14:30.31ID:C0mupzSl
コードはなくていいけど
どういう役割のオブジェクトを登場させるかくらい書けるやろ
2026/08/22(土) 11:14:55.10ID:06Fuc+wc
>>488
だ・か・だら・だれが機能分割、細分化を否定したよ
そこに論点持って行ってどうするw

話が横滑りしてかみ合わないな―君はw
2026/08/22(土) 11:16:13.14ID:06Fuc+wc
>>489
分かったじゃあID:qikEO/T7がどういう役割のオブジェクトを登場させるかくらいについて書くのかを待つか
2026/08/22(土) 11:16:57.50ID:qikEO/T7
>>490
おまえはオブジェクト指向言語の話しかしてないからなぁw
2026/08/22(土) 11:17:59.05ID:06Fuc+wc
でもかれはオブジェクト指向を表層的な感覚でしか受け止めていないようだから
書けないと思う ニヤニヤ
2026/08/22(土) 11:18:58.56ID:qikEO/T7
FizzBuzzなんて最小公倍数のループ組んで順番に出力するコード書いたら終わりだろ
2026/08/22(土) 11:19:10.87ID:06Fuc+wc
おれプログラミング言語の話した?>>492
2026/08/22(土) 11:20:05.43ID:06Fuc+wc
>>494
じゃあほかの題材でいいよw
2026/08/22(土) 11:21:05.68ID:06Fuc+wc
つか、あやうくみおとしそうになったが最小公倍数かよw
2026/08/22(土) 11:21:33.88ID:qikEO/T7
>>495
コード書いてる時点でもう言語の話になってるだろw
2026/08/22(土) 11:22:51.40ID:06Fuc+wc
>>498
コード書い書いてねーぞ

「言語の話しかしてない」って具体的にどこからどのレスよw
2026/08/22(土) 11:23:44.80ID:06Fuc+wc
なんで最小公倍数よw
501デフォルトの名無しさん
垢版 |
2026/08/22(土) 11:24:25.96ID:MVi0Z0Uj
>>494
組み合わせを書くのは悪手だよ

>>320 を書いた人はこう言ってたけど
> 意味的には15との最大公約数で振り分ける。保守しやすい。
> if文が2つ以上あるとバグが出やすくなる笑。

↓ これに対応できなかった

Fizz、Buzzに加えてPop、Jazz、Rockに対応してください

3 → Fizz
5 → Buzz
7 → Pop
11 → Jazz
13 → Rock

ぜんぜん保守できなかったんだよ
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野郎に丸投げして、必要なとこに出現しやがれ ってやんないと

全然ダメ、お前ら
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])
2026/08/22(土) 11:39:55.42ID:qikEO/T7
オブジェクト指向にしなくていい場所までオブジェクト指向にする意味がわからない
2026/08/22(土) 11:40:59.88ID:qikEO/T7
FizzやBuzzはルールから導き出される結果であって、オブジェクトじゃ無いだろw
2026/08/22(土) 11:41:33.22ID:06Fuc+wc
>>505
じゃあ、どういう場所をオブジェクト指向にするの?
2026/08/22(土) 11:43:41.36ID:qikEO/T7
1から順に数えるのにループ書かないでとか訳分からない事言ってないでさ
w
2026/08/22(土) 11:45:23.66ID:06Fuc+wc
「意味がわからない」という言い方を最近しばしば聞くが
「意味がわからない」≒「理解できない」≒「読解力が足りない」≒「頭が良くない」
という意味にも受け止められるので使わない用が良いと思う

実際にそうならば別に構わんが
2026/08/22(土) 11:46:54.11ID:06Fuc+wc
ループ書かないでって、どのレス?
2026/08/22(土) 11:47:22.94ID:qikEO/T7
>>510
503
2026/08/22(土) 11:48:49.45ID:qikEO/T7
>>509
おまえの読解力を自己判断したのか?
ご苦労様
2026/08/22(土) 11:49:36.92ID:06Fuc+wc
>>511
ほんとだみおとしてた、これは極論だろうが
そういうやり方もありの世界はあるだろな再帰とか
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の概念モデル
516デフォルトの名無しさん
垢版 |
2026/08/22(土) 11:52:07.76ID:C0mupzSl
唯一の正解があるわけではないし
>>503みたいにFizzさんBuzzさんに数字投げるか叩いたら適宜叫ぶってのはありよね
コンストラクタに数字と叫び声を渡すとしたら
Pop, Jazz, Rockさんもすんなり登場できる
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を設計してオブジェクト指向で実装するまで
ご清聴ありがとうございました
2026/08/22(土) 11:53:29.49ID:06Fuc+wc
>>518
またお前かw
520デフォルトの名無しさん
垢版 |
2026/08/22(土) 11:54:50.22ID:MVi0Z0Uj
>>519
あ、その節はどうも、お世話になってます
2026/08/22(土) 11:54:58.97ID:qikEO/T7
それだけじゃFizzBuzzにならんだろw
2026/08/22(土) 11:56:46.35ID:06Fuc+wc
さー突っ込みが入りました
おれは縦読みで見落としたか
2026/08/22(土) 11:58:04.52ID:06Fuc+wc
>>520
確か金かしてたよね3万くらい
いつ返してくれる?
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)
2026/08/22(土) 12:06:01.34ID:06Fuc+wc
>>524
ほう、Pythonを書けるんだ、少しだけ見直したぞ。

だが本当にそういう機能分割がいいのかな。小さいプログラムだから薬にも毒にもならないだろうが
結局オブジェクト指向の害の芽はこのコードにもすでに紛れ込んでいるような…

それはさておきPyhonのClass base オブジェクト指向の仕組みは何度見てもあか抜けないな。
2026/08/22(土) 12:07:43.40ID:06Fuc+wc
PyhonでClass baseオブジェクト指向ってあまりやらなくてもいい希ガス
2026/08/22(土) 12:13:43.20ID:T7yt1axc
>>501
ああ、それって、元の仕様とは意味的に異なり、
複数の倍数を含むときの仕様がないから対処していない。
仕様の不備。
2026/08/22(土) 12:13:44.12ID:qikEO/T7
いや、Copilotに方針教えただけだw
2026/08/22(土) 12:15:15.56ID:qikEO/T7
もうメソッド単位の中身なんてどうでもいいんだよって主張の意味がわかったかな?
2026/08/22(土) 12:18:42.02ID:06Fuc+wc
>>528
なんだよ。
ひで―設計だと思ったけどカワイソウだから言うのがまんしてたけど
これが彼の言う「機能別にまとめたり同じ概念で扱う」かと
それすら自分で書けなかったかw

このPythonコードの何がまずいかワカル?
2026/08/22(土) 12:19:44.28ID:06Fuc+wc
>>529
何で急にそんな変な主張をいきなりし始めるんだw
2026/08/22(土) 12:21:55.64ID:T7yt1axc
>>450
>>320ではなくて、
https://paiza.io/projects/OHbT6kBvhYGdSm036ZGHCg
を参照してほしい。
generator部、と変換部と出力部にわけて、オブジェクト指向で、
UnitTestしやすく分割してある。
3つの部分をドットでバインドしている。
Streamにより速さは確保できないが、フロー型の次世代GPUを想定。
ワンクラスにすることで、チップ化も想定。
考え中の「場のオブジェクト指向」によって量子コンピュータでの実行も実験中。
すべてのメソッドが1行の「式」である、というところがミソ。
2026/08/22(土) 12:23:20.27ID:06Fuc+wc
>>532
正直者ではないおれにはmainしか見えないんだが
2026/08/22(土) 12:23:54.55ID:06Fuc+wc
>>533
すまんタブがあった
2026/08/22(土) 12:29:55.45ID:qikEO/T7
で、なんで実装方法を競うだけの例題にしたの?
だからオブジェクト指向言語の話にしかとれないんだってずっと言ってるし
そんな些末な話題はAIにやらせてもっと本質的な話しなよw
2026/08/22(土) 12:32:39.25ID:06Fuc+wc
>>535
AI未満がよう言うわ
論点ずらし逃げの一手か
これがおまえのいう「機能別にまとめたり同じ概念で扱う」ということか
口先だけの奴め
2026/08/22(土) 12:35:51.21ID:qikEO/T7
ルール拡張も出来るし何が不満なのさw
同じルール概念をまとめてるじゃんw
2026/08/22(土) 12:36:59.34ID:qikEO/T7
こんな事に時間を割いても無駄だよw
まあ、暇だから付き合ってやるけどね
2026/08/22(土) 12:37:26.28ID:06Fuc+wc
>>537
そこ重要か?
そもそもClass使うメリット何よ?
変なコード生成させて悦に入って
実力の底が知れるぞ
2026/08/22(土) 12:38:08.82ID:qikEO/T7
>>539
おまえが言ったんだろw
2026/08/22(土) 12:38:49.37ID:qikEO/T7
頭硬いか自分以外認めない奴かどっちだろうねw
2026/08/22(土) 12:40:26.86ID:06Fuc+wc
>>538
俺は忙しいんだよ他のことしながら一瞬の空き時間でレスかいてんだけれどさ

時間があるなら「機能別にまとめたり同じ概念で扱う」といとかおためごかし言ったり
糞コード生成させたりしてないで有意義にすごせよ
2026/08/22(土) 12:41:49.20ID:qikEO/T7
FuzzBuzzなんて同じパターンを繰り返し出力するだけのループ処理なのに
どうやってそこにプログラム言語としてのオブジェクト指向以外でオブジェクト指向を盛り込ませるってんだかw
2026/08/22(土) 12:42:25.76ID:06Fuc+wc
>>540
書かしてみたらあまりの糞コードで
目が潰れると思ったわ
2026/08/22(土) 12:42:53.84ID:06Fuc+wc
>>543
それがお前はまともに書けなかったんだろw
恥ずかしい奴め
2026/08/22(土) 12:51:27.33ID:T7yt1axc
プログラムはクライスリトリプルなんだから、
圏論解析によってクライスリトリプル化して設計する。
圏論なんだからオブジェクトと射になるので、(圏論的)オブジェクト指向設計になる。
実装やオブジェクト指向言語はまた別の話。
(ただし圏論解析は、まだスタンダードなものができていない)
547デフォルトの名無しさん
垢版 |
2026/08/22(土) 12:53:46.61ID:MVi0Z0Uj
>>527
> 複数の倍数を含むときの仕様がない

複数の倍数を含むときはその組み合わせで文字列を作成してください

例:
21 → FizzPop
105 → FizzBuzzPop
15015 → FizzBuzzPopJazzRock

以上で仕様は伝えたよ
2026/08/22(土) 12:54:25.03ID:qikEO/T7
>>545
FuzzやBuzzは文字オブジェクトだねw
で、概念はある数で割り切れるって事
ちゃんと共通概念で扱ってるよw
2026/08/22(土) 12:56:17.28ID:qikEO/T7
で、何度も聞くけど、何をもってオワコンなの?
2026/08/22(土) 12:58:48.69ID:06Fuc+wc
>>549
お前のような奴が口八丁インチキ垂れて
カルトな迷信みたいに負の技術遺産になったこと
現在コンピューターサイエンスの暗黒時代
2026/08/22(土) 12:59:45.06ID:T7yt1axc
>>547
仕様の確認です。元となる仕様も不備があり、そこがネックになっていました。
3 -> Fizz
5 -> Buzz
...
としたとき、両方の倍数のとき、単体の変換文字列を結合するのか、あるいはたまたま同じになるけど、
独立した文字列に変換するのでしょうか。
意図を明確にしてください。よろしくお願いいたします笑。
552デフォルトの名無しさん
垢版 |
2026/08/22(土) 13:01:19.95ID:MVi0Z0Uj
>>551
それはFizzBuzzのもとのルール通りです
2026/08/22(土) 13:01:51.28ID:qikEO/T7
>>550
ああ、偽OOPがたくさんあるからねw
2026/08/22(土) 13:01:52.66ID:06Fuc+wc
オブジェクト指向は「機能別にまとめたり同じ概念で扱う」
とか言って実現したコードが>>524じゃどうしようもないだろ
しかも自分じゃ書けず生成AI頼り
オブジェクト指向厨はこんなインチキ野郎バッカ
2026/08/22(土) 13:02:18.87ID:T7yt1axc
15 -> 3の倍数の変換文字列と5の倍数の変換文字列を連結したもの or 独立した文字列
2026/08/22(土) 13:02:27.40ID:06Fuc+wc
>>553
その代表だよ君は
2026/08/22(土) 13:03:16.47ID:qikEO/T7
>>547
524ならルール追加するだけだよ
なんならjavaで書き直すかい?
2026/08/22(土) 13:03:54.00ID:06Fuc+wc
>>557
いらない。目が潰れる
559デフォルトの名無しさん
垢版 |
2026/08/22(土) 13:04:01.01ID:MVi0Z0Uj
>>555
>>532はどちらで書いたの? その通りで良いよということ
560デフォルトの名無しさん
垢版 |
2026/08/22(土) 13:06:07.62ID:MVi0Z0Uj
>>557
AIに聞いたら>>524には致命的なバグがあるって言ってたから
書き直してもなあという気がしている、君が手書きしたものだったら
価値を感じるけど、コパオに書かかせたものならあまり気乗りしない
2026/08/22(土) 13:07:18.47ID:qikEO/T7
どうせ使い回しなんか大きな会社でしかやらないから
負の遺産とか言われてもなぁw
そんな話なら流行りのプログラミング言語自体が負の遺産の根源なんだし
おまえの主張は単なるプログラミング言語の問題でしか無いよ
2026/08/22(土) 13:09:38.03ID:06Fuc+wc
開き直って、日ごろ辛いこと・不満があるんだろうなと予想はつくが
何て言って慰めてあげたらいいか俺には思いつかないな
2026/08/22(土) 13:10:51.18ID:T7yt1axc
>>559
元のあいまいな仕様から、実装例から得られる代表的な2つの仕様のどちらにも対応できるように
書いたため、若干冗長です。
まあ、いいでしょう。そこは同じ対処で進めます。
まあ、時間がとれて気分がよければ書いときますが、おそらく夜中に酔っぱらったまま書くでしょう笑。
564デフォルトの名無しさん
垢版 |
2026/08/22(土) 13:13:58.93ID:MVi0Z0Uj
>>563
夜中までかかるん? 保守しやすいはずなのに?
565デフォルトの名無しさん
垢版 |
2026/08/22(土) 13:14:44.51ID:MVi0Z0Uj
あれれーおかしいぞおー(コナンくん
2026/08/22(土) 13:17:16.66ID:qikEO/T7
>>560
ま、気が乗ったら手書きしてみるわ
でも自由度にも制限あるよ
2026/08/22(土) 15:18:04.75ID:Su1GpItk
>>503
どこでfor i ループが出現しちゃダメなの?
例えば>>318みたいなコードはいいの?
2026/08/22(土) 15:50:22.89ID:qikEO/T7
ルール追加する毎に条件分岐増やすなんて愚の骨頂だろ
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こそが今回の概念や」となり作成
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, })
}
}
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));
}
}
2026/08/22(土) 18:09:45.50ID:fbloiAk8
>>571
(3, "Fizz"), (5, "Buzz"), (7, "Pop"), (11, "Jazz"), (13, "Rock")
は直書きせず、コマンドラインで
2026/08/22(土) 18:15:38.70ID:NuWpGxo/
>>572
UIやDBなどからAPI指定データへの変換は今回の件とは無関係な外部の話
ご自由にやってください
2026/08/22(土) 20:20:50.38ID:FMHyOiEd
&'static str使うコードはこの程度の仕様変更で柔軟性がない、正直アホかと
10万行コードだったらありとあらゆる所に変更が生じてアワアワする
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>], }
2026/08/22(土) 20:50:18.75ID:T7yt1axc
>>564
https://paiza.io/projects/E86OZjZm-JfK2VzqXB40Ng?language=java
酔っぱらって書いているのでbugはあるかもしれん。
暇じゃないのでな。
577デフォルトの名無しさん
垢版 |
2026/08/22(土) 20:54:26.25ID:MVi0Z0Uj
>>576
やるじゃん
2026/08/22(土) 21:01:59.15ID:oTrAIGCX
>>576
2つの問題
手動組み合わせよりも漏れが起きない自動計算へ
固定一覧の内蔵よりも外から任意の注入へ
2026/08/22(土) 21:05:27.36ID:qikEO/T7
まだやってんの?
暇だねぇ
2026/08/22(土) 21:06:49.77ID:T7yt1axc
あいまいな仕様から、あくまでも圏論的オブジェクト指向設計の例なので、
めんどーなことは、やらん。なんにしても酔っていて眠い。寝ると思う笑。
2026/08/22(土) 22:14:47.24ID:pI2Hq+2i
>>574
errorやpathやtest dataなどとりあえず&'static strはよくあるけど変更の対応は大した手間ではないよ
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")
2026/08/22(土) 23:40:54.46ID:qikEO/T7
>>576
頭悪w
組み合わせで済むだろうにw
2026/08/23(日) 01:30:12.22ID:iasgGq5L
へんな時間に寝たのでいちど起きてしまった。
ふ。仕様を逸脱しないようにすると全部書かざるを得ないわけよ。
仕様の不備はおれのせいじゃない、確認したしな。
こういう頭の悪いクライアントは多い。さてまた寝よう。
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へ変換せよ
いずれにも該当しないときは自然数そのまま文字列にせよ
586デフォルトの名無しさん
垢版 |
2026/08/23(日) 09:34:37.37ID:F3OUjFLN
>>584
文字列の結合を静的にやるか動的にやるかは設計判断

こういう手順でこうしろと仕様で書かれてるとおりにやればできるならそれはただの作業であって設計ではない

将来を見越して未知のものに判断を下すのが設計、その設計の指針となるのが保守性など

君は文字列を静的に結合してコードに直書きする設計をした
君の設計は条件の追加のコストが高くつくものだった
それが事実

仕様が悪い、クライアントの頭が悪いと言っているけど実際は君の頭が悪い
2026/08/23(日) 09:39:21.38ID:RCO/sdz3
そもそもFizzBuzzJazzなどの結合文字列なんか用意する必要はないよな
たまたまFizzとBuzzとJazzだけで割り切れた時に順に追記してFizzBuzzJazzが自然に生成されるだけだよな
588デフォルトの名無しさん
垢版 |
2026/08/23(日) 09:41:36.69ID:F3OUjFLN
>>585
余裕でした
https://paiza.io/projects/EQ6Ekb-JbXcRHV3gg290tg
2026/08/23(日) 09:51:42.61ID:SzWuQqoT
>>588
最悪なコードだな
漏れがあるかどうかも不明
保守性も悪い
590デフォルトの名無しさん
垢版 |
2026/08/23(日) 10:24:03.77ID:F3OUjFLN
>>589
そういうこと言うな、言わん方が良い、お前のためだ
2026/08/23(日) 10:40:47.40ID:M+PVsTq+
こんな感じのダサいけど読みやすいコードじゃダメなん? Pythonユーザーはこんな感じで書く人が多いんじゃないかなと思うんだけど。
https://www.ideone.com/h3xXoq
2026/08/23(日) 10:47:39.45ID:Dec9exUR
>>591
それだと本来のFizzBuzzが動かないので失格
いくつまで処理するのか何を表示するのかは外部から与えられる
形式は自由でいいけど3→Fizzと5→Buzzが与えられた時は本来のFizzBuzzの動作
2026/08/23(日) 11:00:54.37ID:M+PVsTq+
こういうこと? 仕様を外部から与えられる方が柔軟なのはわかるけど、読みづらいから個人的にはあまり好きではないかな。
https://www.ideone.com/zSoAzy
2026/08/23(日) 11:18:44.40ID:/SMVVWF/
おまえらコバロより劣るコード書いてんじゃんwww
2026/08/23(日) 12:00:59.91ID:iH5V9eFJ
>>591
generatorにする必要ないでしょ

for i in range(1, 21):
 print( fizzbuzz(i) )

spec/ruleを受け取るときは1回だけ処理するために
generatorにするのもありかもしれないけど>>593はそうなってない
2026/08/23(日) 12:13:29.29ID:iasgGq5L
>>587
そういう考えで勝手に仕様を変更されるからバグが発生するのですよ。
仕様どおりに作らないと検収もあがらない。
2026/08/23(日) 12:16:09.07ID:iasgGq5L
マジックナンバーは、このマジックナンバーの意味がわからないやつは触れるべからずという呪文。
2026/08/23(日) 12:21:27.38ID:/SMVVWF/
>>596
仕様が誤りって事もあるんだよ?
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
2026/08/23(日) 12:31:16.30ID:iasgGq5L
>>568
だからこそ、確認を取ったにもかかわらず、その仕様でGOされたわけ笑
2026/08/23(日) 12:32:45.51ID:LXYwYlQF
バカな船頭が自己満で繰り広げたゴミコードの墓場だね
602デフォルトの名無しさん
垢版 |
2026/08/23(日) 12:39:24.70ID:F3OUjFLN
>>600
君のいう仕様とはどういうこと?
どう実装すればいいかを他人に教えてもらうことが仕様なの?
君は自分ができなかったことを他人のせいにしてるだけだよ
2026/08/23(日) 12:39:48.34ID:M+PVsTq+
>>595
必要というか、fizzbuzzという概念の捉え方次第じゃない? 上の方の例では大体、1, 2, Fizz, 4,... という出力をするものとしてfizzbuzz概念が捉えられているみたいだったから、Pythonで表現するときにgeneratorにするのは比較的自然な考え方だと思うけど。
595のように、単一の数値を単一の文字列に変換する関数・ルールとしてfizzbuzz概念を捉えるのであれば、それはそれでありだとは思うけど、それだけの話なのでは?
2026/08/23(日) 12:45:26.71ID:DMCqliCM
クソみたいな他人の作った仕様でゴミみたいなサンプルコード書くんじゃなく、自分が普段使いできる簡単なツールでも作れよ
今時の小学生ですら簡単なゲームくらい作ってるんだぞ。情けないなあ
2026/08/23(日) 12:47:28.81ID:/SMVVWF/
最小公倍数の範囲で繰り返すだけの出力処理にオブジェクト指向もなにもあったもんじゃ無いだろ
もう使ってる処理言語がオブジェクト指向言語なんだからそれで答えは出てる
ここまで来てもオブジェクト指向がオワコンだと言う事の答えが何も示されていない
2026/08/23(日) 12:48:46.54ID:iasgGq5L
今回は、場のオブジェクト指向の試験を兼ねて作成した。
この試験の結果、出力されるものは2つの異なる(量子)統計が混在するもので、
場(ルール)と合わせて全体をみれば可逆である。
streamは個別の値が流れるわけではなく、streamという全体が演算される。
streamは可逆であり、双対性がある。可逆な中間操作をバインドして繋げばよい。
これはXXXを変えれば演算が行われるということであり、フロー型のさらに次世代を予想させる。
いいすぎな表現だが、簡単にいえば、演算は行われずに演算の結果が得られる。
2026/08/23(日) 12:49:54.67ID:HWzbbtqX
「>>605は認識能力が足りません」までは読んだ
2026/08/23(日) 12:50:38.64ID:/SMVVWF/
むしろ設計次第で毒にも薬にもなるって証明にはなったかもな
2026/08/23(日) 12:53:14.80ID:iasgGq5L
>>604
仕様と設計をごっちゃにしてるね。
ちゃんと会社やって仕事したことないんじゃない?
610デフォルトの名無しさん
垢版 |
2026/08/23(日) 12:56:45.45ID:F3OUjFLN
>>609
仕様がわからないと言い訳たれてんのは君だけ

他の人は言われなくても文字列を動的に結合すれば
仕様変更に強いと自分で判断してそうしてる
プログラマとしての能力を持ってるからできること

そうしてくれと言われてできるのはあたりまえでそれは作業でしかない
自分は確認を取った、それでGOされたというのも作業員でしか通用しない言い訳だよね
君は作業員としてしか仕事したことないんじゃない?
2026/08/23(日) 13:03:04.51ID:/SMVVWF/
>>609
仕様→設計→コーディング
2026/08/23(日) 13:04:01.05ID:/SMVVWF/
コードには設計が現れているだろw
2026/08/23(日) 13:05:56.08ID:/SMVVWF/
コードが悪い=設計が悪い
614デフォルトの名無しさん
垢版 |
2026/08/23(日) 13:08:55.68ID:F3OUjFLN
>>611
左様
2026/08/23(日) 13:13:24.37ID:iasgGq5L
>>610
仕様を逸脱したら損害が発生するんだよ。会社経営したことないだろ。
616デフォルトの名無しさん
垢版 |
2026/08/23(日) 13:21:09.56ID:F3OUjFLN
>>615
君はFizzBuzzの課題で文字列を動的に結合したら仕様を逸脱して損害が発生して会社の経営が危なくなると思っているのかい、大変だね
2026/08/23(日) 13:28:56.47ID:iasgGq5L
>>616
くすくす。
手元に詭弁の本があるけど、教科書通りの展開だね笑。
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
仕様で決めるのは目的であって方法でも手段でもないからね
文字列の結合方法を仕様で決められてもなあ
2026/08/23(日) 14:04:47.40ID:HWzbbtqX
FIzZBuzzで重箱隅これだけもめて、書いたのはゴミコードって
この人たち本当にこの分野で食べているのだろうか…謎
622デフォルトの名無しさん
垢版 |
2026/08/23(日) 14:32:48.12ID:QvCbW4h1
顧客は無知なもんだから
2026/08/23(日) 14:38:22.96ID:/SMVVWF/
動けばいいんだよ
だからコバロで書いてコピペして仕事が完了
624デフォルトの名無しさん
垢版 |
2026/08/23(日) 14:50:41.16ID:QvCbW4h1
コバロって何
2026/08/23(日) 14:59:42.81ID:wVoNaoye
>>624
無知かアスペかどっちか
2026/08/23(日) 15:06:20.12ID:HWzbbtqX
やっぱなwナンチャってソフトウエアエンジニアの巣窟だったかw
2026/08/23(日) 15:28:12.05ID:KkX4SDMy
仕様で決めるのは目的であって方法じゃない、って話なら
結局設計って「どの変更をどこに閉じ込めるか」を決めることなんじゃねえの
FizzBuzzなら3→Fizzを7→Pop追加しても一箇所で済むようにするとか
そういうのが保守性の正体だろ
2026/08/23(日) 15:30:54.39ID:KkX4SDMy
ただ変更に強いって言い方も雑なんだよな
Fizz Buzz Popが増える変更には強くても
倍数じゃなくて桁に3が入ってたらFizzに変わったら全部崩れるかもしれない
何の変更に対して局所化してるか、まで言わないと意味ない
2026/08/23(日) 15:33:32.71ID:KkX4SDMy
そう考えると設計の良し悪しって
変更するときにどこまで見に行かされるかでかなり決まる気がする
何についてのコードか
何に依存してるか
どこ直せばいいか
何テストすればいいか
これが近所だけ見て分かるコードは楽
2026/08/23(日) 15:34:15.40ID:tl6J+3gQ
>>628
3で割れる数だけFizzを出力する、例 9 FizzFizz
5等も同様
2026/08/23(日) 15:37:49.27ID:KkX4SDMy
逆に一箇所直すのに
親クラス見て
interface見て
DI設定見て
Factory見て
Listener見て
どこでoverrideされてるか検索して
みたいになるとキツい
コード量じゃなくて探索範囲がでかい
632デフォルトの名無しさん
垢版 |
2026/08/23(日) 15:39:26.68ID:QvCbW4h1
関数にしてその中でご自由にどうぞでええやん
2026/08/23(日) 15:44:28.67ID:KkX4SDMy
そうなるとあれ
それって昔OOPが解決しようとしてた問題じゃなかったっけ
データとそれを操作する処理をオブジェクトに閉じ込めて
内部知らなくても使えるようにするって話だろ
本来は局所化するための仕組みだったはず
2026/08/23(日) 15:48:19.79ID:KkX4SDMy
なのに実際のOOPコードだと
継承
動的ディスパッチ
DI
Observer
ORM
フレームワークのライフサイクル
とか乗りまくって
そのオブジェクトが何するか知るために全然違う場所見に行く羽目になるんだよな
635デフォルトの名無しさん
垢版 |
2026/08/23(日) 15:50:25.49ID:F3OUjFLN
お前らほんまFizzBuzz好きやなあ
俺はそんなお前らが好きだ
2026/08/23(日) 15:52:04.46ID:KkX4SDMy
つまりオブジェクトが情報を閉じ込める箱じゃなくて
依存関係を集めるハブになっちゃったのが問題なんじゃね
UserServiceとかOrderManagerとかいう名前だけ局所的で
中身はDBもメールも決済もログもイベントも何でも触るやつ
2026/08/23(日) 15:55:00.72ID:KkX4SDMy
そう考えるとOOPは変更に強いじゃなくて
カプセル化がうまくいってれば変更に強いなんじゃね
クラス使ってるだけでは何も保証されないどころか
継承とかshared mutable stateで逆に非局所化することもある
2026/08/23(日) 15:56:09.08ID:/SMVVWF/
仕様が変われば設計だって変わるのは当たり前だ
なんでも予測して変更に耐えられる設計なんて存在しないから
変更があるとすれば固定値や特定条件とかくらい、それ以上は仕様からやり直し
2026/08/23(日) 15:58:32.65ID:KkX4SDMy
で最近のGoとかRustとか見てると
クラスを捨てたというよりデータメソッド、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;
   }
  }
 }
}
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)))
  : [];
}
2026/08/23(日) 16:04:01.11ID:KkX4SDMy
じゃあOOPオワコンって
オブジェクトとかカプセル化がオワコンなんじゃなくて
クラス作って継承とポリモーフィズムで世界をモデル化すれば
自然と変更に強い設計になる
っていう古典的OOP観がオワコンなんじゃね?
局所性を作るために生まれたOOPが
使い方次第で非局所性の発生源になった、という話なら割と筋通る気がする
644デフォルトの名無しさん
垢版 |
2026/08/23(日) 16:05:08.08ID:+hvJAYKo
クラスは不要
クラスは時代遅れ
2026/08/23(日) 16:10:43.94ID:xuiTfLZn
classを全否定するつもりは無いけどstructとmethodだけでいいし特に継承はオブジェクト指向の負の遺産
2026/08/23(日) 16:14:12.45ID:HWzbbtqX
>>643
「局所性を作るために生まれたOOP」って
また陳説が登場したぞ

ほんとOOPSって人によって受け止め方や解釈や利用(悪用)のされ方が
まちまちでそれがまた混乱の一因なんだよな
2026/08/23(日) 16:16:35.09ID:/SMVVWF/
大きな仕様変更は関係が変わるんだからそりゃあ既存の設計じゃ満たせないのは当たり前
万能な設計なんて無いんだからそれをオブジェクト指向のせいにするのはお門違いだ
2026/08/23(日) 16:19:21.65ID:iasgGq5L
classでなくともよいのだが、関係性の集まりを指示できる対象が必要となる。
これを「場」とみなせば、
場のオブジェクト指向は、場にメッセージを投げ入れると何らかの反応があったり/なかったりするもの、
ということになる。
場の演算子が反応すれば、observableが返ってくる/かもしれない。
2026/08/23(日) 16:24:20.60ID:HWzbbtqX
ひー
2026/08/23(日) 16:32:26.38ID:iasgGq5L
場のオブジェクト指向が目指すところは可逆演算(可逆計算)と量子コンピューティングだ。
場は「局所」ではない。関数型計算の究極形だろう(理想)。
場の計算理論の前に、数学そのものの正体が場の(量子)情報理論であると考え中。
2026/08/23(日) 16:32:53.18ID:QbJdGCa2
>>643
>クラス作って継承とポリモーフィズムで世界をモデル化すれば
>自然と変更に強い設計になる
90~00年頃の考え方だよね

変わりやすい部分と変わりにくい部分を見極めて
どういう種類の変更に強くするか取捨選択する必要がある
オブジェクト指向に限った話ではない

FizzBuzzを動的文字列結合で解決する話も
3と5と両方で割り切れるならWYAAAYYY!! にするような変更にはめっぽう弱いのと同じ
2026/08/23(日) 16:37:17.16ID:QbJdGCa2
>>645
struct + method => classですから

継承が負の遺産じゃなくて間違った継承の使い方が負の遺産
今使ってるGUIはみんな継承の産物
2026/08/23(日) 16:45:22.29ID:HWzbbtqX
GUI FWは継承がうまくいった稀な応用だと思うが
2026/08/23(日) 16:50:32.37ID:/SMVVWF/
特定用途に偏った設計が別の特定用途に整合できるはずが無いんだよね
最初からそれ以外の用途では使わないなら
それは良いも悪いも無いからね
2026/08/23(日) 16:52:50.80ID:/SMVVWF/
オブジェクト指向は万能みたいな夢を騙るから失敗してるとか訳の分からない話をし出す
どんなソフトウェア技法だって万能なんか無い
2026/08/23(日) 16:55:54.03ID:HWzbbtqX
クラス(カプセル化)、動的インスタンス(動的extent)、継承、多態といったもので
プログラムを現すモデルとして実は適していなかったおそれがあると思う
2026/08/23(日) 17:10:09.30ID:/SMVVWF/
おまえら、気づかないうちにクラスメソッド使いまくってるじゃんw
2026/08/23(日) 17:20:57.83ID:iasgGq5L
まとめて計算させるためには素数を使う。
可逆性は確認できたが、量子アルゴリズムはそのうち考えることにして、
javaのThreadPoolで高速化できるか、オーバーヘッドのほうが大きいか確認してみようと思う。
2026/08/23(日) 17:21:26.65ID:vDqnQhmn
>>656
動的extentって何だ?
例えばC++のdynamic_extentはオプション指向と関係ないように
概念を話すときに特定の言語でのみ通用する用語は使わないでほしい
2026/08/23(日) 17:22:54.82ID:iasgGq5L
まとめて計算させるためには素数を使う。
可逆性は確認できたが、量子アルゴリズムはそのうち考えることにして、
javaのThreadPoolで高速化できるか、オーバーヘッドのほうが大きいか確認してみようと思う。
2026/08/23(日) 17:24:02.54ID:iasgGq5L
ち、ミスった。ボタン押し間違いで二重投稿になった。
2026/08/23(日) 17:33:30.22ID:4FpMaXiD
>>657
そのクラスメソッドはどの意味?
インスタンスが反応するインスタンスメソッドではなくクラスが反応するクラスメソッドという意味?
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

無知の自慢か

オプション指向が逆に分からん
2026/08/23(日) 17:42:19.56ID:IZSLg4J0
>>663
君がおかしい
その検索でも複数の異なる意味が出てくる
どの意味で君が用いているのか説明しないといけない局面
2026/08/23(日) 17:43:22.91ID:HWzbbtqX
extent って日本人では使い人少ない感じがするな
life time ならよく使われる。変数の life time など

動的life timeを持つ変数 、インスタンス
2026/08/23(日) 17:44:22.00ID:HWzbbtqX
>>664
ねぇextentもしらないで人に絡むのやめない?
2026/08/23(日) 17:46:21.02ID:HWzbbtqX
かれはscopeくらいならワカルかな。
これも知らぬと絡んできたらプロログらミングのど素人ちゃん確定だ
2026/08/23(日) 17:49:29.05ID:K/xiM3u4
>>663
そこに出てくるどの意味かね?
Lispだと動的extentはスコープを抜けると消えるローカル変数束縛のこと
C++だと動的extentは配列や連続体の要素数がコンパイル時ではなく実行時に決まること
2026/08/23(日) 17:49:59.43ID:HWzbbtqX
もうそういう人たちがクラスだオジェクトだ言ってんだよな
変な時代になったもんだ
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 付きローカル変数は、スコープは関数内だけですが、
エクステントはプログラム全体(静的)になります。

以下略
2026/08/23(日) 17:58:05.85ID:HWzbbtqX
プログラミングのすそ野が広がったってことだな
すそ野といえばまだ耳障り良いが、底辺だわ
2026/08/23(日) 17:59:02.41ID:HWzbbtqX
あと、リンケージっていう大切な概念があんだよね
絶対に知らないだろうけど
2026/08/23(日) 17:59:19.29ID:M+PVsTq+
何となく雰囲気は分かるんだけど、説明なしに使えるほど共通理解が成立している語ではないような気がするけどなぁ……。率直なところ、>>656の「動的インスタンス(動的extent)」と>>663の説明も整合してないように思うんだが。スコープなんかも名前空間の意味で使っている人が居たりするし、ここら辺の語は問題が起きたら意味のすり合わせをした方が無難だと思うよ。
2026/08/23(日) 18:01:33.96ID:HWzbbtqX
>>673
なんとなくしかわからないならほんと勉強を基礎からひっしにやらないとまともなエンジニアのレベルに追いつかないぞ
それはお前自身のことだから百歩譲ってまかせるとしてだな
自分が無知なのに他人が悪いみたいなに絡むのはなぜじゃ
せいかくもくさっているのか?
2026/08/23(日) 18:02:55.68ID:EWaz+NdE
>>670
それは変数のextentだね
最初からそう言いなさい
C++20で導入された動的extentは別の意味
動的extentだと各自が脳内に思い浮かべることが異なることをようやく理解できたかな?
2026/08/23(日) 18:03:08.49ID:HWzbbtqX
いんすたんすにだって変数と同様にlife timがあるだろうに
馬鹿垂れが!
なんとなくとはなんだなんとなくとは
そんなんで開発してたら周りに迷惑かけるぞ
2026/08/23(日) 18:05:17.28ID:EWaz+NdE
>>676
変数のextentを言いたかったのではないの?
それはインスタンスのextentとは同一でないよ
2026/08/23(日) 18:06:42.18ID:HWzbbtqX
>>675
>C++20で導入された動的extentは別の意味

あのなあ、変数やobjectのextentは、高水準言語が深化した
数十年前からあるプログラミングの基本概念なの

おまえがC++20について言っているような「特定の言語でのみ通用する用語」ではないの
2026/08/23(日) 18:08:38.48ID:HWzbbtqX
>>677
ばかw
何て言ったらいいんだ、こういう馬鹿にw
extentはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言
2026/08/23(日) 18:10:26.18ID:HWzbbtqX
>>679 誤記
× extentはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言
○ externはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言

自分がたまたま知っている擁護に、知らない概念を無理と対応付けないほうが良い

キミ、ソフトウエアに適正ないかも知れない
2026/08/23(日) 18:12:00.07ID:kSpVm1vf
>>679
>> extentはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言

唐突に何だそりゃ?
extentに限定詞が付かないと静的グローバルだと??
2026/08/23(日) 18:12:03.63ID:HWzbbtqX
オブジェクト信奉者って、こういうレベルの層が多いんだろうな
どうりでぐちゃぐちゃなコードが量産されるわけだ
2026/08/23(日) 18:13:38.09ID:kSpVm1vf
>>680
externキーワードがありそういった宣言が可能な言語の話をしてる?
一般用語ではないからそれでは混乱するぞ
2026/08/23(日) 18:14:25.88ID:HWzbbtqX
>>681
>>680 でexternに誤記訂正してるけど
○ externはstatic extentを持ちglobal scopeを持つ変数またはオブジェクトの宣言
それでも、意味わかんないだろw

少しプログラミングを勉強してある人にはわかるハズのことなんだけれどもね
2026/08/23(日) 18:15:21.58ID:/SMVVWF/
まあ、クラスなんてネームスペースだけあれば良いかったんだよね
2026/08/23(日) 18:16:47.20ID:HWzbbtqX
>>683 きみ、かわいそうなくらいど素人だね。
プログラミンのみならず、頭の回転も悪いみたいだし
ここでextern, extent, scope, static, global それぞれ何か長々説明しろっていうのか?
もう笑うしかない
子ども電話相談室じゃないぞw俺は
2026/08/23(日) 18:16:52.87ID:aJFAwnCP
俺は理解できたよ
ID:HWzbbtqXは脳内に勝手な想定や限定や仮定が存在するがそれを言語化して他人に伝えることができない典型的なダメ人間であると
2026/08/23(日) 18:18:01.59ID:HWzbbtqX
>>685
namespaneはscopeを区切るだけなんだよ
extentには関係ない。

オブジェクト信奉者って、こういうレベルの層か
2026/08/23(日) 18:19:29.44ID:HWzbbtqX
>>687
また変な人が出て来たw
2026/08/23(日) 18:19:36.72ID:aJFAwnCP
>>688
それは正しい
これまでの発言はダメ
2026/08/23(日) 18:20:02.90ID:HWzbbtqX
>>690
理解できなかっただけだろ
2026/08/23(日) 18:20:26.21ID:/SMVVWF/
>>688
は?
関係ないが?
何言ってんの君
2026/08/23(日) 18:21:40.52ID:HWzbbtqX
ひえー
ど素人たちに取り囲まれたw
2026/08/23(日) 18:23:17.74ID:M+PVsTq+
>>663と>>670でも説明がズレているように、多義的に使われうる語なんだから、疑義が出たら自分がどの意味で使っているのかは説明した方がいいというだけのことなんだが。
プログラミング一般の用語としてスコープとエクステントを対置するというのはまぁ分かるけど、そこにいきなりexternが出てくるというのは正直よく分かんないな。
2026/08/23(日) 18:28:26.49ID:H8lujsG7
複数の異なる意味がある用語を使ってしまうことはよくあること
それを指摘されたらこの意味だと説明することで会話や会議や商談が進む
今回のような逆ギレで暴れる人は嫌われる
2026/08/23(日) 18:29:14.42ID:H8lujsG7
>>694
同感
2026/08/23(日) 18:31:33.29ID:HWzbbtqX
>>695
extenの概念すら知らないで何でそんなに偉そうなの?
2026/08/23(日) 18:33:16.99ID:/SMVVWF/
慌てず綴りくらいちゃんと書いて
2026/08/23(日) 18:38:25.76ID:HWzbbtqX
>>698
そうだな。

extentやscopeも知らずにオブジェクト指向を語るって
どういうことよ?
2026/08/23(日) 18:46:38.55ID:/SMVVWF/
つか全く別の話だよね?
701デフォルトの名無しさん
垢版 |
2026/08/23(日) 18:47:53.90ID:+EvqEEFr
extentは範囲や程度を意味する一般的な単語なのでプログラミング分野に限っても多様な意味で使われている
今回の「動的extent」も指摘があったようにC++では「動的な範囲」を持つこと意味する
つまり配列などの要素数が静的ではなく実行時に決まることを表している
2026/08/23(日) 18:49:09.14ID:HWzbbtqX
>>700
いや関連があってすごい重要なんだよ、わかりませんか。

それがワカルとこれまで流行ってきたオブジェクト指向の問題点の
ある面がまずかったと感じられる
2026/08/23(日) 18:51:43.25ID:HWzbbtqX
もう初歩からの質問があってもご遠慮したい
俺にとって発展性がない
2026/08/23(日) 18:52:47.67ID:/SMVVWF/
時間と空間の違いって解釈したんだが
705デフォルトの名無しさん
垢版 |
2026/08/23(日) 18:53:31.71ID:+EvqEEFr
ID:HWzbbtqX氏はextentを時間的な範囲つまり期間だけを指すと誤解していると思われる
2026/08/23(日) 18:53:46.51ID:HWzbbtqX
「範囲や程度を意味する」って何よw
2026/08/23(日) 18:55:42.10ID:HWzbbtqX
>>704
あるいみそうとも言えるけど、もっと併用な日本語なら
見える範囲と存在基幹という言い方が適するかな

>>705 それがまさにextentの概念だよ
2026/08/23(日) 18:56:19.44ID:/SMVVWF/
グーグルAIの答えは
プログラム言語(プログラミング)における extent と scope は、どちらも変数やオブジェクトが「どこで、いつまで有効か」を扱いますが、概念が明確に分かれています。一言で言うと、scope は「場所(空間)」であり、extent は「時間(寿命)」です。
2026/08/23(日) 18:56:22.27ID:HWzbbtqX
程度を意味する
…なんだろう
2026/08/23(日) 18:57:28.00ID:HWzbbtqX
>>708
そのとおりじゃん。
それを君らは知らず無頓着に日ごろプログラム書いてんのかとあきれたわけよ
2026/08/23(日) 18:59:22.70ID:HWzbbtqX
君らにお願いだけど、基礎的な概念については教科書やWEBや生成AIで勉強してから
議論に臨んでほしい
2026/08/23(日) 18:59:35.65ID:/SMVVWF/
で、scopeはプログラム書く時に静的に決めるけど、extentはそれこそ動的に決まるからコード上で静的に書くには別のやり方になるんじゃないの?
2026/08/23(日) 19:00:03.42ID:VaEt5gsH
ぶっちゃけ一部のお爺ちゃんしか知らない死語
分類法が微妙すぎて意味をなさなくなったんじゃねーのかな
714デフォルトの名無しさん
垢版 |
2026/08/23(日) 19:01:09.45ID:+EvqEEFr
>>707
違う
extentは広さや範囲を意味する単語
時間の範囲を意味することもあるがそれは期間などの限定を添えなければ伝わらない
C++のdynamic extentは期間ではなく領域のサイズが実行時に決まること
2026/08/23(日) 19:01:17.90ID:HWzbbtqX
>>712
まったくちがうよ
これだけかいたのに無駄だった、もういいよ君は


>>713
コンパイラーの専門書などでは普通に使われているよ
2026/08/23(日) 19:03:31.08ID:HWzbbtqX
>>714
そりゃC++ 20のdynamic_extenの固有な話だろ
なぜextentという単語を使ったかはよく分からんが、extent「も」制御しているからかな
2026/08/23(日) 19:03:36.23ID:/SMVVWF/
>>715
そんな答えじゃ誰も分からないんだけど?
2026/08/23(日) 19:05:39.03ID:/SMVVWF/
概念が違う同士が平行線でw
2026/08/23(日) 19:05:55.80ID:HWzbbtqX
dynamic(allocation)&extent(control???)みたいな意味かね
どこぞに原点があるかもな しらんが
2026/08/23(日) 19:07:43.35ID:HWzbbtqX
>>717
俺に分かんねワナンネって子ども電話相談室みたいに言ってないで
プログラミング言語におけるscopeとextentの基礎について丁寧に調べてくれないかな
2026/08/23(日) 19:08:39.59ID:/SMVVWF/
>>720
だから調べたけど、君と概念が違うんだけどw
722デフォルトの名無しさん
垢版 |
2026/08/23(日) 19:09:32.49ID:GL/OuKQX
>>656
動的インスタンスってなんですか?
その話で静的インスタンスと区別する必要あるの?
2026/08/23(日) 19:09:53.75ID:HWzbbtqX
>>721 調べた結果得られた答えが これか
「scopeはプログラム書く時に静的に決めるけど、extentはそれこそ動的に決まるからコード上で静的に書くには別のやり方」
2026/08/23(日) 19:10:54.08ID:HWzbbtqX
>>722
googleでもいいいから基礎概念はまず調べて
2026/08/23(日) 19:11:21.84ID:/SMVVWF/
>>723
コードを時系列に並べる書き方って確立かれてないから面倒だなぁってw
2026/08/23(日) 19:13:14.31ID:HWzbbtqX
日本語おk?
2026/08/23(日) 19:15:01.58ID:/SMVVWF/
オブジェクトがある時間存在してるかどうかを保証する方法ってどう書くんだろ?
2026/08/23(日) 19:17:12.81ID:/SMVVWF/
先祖がヌルポと戦って来た歴史から未だに解決しない問題だよぉ
729デフォルトの名無しさん
垢版 |
2026/08/23(日) 19:26:03.06ID:s5u0XSsl
extentの英語の意味は「広さ」「広がり」がベースで「範囲」「限度」「程度」を意味する単語だよ
そこに時間的な意味は含まれてない
むしろ空間的な意味が原義
だからプログラミング言語によっては時間的な意味では使われない普遍的な単語
2026/08/23(日) 19:27:21.45ID:/SMVVWF/
>>729
>>708
2026/08/23(日) 19:29:47.73ID:HWzbbtqX
ttps://nolongerset.com/scope-vs-extent-in-vba/
2026/08/23(日) 19:30:28.92ID:HWzbbtqX
ttps://www.lix.polytechnique.fr/~liberti/public/computing/prog/lisp/cltl/clm/node43.html
2026/08/23(日) 19:31:32.62ID:HWzbbtqX
もう、子ども電話相談室のオジサンとかコテ張るかw

しないけどw
734デフォルトの名無しさん
垢版 |
2026/08/23(日) 19:34:50.96ID:s5u0XSsl
>>730
C++の場合
静的なextentは静的に広がりが決まる連続体のこと
動的なextentは動的に広がりか決まる連続体のこと
前者は具体的な要素数がコンパイル時に決まるので具体的な要素数を書く場所で
後者は具体的な要素数がコンパイル時に決まらないことを示すstd::dynamic_extentを使うんだよ
2026/08/23(日) 19:38:42.12ID:HWzbbtqX
「広がり」っていう言葉が適しているのか?
2026/08/23(日) 19:39:06.05ID:M+PVsTq+
英単語としてのextentは程度・範囲という意味であり、プログラミング一般用語として、scopeと対置的に用いられる場合のextentは、名前束縛やオブジェクトの「寿命・ライフタイム」の意味で用いられるのが一般的。決して死語とかではなくて、今でも使われる重要な基本概念といえる。ここら辺までは一応共通理解といって良いと思う。
そこから進んで(ライフタイムの意味の)extentの分類として>>670で挙げられているような自動/動的/静的という三分法が、説明なしで通用するほど一般的な共通理解かというとちょっと疑わしくて、C言語的な感覚からはこの三分法はわかりやすいのだけど、たとえば>>663は三分法でいうところの自動extentの意味で、動的extentという語を用いているように見える。だから疑義が出たら説明の必要があるくらいの概念だと思うけどね。

この手の話でいうと、個人的にはスコープ(プログラムテキストの範囲)と名前空間(名前束縛の集合)の概念が混用されがちなのが気になることが多いかな。文脈でわかると言えば分かるんだけど。
2026/08/23(日) 19:39:17.56ID:/SMVVWF/
どのAIに聞いても
scopeは空間で、extentは時間(期間)
だって答えるよ
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

「広がり」 「連続体」 検索で見当らないが
造語?
2026/08/23(日) 19:41:42.55ID:vGPmWGdI
lifetimeでええやん
2026/08/23(日) 19:41:52.22ID:HWzbbtqX
>>737
そうだな。
そこに疑い持つ段階で、ああこの人素人なんだなと
バレちゃうわけよ
2026/08/23(日) 19:42:00.06ID:/SMVVWF/
静的extentってもプログラムの生存期間とイコールなだけだよなぁ
2026/08/23(日) 19:44:03.25ID:HWzbbtqX
>>739
なんかねぇ言語処理系の分野ではextentってよくいうのよ
lifetimeの方が砕けた言い方になるけど
たぶん Bindも含めて論じてたからじゃないかなと想像してる
2026/08/23(日) 19:45:42.76ID:HWzbbtqX
>>741
基本的にはその通りなんだけれど、
ただし動的メモリ管理の言語のsymbolへのBindの話だとちょっとちがってくる
まぁコマけーこたー君らには関係ないかもだけど
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"; // 加算結果は一時オブジェクト
2026/08/23(日) 20:01:56.91ID:HWzbbtqX
>>744
その分類では、C,C+の演算過程の値や関数の戻り値を第4のTemporary lifetimeとして分類しているけど
それらは通常CPUレジスタ上に割付けられる。

構造体を返す関数の戻り値は、言語処理系の設計ポリシーにより何種類かあるが
・レジスターにのせて返せるものはレジスターで返す
・callee側に隠れ静的領域を確保しておいてそこに構造体戻り値を格納しポインターをかえす(再帰呼び出し不可)
・caller側の変数領域に隠れ領域を確保しておいてそのpoinerをcaller - callee間の隠れ引数でやり取りする
など、

したがって、バイナリレベルで厳密に見ると、演算過程の値や関数の戻り値は
ちょっと違ったextentをもつともいえる
2026/08/23(日) 20:03:31.84ID:HWzbbtqX
まあいいやこういう議論ができる椰子を5chですっかり見かけなくなったな
最近は素人バッカで寂しいことだ
2026/08/23(日) 20:08:24.38ID:LEbYCREd
>>745
アホか
それは特定の実行環境における特定の実装方法に過ぎない
それらのライフタイムの概念は抽象的なものだぞ
2026/08/23(日) 20:10:03.03ID:HWzbbtqX
>>747
だからバイナリレベルでって書いてるだろ
再帰呼び出し不可とか蒸発しちゃうとか色々違いがあるんだよ
2026/08/23(日) 20:10:42.58ID:/SMVVWF/
で、そのそれぞれのextentを安全に扱える事を保証する書き方ってあるの?
ってのが>>712
2026/08/23(日) 20:12:21.25ID:HWzbbtqX
そりゃまた全然別の話だな
安全に扱える事の保証まで話を飛ばした覚えはないぞ
2026/08/23(日) 20:17:01.44ID:nqebcotO
>>749
Rustのlifetimeの概念は存在する場所を指す参照の有効性まで保証するためメモリ安全性まで保証される
2026/08/23(日) 20:19:52.55ID:/SMVVWF/
>>751
ほぇ〜
ちょっとRust習って来る
2026/08/23(日) 20:29:57.00ID:/SMVVWF/
Rustはオブジェクト指向言語じゃ無いとか言ってるけど、全然オブジェクト指向じゃん
なんだよ騙されたわ
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
2026/08/23(日) 21:07:13.20ID:8BxqUOBF
>>753
Rustはオブジェクト指向言語として秀逸で書きやすいよ
クラスはなくクラス継承機能は排除されているためそこがらみの諸問題に陥らずに済むよ
756デフォルトの名無しさん
垢版 |
2026/08/23(日) 21:37:34.30ID:QvCbW4h1
マルチパラダイム言語だよ
2026/08/23(日) 22:28:26.34ID:ZAzIf/3C
多くの言語がマルチパラダイムなので機能的に備えているかどうかの話になる
Rustはオブジェクト指向プログラミングや関数型プログラミングなど多数に分類されている
2026/08/23(日) 22:50:38.05ID:RAuysaEg
>>599 java
https://ideone.com/pC1BHy
・OOP名物の(?)継承でなんとかするやつ
・あんまりなんとかしようとしすぎると苦しいやつ
2026/08/23(日) 22:54:24.86ID:FmydbG/s
で結局>>656の「動的インスタンス(動的extent)」のくだりは何が言いたかったわけ?
動的なインスタンスじゃなく静的なインスタンスならプログラムを表すモデルとして適していたということなの?
2026/08/23(日) 23:28:35.98ID:pEBnUgcx
静的なインスタンスって何?
コンパイル時点でインスタンスを生成すること?
2026/08/23(日) 23:49:43.23ID:FmydbG/s
>>760
俺もわからないよ
動的インスタンスと書いてあるからには静的インスタンスがたぶんあるんだろうと
そこが分かれば何が言いたかったのか少しは理解できるのかもしれないという期待を込めて聞いてる
2026/08/24(月) 00:01:55.87ID:fk+XdLZ4
>>715
>コンパイラーの専門書などでは普通に使われているよ
何ていう本?
有名どころ5〜6冊調べてみたけど1冊も使われてなかった
少し古めのやつでもみんなlifetimeという用語だった
2026/08/24(月) 00:25:28.72ID:7vbS4728
文脈から言えば、おそらく
静的インスタンス=静的extentを持つインスタンス、
動的インスタンス=動的extentを持つインスタンスで、
動的extentの意味については>>670または>>630に依拠するということなんだろうと思うけど。
>>656の文脈で妥当な用語かどうかは何とも。
2026/08/24(月) 00:26:58.71ID:7vbS4728
失礼、630じゃなくて>>663だね。
2026/08/24(月) 00:33:36.60ID:XdmkfJiJ
>>763
Google検索に依拠はおかしいだろ
C++の動的extentが出て来て動的サイズの意味になる
lifetimeの意味ではなくなるぞ
2026/08/24(月) 01:13:41.24ID:7vbS4728
>>765
あくまでも寿命・lifetimeの意味の中での話なので、>>663について言えば「関数や処理の実行が始まってから、その処理が終了してスコープを抜けるまでの間だけ存在・有効である期間」の部分ということになるんでしょ。>>670でいう(変数のextentだけど)自動extentに相当するやつ
2026/08/24(月) 01:35:33.81ID:YY0Bkc3V
>>670
>エクステントの種類
>静的エクステント(Static):プログラムの開始から終了までずっとメモリに存在します。
>自動エクステント(Automatic):関数やブロックの実行が始まった時に作られ、終わると消えます。
>動的エクステント(Dynamic):プログラムの実行中に明示的な割り当てと解放を行って管理します。
2026/08/24(月) 01:35:52.80ID:Oc4AU0Vk
>>766
変数のextentならわかる
変数を伴わずにその意味のextentの用例はない
変数のextentと言うべきだ
2026/08/24(月) 01:37:01.20ID:Oc4AU0Vk
>>767
エクステントにそんな意味はない
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/
2026/08/24(月) 01:48:27.94ID:YY0Bkc3V
自分が知らないことだからと言って
この世にそんなことは存在しないというのは
無知の知にすら至っていないということ
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."
2026/08/24(月) 01:50:09.37ID:YY0Bkc3V
おっと、「無知の知」が何のことか知らないかもしれないが
2026/08/24(月) 01:52:28.36ID:YY0Bkc3V
>>772 それに
extent is a diarect of lifetime とか書いてあった?
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)とは,オブジェクトに対して記憶域の確保が保証されている,プログラム実行の一部分をいう。
オブジェクトは,生存期間を通じて存在し,一定のアドレスをもち,最後に格納された値を保持する。
2026/08/24(月) 01:54:55.54ID:tjHHW3WH
C#でもいずれもlifetime

ECMA-334 "C# Language Specification"
JIS X 3015「プログラム言語C#」
Microsoft Docs
2026/08/24(月) 01:56:14.03ID:YY0Bkc3V
>>775
C++ Storage Extent (Variable Lifetime) とかさん散見するぞ

「正式用語」だとどこに明記されていた
2026/08/24(月) 01:59:02.21ID:YY0Bkc3V
こんなところにも書いてあった、きょうまで知らなんだ

ttps://www.cqpub.co.jp/try/kijidb/yougo/san.htm
2026/08/24(月) 02:01:08.78ID:+DQpda2q
ソース >>775 >>776 も出たから公式はlifetimeで確定やな
extentは非公式なのだろう
2026/08/24(月) 02:01:12.92ID:YY0Bkc3V
知らないんだよ。それをないない言ってんだよ
アホだから
2026/08/24(月) 02:03:29.13ID:YY0Bkc3V
知らないのは、まあしょうがない

知らないことを、無いことだと決めつけるのは、いわゆるバカ
2026/08/24(月) 02:03:29.42ID:+DQpda2q
ID:YY0Bkc3Vがextentの公式ソースを出せればまだ逆転のチャンスもある
現状では公式はlifetimeが示されてる
2026/08/24(月) 02:05:27.53ID:YY0Bkc3V
>>782
そういうのを悪魔の証明っていうんだよ
「宇宙人がいないと証明してみと」など
子どもが口喧嘩でよく使う詭弁だよ
784デフォルトの名無しさん
垢版 |
2026/08/24(月) 02:07:42.66ID:PTJtZFr3
どうやら分かったぞ
変数extentはLispの方言らしい
他ではlifetime
だからISOやJISなど公式はlifetimeになってるとのこと
2026/08/24(月) 02:09:52.22ID:YY0Bkc3V
C、C++、C# などの言語で、extent も life timeもしばしな使われる
しかしどっちが公式用語だと定義した公式文章は
目にしたことはない

それを知らない人が「extentと言わない」と言っているだけ
以上だ
2026/08/24(月) 02:11:38.13ID:PTJtZFr3
>>785
既に公式ソースでlifetimeと示されてるのだからあきらめなされ
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など)での生存期間との比較

知りたいアプローチを選んで教えてください。

(リンク略)
2026/08/24(月) 02:13:29.60ID:YY0Bkc3V
せめてさ、無知の知にくらい至れよ

そうじゃないとサル以下の知性だぞ
2026/08/24(月) 02:14:26.30ID:YY0Bkc3V
自分がサル以下の知性だと示すのに
何でこんなにレスを長引かせるかな
2026/08/24(月) 02:14:44.27ID:PTJtZFr3
>>785
あともう一点
extentとは言わない、と言われてるのではなくて
変数を伴わなければextentにそんな意味はない、でしょ
そこを改変したらダメよ
2026/08/24(月) 02:17:51.26ID:44BTsNfK
少なくともC++で動的extentと言ったら配列などの要素数が実行時に決まること
std::dynamic_extentとして公式に定義されてます
2026/08/24(月) 02:18:35.16ID:YY0Bkc3V
>>790
またいい加減なことを
そしたら「Storage Extent bound from a symbol」とか普通に言うけど
どうすんのよ
2026/08/24(月) 02:19:33.13ID:YY0Bkc3V
>>791
あれは名前で誤解を受ける人が多いと今回思った
2026/08/24(月) 02:21:01.31ID:YY0Bkc3V
何であんな名前にしたんだろう
由緒を知らん
2026/08/24(月) 02:21:38.07ID:KXRsacg9
CもC++も規格で決まっていてISO/IECとJISになってるよ
もちろん公式にlifetime
2026/08/24(月) 02:25:25.15ID:caAmipCZ
extentに生存期間の意味はないため
lifetimeが公式になってるようだな
2026/08/24(月) 02:32:03.86ID:YY0Bkc3V
c++のそれらの企画書では時間的な長さ(生存期間)をlifetimeまたはstorage durationとよび
std::dynamic_extent は空間的なサイズ(要素数)に用いて使い分けているな

C言語の標準規格(ISO/IEC 9899)においては、配列のサイズを extent とは呼んでいないようだな
2026/08/24(月) 02:32:52.68ID:YY0Bkc3V
>>796
意味は持っているよ
なんでさ、知らないことを「ない」っていうの?
変なあたましてるな
2026/08/24(月) 02:34:08.35ID:RtsQfhBt
>>797
そうだよ
時間的な方はlifetimeと呼ぶのが正しい
2026/08/24(月) 02:39:28.95ID:RtsQfhBt
英英辞典で調べてもextentに生存期間の意味はない
lengthやsizeの意味はある
だからC++のstd::dynamic_extentが配列などの長さやサイズの意味で用いてることは正しい
つまり動的extentは動的サイズ
2026/08/24(月) 02:41:42.77ID:YY0Bkc3V
英英辞典には載っていないだろうなw
2026/08/24(月) 02:53:04.24ID:RtsQfhBt
C/C++/C#の規格書はlifetimeなんだな
あとは規格や公式でextentを用いるプログラミング言語があるのかどうか
2026/08/24(月) 02:59:57.04ID:RtsQfhBt
Rustは規格書がないようだが公式でlifetimeと言ってるな
2026/08/24(月) 03:12:48.44ID:YY0Bkc3V
C++では、C++11以降の標準ライブラリや、C++20/C++23で追加された新しい機能において、
配列などの「(各次元の)要素数、あるいはデータの広がり(長さ)」を指す用語として extent という言葉を使っている。

とのことだ

なお、Cで配列などの空間サイズにextentというコトバを使うことはない
2026/08/24(月) 03:27:00.00ID:BSEHZD2k
なるほど
変数などの生存期間はlifetimeと呼んだほうが良いわけか
2026/08/24(月) 03:29:17.82ID:YY0Bkc3V
>>805
C++ではサイズにextentを使うようになっちゃったので、
時間の方はlifetimeを使い分けるのが無難ってことだな
2026/08/24(月) 03:34:14.48ID:YY0Bkc3V
時価だ空間だ書いているとまた場の理論のおじさんが
妄想を爆発させそうだなw
2026/08/24(月) 03:48:54.71ID:BSEHZD2k
>>806
使い分けはその通り
経緯は先にCの標準規格書としてlifetimeの用語が定まった
C++も同じく標準規格書としてlifetimeの用語が定まった
後にC++20の時にdynamic extentを動的なサイズの意味で配列などの要素数に用いた
std::dynamic_extent
2026/08/24(月) 03:51:14.54ID:YY0Bkc3V
>>808
サイズ面でextentをつかうよになったのは割と新しめのC++か
2026/08/24(月) 03:57:58.68ID:YY0Bkc3V
結局話の発端の

>659
>動的extentって何だ?
>例えばC++のdynamic_extentはオプション指向と関係ないように
>概念を話すときに特定の言語でのみ通用する用語は使わないでほしい

とは何だったのか。
2026/08/24(月) 04:00:23.52ID:YY0Bkc3V
相手する値打ちの無い輩だったということか…
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]
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はその本来の意味に沿っている
2026/08/24(月) 04:24:18.55ID:/7yyHiO5
>>813
sizeにを使う用になった言語は
0x11以降のc++の他になにかある?
2026/08/24(月) 04:25:13.82ID:/7yyHiO5
>>814 extentが抜けた

sizeにextentを使う用になった言語は
0x11以降のc++の他になにかある?
2026/08/24(月) 04:33:06.49ID:/7yyHiO5
そんな、必死で検索して探さなくていいよ
もう寝なよ
2026/08/24(月) 06:26:02.29ID:CNRXA6iN
>>744を使えばもめることも誤解されることもなくて平和だよん
2026/08/24(月) 07:54:25.67ID:0OmhbSEr
extentを時間的要素に用いるのはかなり一般的じゃ無いって事でOK
819デフォルトの名無しさん
垢版 |
2026/08/24(月) 08:32:51.10ID:m7Qyi1DS
オブジェクト指向でプログラム書いてるけどエクステントの言葉は知らなかった
スコープから外れたオブジェクトはいずれGCされるとだけ思ってプログラム書いてるしそれで問題ない
エクステントを意識して書かれたプログラムは何かが良くなるとかそういうのは別にないんでしょ
プログラムの動作を説明するときに役立ちそうではあるけどね
2026/08/24(月) 08:41:35.36ID:0OmhbSEr
>>819
GCも完璧じゃ無いんだよなぁ
まあ、完璧じゃないのは使う側の勘違いがほとんどだけどさw
821デフォルトの名無しさん
垢版 |
2026/08/24(月) 09:09:17.26ID:m7Qyi1DS
マネージドヒープで管理できないものはあるからね
ネイティブメモリはローンパターンとかリソースモナドっぽいものを拵えて管理してるわ
822デフォルトの名無しさん
垢版 |
2026/08/24(月) 09:09:45.80ID:++uoiV4H
誰も真のオブジェクト指向でプログラムできないからねぇ
それっぽい機能使ってるけどforループで回して手続き型プログラムやってる
関数や配列の強化版としてしか使えていない
823デフォルトの名無しさん
垢版 |
2026/08/24(月) 09:25:33.80ID:m7Qyi1DS
>>822
誰もできないなら真のオブジェクト指向があると考えてる人がバカなんじゃないの? 違うの?
2026/08/24(月) 10:06:50.63ID:9H+y+Lt4
CのlifetimeとLispのextentとRustのlifetimeは
何かしらの生存期間/有効期間を表現しているという意味では同じだけど
肝心の「何かしら」の中身が違うので同じものとして取り扱わないほうがいい
2026/08/24(月) 10:45:45.63ID:W8icJp64
>>783
エクステ爺さんは悪魔の証明の意味も知らんのかw
「例を出せ」と「無いと証明しろ」を同一視するとか頭おかしいだろ
2026/08/24(月) 10:56:41.85ID:0OmhbSEr
>>822
真のオブジェクト指向でプログラム出来ないとかw
道具を道具として使えない奴の言い訳にしか聞こえないなw
んなもん道具なんだから頭でウジウジ考えて真のオブジェクト指向目指すより
テキトーに道具として使った方が勝ちだ
827デフォルトの名無しさん
垢版 |
2026/08/24(月) 11:22:03.68ID:++uoiV4H
つまり用途がないんだよオブジェクト指向にはな

世の中の実業に求められてるのは手続き型プログラムってことよ
2026/08/24(月) 11:30:53.67ID:0OmhbSEr
機能分割くらいに考えて使えればいいんだよ
グダグダ屁理屈並べてああでもないこうでもないで何日も時間潰しても
結局最後は設計が悪かったになるんだから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++ならテンプレートだな。まあ、会社では使用禁止だろうけど。
2026/08/24(月) 12:43:50.88ID:0OmhbSEr
テンプレートやマクロって、公的に利用されてるもの以外は混乱の元なんだよね
2026/08/24(月) 12:50:46.60ID:/rJQvH3P
>>656
>クラス(カプセル化)、動的インスタンス(動的extent)、継承、多態といったもので
>プログラムを現すモデルとして実は適していなかったおそれがあると思う

これやっぱりCOBOLのような手続き型を想定した話だったのか
さすがおじいさん
2026/08/24(月) 12:54:25.98ID:ApDDNJ0D
東工大の大学院出てそうだなwww
2026/08/24(月) 13:08:11.00ID:/7yyHiO5
なぜそう思った?
2026/08/24(月) 15:41:30.92ID:NI+byBux
この使い分けも難しい
ニブル (nibble)
テトラード (tetrade)
カルテット (quartet)
2026/08/24(月) 15:46:54.81ID:/TxIyeAu
>>835
気分はstatic!だから
838デフォルトの名無しさん
垢版 |
2026/08/24(月) 16:08:32.29ID:FITgzI9F
えらい勢いあるねこのすれωωω
839デフォルトの名無しさん
垢版 |
2026/08/24(月) 16:49:46.42ID:++uoiV4H
不毛なことって延々と続くからね
2026/08/24(月) 18:18:43.72ID:0OmhbSEr
スキー用具が冬季オリンピックの開催国で使われる名称になるみたいな差だからいいんだよw
2026/08/24(月) 18:46:36.30ID:9P8EVJBT
>>833
エクステじいさんが言いたかったことは>>29の内容だろうな
その>>29自体も何かと意味不明だが
2026/08/24(月) 19:06:41.35ID:oSCPHv4Q
>>29
>>・extentが独立な状態変数は、どうしてもそうしなければならないもの以外、なるべく状態変数にしない

このextentが独立はlifetimeが独立の意味?
生存期間が独立って表現おかしくない?
生存期間が静的と言いたいのかな?

>>特にextentとscope。
>>C言語で明確化された、ネストしたシンプルで分かりやすく
>>そしてextentと対応付きやすいscopy

ネストしたと書かれているから
おそらく多段ブロックスコープの話っぽい
でもextentはscopeと対応しないから意味を持つよね
extentを敢えて出す意味は?
2026/08/24(月) 20:30:04.38ID:SH8uZeIr
馬鹿しかいない
2026/08/24(月) 22:28:44.89ID:/7yyHiO5
ほんとそう思った
2026/08/24(月) 23:11:07.53ID:SAx4f3U/
>>599 java
https://ideone.com/pC1BHy
・委譲でなんとかするやつ
・継承でなんとかするやつは>>758
2026/08/24(月) 23:12:21.80ID:SAx4f3U/
>>599 java
https://ideone.com/nx3a5x
・委譲でなんとかするやつ
・継承でなんとかするやつは>>758
2026/08/24(月) 23:56:26.47ID:5ApQpNZr
>>345
マジックナンバーがわかった
-1431655765 = (2^33 + 1) / 3 を符号付き32bit
1431655766 = (2^32 + 2) / 3
848デフォルトの名無しさん
垢版 |
2026/08/25(火) 03:53:26.26ID:Fbem61UJ
staticおじさんは
staticおじいさんに進化しました
2026/08/25(火) 06:40:27.48ID:DTj/Nd7/
>>758
乙。

地獄やな…
2026/08/25(火) 09:32:51.45ID:DTj/Nd7/
オブジェクト指向はその仕組みが元凶で悪というよりも
自由度が高かったり色々な(変な・凝った)書き方が出来てしまい
それを使う人間が上手く律し利点だけを引き出すような使い方が結局できない
思い込みと自己流で変な流用の仕方をしがちだった

使う人間側にも問題があったのではないかと最近では思う
それをそれを制限する仕組みをオブジェクト指向は備えていなかった

で、制限する言語が最近出て来た
2026/08/25(火) 10:13:57.96ID:oBSBF0sY
オブジェクト指向言語自体は洗練されてるからねw
提供されてるライブラリのクラスメソッドの出来の良さよw
2026/08/25(火) 10:26:10.59ID:6vdc+tuL
>>845
JavaってDictionaryやTupleってないの?
あとintかstringを返す場合はObjectを返す以外にない?
最初の数行で気になって
853デフォルトの名無しさん
垢版 |
2026/08/25(火) 10:29:44.33ID:2JbrJHvg
delay()を初心者に教えるとその先が壁になって
いつまでもシングルタスクのまま進歩しないのと同じだな
854デフォルトの名無しさん
垢版 |
2026/08/25(火) 10:51:57.55ID:kmT7Vw9O
>>852
自分で調べろ
2026/08/25(火) 10:58:49.00ID:V26zP6ij
>>599 Pythonで書いた例。正直ちょっとわかりづらいので、本当はコメントが必要かも。
https://www.ideone.com/tGe3is
856デフォルトの名無しさん
垢版 |
2026/08/25(火) 11:01:52.62ID:kmT7Vw9O
>>855
specって何? specが気になってぜんぜん頭に入ってこない
2026/08/25(火) 11:04:09.41ID:dp5nuGuB
satisfied_countってなんやねん!
2026/08/25(火) 11:10:09.26ID:FPo7YXHj
つか、なんでみんなダラダラ条件分岐書き連ねるの?
859デフォルトの名無しさん
垢版 |
2026/08/25(火) 11:18:37.93ID:kmT7Vw9O
>>858
他に良いやり方あるんけ? おーん?
2026/08/25(火) 11:19:36.83ID:oBSBF0sY
まあ、バカがループ禁止にしたからかな?
2026/08/25(火) 11:32:42.57ID:V26zP6ij
とりあえず出力ができるものということで書いたので、粗があるのは許してちょ。specは、〜specの並びを見れば、意図するところは分かってもらえるかなと思ったんだけどね(>>593でも書いているし)。
woofルールがなければ述語関数を渡して判定させるという形で書けるのでまだ分かりやすかったと思うんだけど、今回は、woofルールもまとめて一本で書いたので正直分かりにくくなった面はあると思う。
ま、あくまでお試しで書いてみた例にすぎないので、その程度のものとして見てもらえれば。
2026/08/25(火) 11:40:36.88ID:FPo7YXHj
>>859
辞書作って判定回せばデータ変えるだけだぞ
863デフォルトの名無しさん
垢版 |
2026/08/25(火) 11:47:07.75ID:kmT7Vw9O
>>862
ほほんw それでやってみ、できないからw
864デフォルトの名無しさん
垢版 |
2026/08/25(火) 11:47:53.08ID:kmT7Vw9O
エアプが妄想でこうやれば良いと言っててウケるw
2026/08/25(火) 11:52:07.39ID:FPo7YXHj
>>863
え?
最初のルールから変わったんか?
2026/08/25(火) 11:59:10.14ID:V26zP6ij
>>855 のboom(7539)のところが実際にはboom(35)になっていたので、一応修正版。まぁ、出力は変わらないんだけど。
https://www.ideone.com/T80HCK
2026/08/25(火) 12:03:40.92ID:FPo7YXHj
最小公倍数で回せなくなったのかw
あと変換後のスペル順番が違う…と
スペル変換をもう一つ噛ませればいいだけじゃん
2026/08/25(火) 12:06:57.49ID:FPo7YXHj
いっその事、1万テーブルの変換表作って
ダイレクトに参照させた方がいいまであるなw
2026/08/25(火) 13:36:41.58ID:uW9aS2eb
>>866
どこがオブジェクト指向なんだよ?
オブジェクトもなければメッセージパッシングもない
870デフォルトの名無しさん
垢版 |
2026/08/25(火) 13:55:36.08ID:kmT7Vw9O
>>869
自分で作れ
2026/08/25(火) 14:08:10.89ID:V26zP6ij
>>869
そう? 組み込みクラスのオブジェクトの便利なメソッドを使うというのも十分にオブジェクト指向だと思うけど。
そういうネジ・クギレベルのことを超えて、ユーザー定義クラスみたいなのを作って色々やるのがいいかどうかは設計時の考え方次第だと思うよ。今回は関数で十分だと思ったから関数にしただけの話で。
2026/08/25(火) 15:02:38.17ID:59HjenUa
>>871
どこにも見当たらないが
まさか関数呼び出しをオブジェクト指向と呼んでる?
C言語にも備わってる基本機能だぞ
2026/08/25(火) 15:23:05.74ID:oT3TaD7S
>>868
その変換表をどうやって作るつもりなんだよw
2026/08/25(火) 15:34:02.59ID:FPo7YXHj
>>873
ドキュメント見て作るさw
むしろ、特殊な文字出力する数字の場合だけデータ入れて、あとはnullとして通常ルール通りに処理させる分岐条件にするとかな
2026/08/25(火) 15:39:14.70ID:oT3TaD7S
>>874
1万までの数字すべての期待結果がドキュメントに逐一書かれてるといいねw
2026/08/25(火) 15:45:57.28ID:V26zP6ij
>>872
ユーザー定義関数もオブジェクトだし、words.appendとか、''.joinとかは普通にメソッド呼び出しだけど。forループやリスト内包では、内部的にiteratorオブジェクトのメソッド呼び出しがされているわけだし。
インスタンスの生成構文みたいなのがないとオブジェクト指向ではないという感覚なの?
2026/08/25(火) 15:47:28.12ID:FPo7YXHj
>>875
データ作るなんて簡単だぞw
こいつらの書いたコードの出力をまんま使えるからなw
2026/08/25(火) 16:34:19.36ID:92tTKry8
>>877
自分のバカさ加減にようやく気付いたようで何よりですww
2026/08/25(火) 16:34:41.01ID:59HjenUa
>>876
それは言語の機能だね
FizzBuzzをオブジェクト指向に実装する話とはレイヤーが異なるよ
880デフォルトの名無しさん
垢版 |
2026/08/25(火) 16:50:03.91ID:kmT7Vw9O
>>872
C言語に備わっていたらオブジェクト指向じゃないといつから錯覚していた?
881デフォルトの名無しさん
垢版 |
2026/08/25(火) 16:53:27.38ID:kmT7Vw9O
オブジェクト指向とはプログラムをわかりやすくする営みと知れ
882デフォルトの名無しさん
垢版 |
2026/08/25(火) 17:04:08.80ID:XljZ4S3B
オブジェクトを作ってそこへメッセージを投げることで動いていく
そのためのメッセージ送受をコーディングしていく
それがオブジェクト指向プログラミング
>>866は今回の目的のためにオブジェクトすら作っていない
883デフォルトの名無しさん
垢版 |
2026/08/25(火) 17:15:06.41ID:kmT7Vw9O
>>882
そうだ、それで良い
必要ないオブジェクトを作るのはオブジェクト指向ではない
884デフォルトの名無しさん
垢版 |
2026/08/25(火) 17:16:01.79ID:kmT7Vw9O
オブジェクトを最小限にすることもオブジェクト指向である
885デフォルトの名無しさん
垢版 |
2026/08/25(火) 17:16:52.90ID:kmT7Vw9O
Pythonは数値さえもオブジェクトだったりするんだよな
Pythonで書かれたプログラムはすべてオブジェクト指向の賜物
886デフォルトの名無しさん
垢版 |
2026/08/25(火) 17:24:18.32ID:kmT7Vw9O
メッセージパッシングがーと言ってるやつは自分で書いてみろ
できないんだったらメッセージパッシングによるオブジェクト指向は
現実では使い物にならないことの証拠である
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
誤:コードがシンプルにせよ
正:コードをシンプルにせよ
2026/08/25(火) 17:57:28.72ID:r1bVOdaF
>>866はオブジェクト指向プログラミングの要素が1つもないな
894デフォルトの名無しさん
垢版 |
2026/08/25(火) 18:00:20.67ID:kmT7Vw9O
>>893
そんなに他人のコードに文句があるなら自分で書きなよ
自分が思う最高のオブジェクト指向プログラムってやつをさ
895デフォルトの名無しさん
垢版 |
2026/08/25(火) 18:02:14.96ID:gX3JeEsp
手段の目的化の極み
2026/08/25(火) 18:10:28.36ID:a1NtL2p3
>>866
読んでみた
糞コードだと思った点の一つはCallable
それは非常に古い使い方でオブジェクト指向に対応していないC言語などで用いる方法
オブジェクト指向プログラミングに対応した言語はその点を解決している
2026/08/25(火) 18:19:04.63ID:hVPTaWzW
あーキレ散らかしてるのはJavaで書いた人かw
2026/08/25(火) 18:22:52.56ID:V26zP6ij
>>896
コメントありがとん。変数名・関数名が分かりづらいとかそういった方向の批判は予想していたんだけど、正直そこにツッコミが入るとは思わなかった。
たとえばwoof_ruleがなかったとして、classic_rule, digits_rule, boom_ruleがいずれも真偽値を返す述語関数だったとしたらどう? それともコールバック関数を渡すこと自体がダメという感じ?

>>897
そんなことないでしょ。出力例とかだいぶ参考にさせてもらったんだけど。
2026/08/25(火) 18:24:13.18ID:FPo7YXHj
>>878
車載コンピュータの演算装置とかは
データマトリックスをROMに書いてるんだぜ
8ビットマイコンの乗除演算とか複雑な計算をリアルタイムに近づける工夫さw
900デフォルトの名無しさん
垢版 |
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はうんざりだよ。所詮、コンピュータ上のお遊び
2026/08/25(火) 19:47:15.35ID:aTZ3N5IY
What Killed Smalltalk Could Kill ほにゃらら, Too
2026/08/25(火) 19:57:57.21ID:2ED0hgJy
BIG MOUTH👄
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()は各ルールが実装すべき抽象メソッド
残りは各ルールが共通に使える具象メソッド
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
}
}
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
なんていうか、猿でも作れるツクール的な感じ
だけどツールでもないしな

プロでも作れないオブジェクト指向のための言語になってる
2026/08/25(火) 21:16:16.70ID:1JhonwiJ
>>909
無駄じゃないだろ
2026/08/25(火) 21:20:57.24ID:DTj/Nd7/
>>911
削り落とせるぞ
913デフォルトの名無しさん
垢版 |
2026/08/25(火) 21:21:16.82ID:2JbrJHvg
CPUはかなり遠回りで無駄なことをしてるんだよ
人間様用の高級言語のせいでね
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億を超える大規模なシステム開発が失敗して損害賠償の裁判が起きたという話をたまに聞くだろ、ああいうのも元をたどればオブジェクト指向が原因なんですか?
2026/08/25(火) 22:04:51.61ID:hHo/2XBn
>>599 ruby
https://ideone.com/TZGLeB
・>>846の委譲でなんとかするやつの移植
・Javaの発想からスタートしたからRubyっぽくないかも

>>884
> オブジェクトを最小限にすることもオブジェクト指向である

かもね
やっぱクラスにせよインスタンスにせよ不必要に増やしたらあとで苦しいよ
2026/08/25(火) 22:13:35.74ID:1JhonwiJ
異なる種類のオブジェクトを共通のインターフェースに結びつけることは
オブジェクトの意味と立ち位置をはっきりさせる
オブジェクト間の関係もはっきりさせる

それらを使う側から見ると
インターフェース抽象型として同一に扱える
つまりコードの共通化ができる
インターフェースを実装してないオブジェクトに間違って適用してしまうバグも防げるため型安全性もある
C言語の関数ポインタやPythonのCallableと比べると使い勝手も安全性も格段に良くなっている

インターフェースを用いたオブジェクト指向プログラミングは可読性も保守性も良くなりバグも減らす
2026/08/25(火) 22:35:05.17ID:E8remrnh
>>919
最初の3行はいいこと言ってると思うがコードが>>905じゃ説得力が無いな
2026/08/25(火) 22:44:34.17ID:1JhonwiJ
>>920
もっと良いコードを示してくれるなら歓迎するよ
そのコードはID:V26zP6ij氏の>>866のコードのCallableを使っているルール部分をインターフェース化したもの
2026/08/25(火) 23:21:32.61ID:DTj/Nd7/
>>915
それなら最初から無駄を付けない・省くのが最強だろ
923デフォルトの名無しさん
垢版 |
2026/08/25(火) 23:24:12.29ID:jUy9So8k
プログラマじゃなく管理する側に都合のいいのがオブジェクト「至高」
プログラムを書かないのでどんな処理をするにはどんな書き方があるとか分かって無いけど、オブジェクト指向なら纏められるってので飛びついてオブジェクト指向が目的となってる
2026/08/25(火) 23:33:49.21ID:ERS3Iam5
インターフェイスを共通にするというのは良いとしても、コールバック関数で済むことなら個人的にはわざわざオブジェクトにはしたくないとやっぱり思っちゃうかな。
Pythonならユーザー定義クラスを作って継承するなりtyping.Protocolを使うなりすることはできるけど、特に状態管理が必要な場合等でなければコールバック関数の方が好ましいと思っちゃうな。
2026/08/25(火) 23:38:44.16ID:0Y/Xd6X8
>>924
全てオブジェクトなのにオブジェクトにしたくないとはどういう意味?
2026/08/25(火) 23:40:53.88ID:DTj/Nd7/
>>920
言葉に酔って本質を見失うタイプでしょw
2026/08/25(火) 23:44:47.08ID:ERS3Iam5
あー、ごめん、ユーザー定義クラスのインスタンスにはしたくないというニュアンスで受け取ってもらえれば。関数1つで済むところを、その代わりにクラスを作ってメソッドを定義するというのは、もちろんメリットもあるのだろうけど、本当に手間に見合うだけのメリットなのかというくらいの感じ。
2026/08/25(火) 23:45:31.01ID:yTdodo0t
>>924
そこで使えるコールバック関数一覧をどうやって管理するのかな
2026/08/25(火) 23:49:02.90ID:ERS3Iam5
FizzBuzzの拡張ルールくらいならそんなに多くはならないだろうし、仮に数十個、数百個になるというなら、専用モジュールを作ってそれに放り込んでおけばいいんじゃない?
2026/08/26(水) 00:12:54.49ID:qdTH26se
インターフェースは異なる型に対して共通のメッセージを送れる仕組み
一般的にはコールバックに置き換えられない
2026/08/26(水) 00:17:59.86ID:z15V+4Gv
インターフェイスが一般的にはコールバックに置き換えられないというのはもちろんそうで、今疑問を提示しているのは、コールバックで済むような場合に、わざわざインターフェイスを持ち出す必要はないのではないかということね。
2026/08/26(水) 00:30:47.65ID:aHX34kXI
コールバックが複数あってそれぞれに異なる名前を付けるということは複数のオブジェクトを作っているのと同じだね
それならメソッドとして実装した方が型安全性もよいかな
2026/08/26(水) 04:39:13.97ID:g57AhbG+
本当は君らプログラミングやソフトウエア開発が苦手なんじゃない?
苦手なのにその自覚がないだけなんじゃない?
2026/08/26(水) 04:49:18.83ID:suXVoFGf
プログラミングで一番大事なことは型安全だからラップして別の型に
2026/08/26(水) 04:56:22.38ID:g57AhbG+
違うだろ、もっとも必要なものは合理的な考え方だろ
2026/08/26(水) 05:05:16.08ID:qkiKzIk8
全てをイミュータブルにすることが大切
2026/08/26(水) 08:14:33.47ID:FBlplv6V
関数定義はユーザー定義クラスを定義する等してオブジェクトを作るより簡単だし、コールバック関数は渡された関数内で呼ばれるだけだから、呼び出そうとしたメソッドが存在していなかったという類の問題はもともと生じないと思うんだけど。
たとえば、Pythonの組み込み関数sorted(あるいはlist.sort)は引数keyとしてコールバック関数を取るんだけど(str.lowerなんかを指定する)、これを、特定のインターフェイスを備えたオブジェクトを受け取る形に変更した方が望ましいということにはならないと思う。
938デフォルトの名無しさん
垢版 |
2026/08/26(水) 09:19:21.67ID:sdi3yqbK
>>936
話は聞かせてもらいました
https://paiza.io/projects/CjTaDF7rHaOKmYUeN_Vavw
2026/08/26(水) 10:04:49.49ID:HFCsEuKA
>>938
ミュータブルを使うな
for (var i = 1; i < to + 1; i++) {
940デフォルトの名無しさん
垢版 |
2026/08/26(水) 10:06:16.63ID:sdi3yqbK
>>939
バカ乙
2026/08/26(水) 10:24:33.47ID:XAtO2pPN
>>937
メソッドが一つならともかく
複数のメソッドがあるとその組み合わせを毎回渡すことになってしまうぞ
各オブジェクトを渡す方がよい
2026/08/26(水) 10:42:25.83ID:p1kFnG2q
Woofのルールは303ならFizzFizzじゃなくてFizzFizzFizzみだいたよ
2026/08/26(水) 10:45:24.36ID:NdwH3mi0
>>938
toやdivやinがイミュータブルで作られていない
やり直し
944デフォルトの名無しさん
垢版 |
2026/08/26(水) 10:45:25.18ID:sdi3yqbK
>>942
キャー助けてー
945デフォルトの名無しさん
垢版 |
2026/08/26(水) 10:46:01.13ID:sdi3yqbK
>>943
バカ乙
2026/08/26(水) 11:07:33.27ID:HZ2sBvRV
>>938
オブジェクト指向のスレなのにMainしかなくて酷いコード草
947デフォルトの名無しさん
垢版 |
2026/08/26(水) 11:16:45.19ID:sdi3yqbK
>>946
酷いのはお前の頭で大草原、シマウマさんが走ってるわ
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
2026/08/26(水) 11:25:19.71ID:sC8u3BU+
>>938は関数型プログラミングをわかっていないのだと思われる
foldやreduceを知らない
2026/08/26(水) 11:28:41.50ID:C23DyjBn
>>941
コールバック関数を渡す設計にするのは、1つの引数に1つの関数を渡すというケースだと思うけど。複数のメソッドを持つオブジェクトを渡すことが必要な場合ならもちろんオブジェクトで渡すけれども、sortedのkey引数のように単一の関数を渡せば済むようなケースで、あえて単一メソッドのオブジェクトを作って渡す必要はないんじゃないかと思う。
951デフォルトの名無しさん
垢版 |
2026/08/26(水) 11:38:52.55ID:sdi3yqbK
>>949
バカ乙
2026/08/26(水) 11:39:45.46ID:N0ZXk9lg
>>950
メソッドを通常関数に置き換えるにはオブジェクトの値も必要だよ
オブジェクトの値はどうやって渡すの?
953デフォルトの名無しさん
垢版 |
2026/08/26(水) 11:55:56.95ID:JrGcaWVK
オブジェクト指向はオワコン? part3
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
オブジェクトの状態を変えられるか否かが可変性(ミュータブル/イミュータブル)
変数への再代入ができるか否かが再代入可能性(リアサイナブル/ノンリアサイナブル)
これらは異なるものなんよ
2026/08/26(水) 12:08:33.08ID:C23DyjBn
>>952
たとえば、Pythonの組み込みソート関数sortedの引数keyには、引数を1つとって1つの値を返すコールバック関数を渡すんだけど、このコールバック関数の引数になるのはソート対象のコンテナの各要素なので、イメージとしてはコンテナの各要素に対して(コンテナの各要素を引数として)コールバック関数を呼び出す感じになる。
で、このコールバック関数を仮にオブジェクトのメソッドに置き換えるとした場合、何をレシーバーにする(どのオブジェクトに属するメソッドにする)のが、設計上無難なのかというのは、コールバック派の自分にはよく分からないかな。何らかの管理用オブジェクトを作ってそのメソッドにする方向になるのかなとも思うけれども。

メソッドのレシーバーをどのように渡すのかという問いに対しては、そもそもどういったものがレシーバーとして想定されているかがよく分からないのでそれを明らかにしてもらえると助かるかなという感じなのだけれど。
2026/08/26(水) 12:10:23.44ID:sU6/QjKC
>>955
バカだろ
オブジェクトを変数に入れれば書き換えてもいいんだな
958デフォルトの名無しさん
垢版 |
2026/08/26(水) 12:16:38.05ID:sdi3yqbK
>>957
何をデスカ?
オブジェクトがイミュータブルならオブジェクトを変数に入れてもオブジェクトの状態は書き換えられませんよ
変数への代入とオブジェクトの状態を変える操作はまるで違うものだということを理解したが良い
2026/08/26(水) 12:25:10.38ID:5yDcdQ0U
>>956
その例は既に暗黙の引数として対象コンテナがsortedに渡されているからたまたま上手くいってるってことなのね
sortedは例として良くない例ですね
他の例を持ってきましょう
960デフォルトの名無しさん
垢版 |
2026/08/26(水) 12:36:00.57ID:vdIJI+q7
>>958
そこは言語によって千差万別だから意味のない主張
さらに全てがオブジェクトの言語もあれば
言語仕様にオブジェクトの概念が存在せず型とその値とそれを格納する変数しか存在しない言語も多い
オブジェクトだけがイミュータブルという主張こそ馬鹿げている
2026/08/26(水) 12:36:50.80ID:C23DyjBn
「コールバック関数で済む場合に、わざわざオブジェクトを渡す設計にする必要はないよね」という主張なので、「コールバック関数で済む場合もたしかにあるね」ということになると、主張の対立するポイントがなくなって話は終わってしまうのだけど。別に何でもかんでもコールバックでやりましょうと言いたいわけではないので。
962デフォルトの名無しさん
垢版 |
2026/08/26(水) 12:43:56.53ID:sdi3yqbK
>>960
イミュータブルなオブジェクトを変数に代入しても
オブジェクトが可変になるわけじゃないでしょ

> オブジェクトを変数に入れれば書き換えてもいいんだな

と言っておられたからオブジェクトの状態は書き換えられないよってこと
再代入しても良いかという問いならやりたければやれば良いと思う、が僕の主張だよ

言語によって千差万別だというのが君の主張だね
その主張に意味があるとは僕は思えないな、シマウマ追っかけてた方がまだ有意義だよ
2026/08/26(水) 12:51:45.29ID:wdN0r8cQ
>>961
横からだが
特化した処理部分をコールバック関数という形で受け取って処理するか
インターフェースを実装したオブジェクトを定義して特化した処理をメソッドの中に書くか
を比較してるんじゃないのかな?
2026/08/26(水) 12:53:37.51ID:nPTCa+m2
>>961
コールバック関数が一つだけなら大丈夫だよ
しかし今回は多数の種類があるから話が別かな
多数ある関数が同じ場所で使われる同類だとコード上で示す必要があるよ
たまたま同じ型の関数が間違って使われることを防ぐことも必要だね
それらを一気に解決する方法としてラップがあるよ
値オブジェクとも言われてその値だけをラップしたオブジェクトを作る方法
今回の場合はコールバックとして使われる関数をすべて同じオブジェクトとしてラップだね
もちろんメソッドは要らないし他の値は持たないから手間もかからないよ
これだけで同種のオブジェクトとしてコード上に明示されると共に型安全性も保証されるメリットがあるよ
2026/08/26(水) 12:58:49.29ID:yH/m4JlP
>>938
大量にミュータブル変数があるなあ
全てをイミュータブルにすることが大切
2026/08/26(水) 12:58:58.05ID:wdN0r8cQ
>>964
色んな種類の関数を受け取れるようにするためにコールバック関数があるんだから多数の種類がない場合なんてない
967デフォルトの名無しさん
垢版 |
2026/08/26(水) 13:01:35.44ID:sdi3yqbK
>>965
ローカル変数がミュータブルでも関数が純粋であることには変わりはないから
変数への再代入を禁止することが大切だというのはただの君の思い込み
君は昔から思い込みが激しい、僕のコードを100回読んで心を浄化したが良い
礼はいらないよ、僕のコードで君が救われるなら本望だ
968デフォルトの名無しさん
垢版 |
2026/08/26(水) 13:05:31.82ID:sdi3yqbK
ミュータブル変数と言った場合は変数の型がミュータブルであることを表すから
再代入できるという意味なら可変束縛の方が良いかもね
2026/08/26(水) 13:09:45.53ID:NsymNjtw
>>966
内部利用ならそれで全く問題ない
しかし今回は色んなグローバル変数にコールバック関数が入っているから区別して型安全にする義務があるところ
2026/08/26(水) 13:22:13.27ID:C23DyjBn
>>963
その比較で「コールバック関数で済む場合もある」と「オブジェクトを渡す方が常に優れている」との違いというのが見解の実質的な対立点かなと。

>>964
同種の機能・役割を果たすことを示すための箱・入れ物としてオブジェクトを使うというのは、(それしか道具立てがない言語なら仕方ないのかもしれないけれど)ちょっと抵抗感があるかな。もし本当にそうすることが必要なら(そのような場合がどの程度あるのかというのも考え方が分かれそう)名前空間なりモジュールなりを使うのが最近の言語の考え方なのかなと。
たまたま同じ型の関数が誤って呼ばれることを防ぐということを型安全性と呼ぶなら、もしそれが本当に深刻な問題になるようなケースなら、Protocolとかインターフェイス的なものを使うことになると思うけれども(ラップはうーん……どうなんだろう)、そんなケースがどの程度あるのかな。少なくとも、ソートのkey引数に指定するのが裸のコールバック関数なのは型安全性に欠けて困ると思ったことはないけど。
2026/08/26(水) 13:22:47.79ID:MCEvoZYr
>>967
純粋関数かどうかは副作用がなく参照透過であるかどうかということであって別の話
イミュータブルで書く能力がないために言い訳ばかりしてるようだな
972デフォルトの名無しさん
垢版 |
2026/08/26(水) 13:26:32.89ID:sdi3yqbK
>>971
そうだよ、別の話だよ
だからこそ再代入を禁止する意味がないよねって論旨だよ
意味は自分の思い込みを他人に押し付けようと必死だね
973デフォルトの名無しさん
垢版 |
2026/08/26(水) 13:26:54.38ID:sdi3yqbK
> 意味は
君は
974デフォルトの名無しさん
垢版 |
2026/08/26(水) 13:27:39.42ID:/aytuK8b
>>970
型安全性のためのラップはオブジェクトやオブジェクト指向とは独立してそれ以前からある技術です
受け付ける側がラップ型しか受け付けなくなるためラップして持つだけで型安全性が保証されます
生で扱うのはやめましょう
2026/08/26(水) 13:37:15.37ID:KzCaqnIk
まだやってんの?
手続き型で数十行で済んじゃうコードを
わざわざ複雑にしてw
オブジェクト指向プログラミングってのは
そんな馬鹿な使い方の為にあるんじゃ無いのにw
2026/08/26(水) 13:39:01.55ID:C23DyjBn
>>974
そのラップというのは、メンバー・属性として持ついわゆるhas-a的なものという理解でいいのかな。
正直、そこで想定されているような意味での型安全性が深刻な問題になる場合がどの程度あるのかという点についてかなり懐疑的に思っているんだけど。
sorted( some_iterable, key = wrapped_cb ) と書きなさいということでしょ。その方が良いよと言われても、にわかにうんとは言いづらいかな……。
977デフォルトの名無しさん
垢版 |
2026/08/26(水) 13:39:39.63ID:sdi3yqbK
>>975
>>599 やってみ、お手並み拝見
978デフォルトの名無しさん
垢版 |
2026/08/26(水) 13:40:11.49ID:sdi3yqbK
>>975 が手続き型で数十行で書けるってよ、みんなで見ようぜ
2026/08/26(水) 13:47:55.93ID:fGjq5Quw
引数が値だけの関数だけではなく

引数にミュータブルなオブジェクトの不変参照を渡しても
その時のオブジェクトの値が使われるだけなので問題ない

同様にミュータブルなオブジェクトの可変参照を渡しても
その時のオブジェクトの値が使われるだけであり
変更が反映される対象は使う側が可変参照を渡したオブジェクトだけに限定されるためこれも問題がない

問題が起きるのはグローバル変数の変更だ
使う側から見て指定していないものが変更されるからである
これを副作用と言う
副作用を持たない関数を純粋関数と呼ぶ
オブジェクトがミュータブルかどうかは関係ない話だ
2026/08/26(水) 13:55:17.86ID:i+Y8ddFj
>>978
ばーか
手続き型で45行で書けることは既に>>948で示した
2026/08/26(水) 14:05:33.88ID:C23DyjBn
948を書いた者としては、「示された」としてもらえたらよりありがたかったかな。手続型ベースと評価されるのは別に構わないんだけど、一応、オブジェクト指向で設計された組み込みライブラリを利用しているよ。
2026/08/26(水) 14:10:28.01ID:FMhbZ524
>>981
オブジェクト指向でブログラムを書くことと
ライブラリを使うことは全く別の話
4つの組み合わせ全てが可能
983デフォルトの名無しさん
垢版 |
2026/08/26(水) 14:31:13.76ID:5Osq5JzV
>>982
ライブラリをまともに書きたことがない低脳プログラマーがなんか言ってるわ
違う理由は?
2026/08/26(水) 14:35:38.30ID:eQHg//XX
C言語でもオブジェクト指向プログラミングできるよ
逆も然り
2026/08/26(水) 14:36:13.95ID:+7JqDwP8
>>969
それだと、たまたま同じ型の関数が間違ってラップされることも防ぐ義務もあることになるよね?
でそれを実現しちゃうと使う側は新たにラップした型を作れないから拡張できなくなる

今回のようなケースでそんなことする義務とか意味とかあるのかな?
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

あれあれ〜〜〜??? まだ書けないんですか〜〜〜???
手続き型ってそんなに時間がかかるんですか〜〜〜??? お〜ん?
2026/08/26(水) 15:02:16.92ID:+7JqDwP8
>>986
じゃ、ある関数にコールバック関数を渡した側はその関数が用途に沿ったものだと確信してるからそこは全く問題がないね
間違いやすいものならともかく今回のような例でラップする型を作ってそれぞれラップしていく手間をかけるほどのメリットは全くないな
2026/08/26(水) 15:05:25.17ID:g57AhbG+
横からだけど、>>599は仕様が良く分からんなー
上に書かれている他人のコードは難読だし
2026/08/26(水) 15:11:44.79ID:k59DuRx5
>>989
関数を定義した側と
関数を使う側は別ですからダメです
992デフォルトの名無しさん
垢版 |
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:UKAdFl7a
アンチスレ
https://mevius.5ch.io/test/read.cgi/tech/1787712923/
999デフォルトの名無しさん
垢版 |
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秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。

▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.io/

▼ UPLIFTログインはこちら ▼
https://uplift.5ch.io/login
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況