探検


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

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2026/08/13(木) 14:38:03.02ID:pdAcKRXu
前スレ
オブジェクト指向はオワコン?
https://mevius.5ch.io/test/read.cgi/tech/1721393540/
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
ヒー、よくこんな糞コードを人前に晒せるな
笑いをとるネタでやってるなら役者だわ
■ このスレッドは過去ログ倉庫に格納されています

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