何故自分が困る書き方を好むのか

アバター
usao
記事: 1887
登録日時: 11年前

何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

立て続けに2つの質問{ これこれ }を見たけど…

なんか,結構な期間このサイトを見てきた感じ,
  • Scene とかいう謎の基底
  • Task とかいう(同上)
  • XXXManager とかいうクソみてぇな名称の何か
みたいな謎の設計の話を割とよく見かけたような気がする.
何故彼らはこれらを好むのだろうか?
もちろん,それで何かが楽になるのであれば良いのだが,楽になってない方々は何なの?っていう.

意味わかんねぇ謎の実装形態を(どこかから持ってきて)採用したら直後に実装作業に行き詰るであろうことは明白であると思うのだが.
マゾなのか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

例えば,Scene とかいうインタフェースクラス(← 何種類の具体的な「シーン」を作るつもりなん? 実際のところ.)

これを持ち出す方々は以下のような様々な事柄でハマる.
  • どうやって「カレントのシーン」を切り替えるの?
  • シーンの具体実装のインスタンスって誰がいつ作るの? それを誰が保持して誰がいつ捨てるの?
  • シーンAからシーンにBに移る際に相応の情報伝達が必要な場合,その情報ってのは最悪AとBの組み合わせ毎に異なり得るかもしれないのだけど,どうするの?
  • 「シーンA型」は「シーンB型」を知るべきなの?
  • そもそもシーンA自身が「この場合は…シーンBにいくべきだ」みたいな話を知るべきなの?(遷移に関する判断の主体は誰なの?)
  • etc...
---

…で,これらすべての事柄の解決方法を相応に頑張って考えて,それを実装した結果得られるものが,
「{ Update(), Draw() }なる2つの仮想関数による処理分岐だけ」とか言い出すw
各「シーン」の実装が
class XXXScene : public Scene { ... };
たることの理由がたったそれだけっていう.

それ,本当に要るん?

アバター
もるも
記事: 54
登録日時: 8年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by もるも » 1年前

大体、見ているゲームプログラミングサンプルが一緒だからなぁ。
サンプル提示側のやりたいことを理解できてないから使いこなせなくて質問しているって感じですね。
(自分も初心者の時は全然理解できなかったからよくわかる、そして他人のサンプルだったりするからディスると危険ですわよw)

まぁ、解説が数年間放置されたまま完結せずにそのままなところもあるので、困ってしまう人もいるでしょう(;'∀')
自分で調べるほうが早いってレベルになると質問しなくなるからなぁ。優しくエスパーになりきって回答してあげましょう(^^)

アバター
usao
記事: 1887
登録日時: 11年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

ディスってないから大丈夫!

問題提起(?)の矛先は,どこぞのサンプルの内容ではなくて,それを読んで「何となく」で持ってきてる行為の側だから.

どこぞのサンプル付き解説を読んでるときに,↑で列挙したような事柄が「?」ってならんのか?っていう.
質問で貼られていたリンク先を見た感じ,私は「?」ってなった.
そしたらそこに書かれてるサンプルを自分のプログラムにそのままの形では持ってこれねぇよな,っていう.

アバター
usao
記事: 1887
登録日時: 11年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

例えば,
Update() と Draw() というたかだか2つの処理に関してのみ処理分岐が実現できればよいのだとしたら,
if やら switch といったような素朴な方法で処理分岐を書いたら何か問題あるん?

…っていうのは,
「私のゲームのシーンの個数は3種類です」とか言う場合と,「概算してもざっと70はありますね」とか言う場合ではきっとそういうところも違うと思うのね.

素朴なやり方だと解決すべき課題が生じるのであって,且つ,その課題を Scene というインタフェースが解決するのであれば,
Scene とそれを取り巻く仕組みを作ることには意味がある.
そうでないならば素朴な実装で済むのではないのか.

Scene だの Task だのいうインタフェースを実装(C++だと継承)するがために,情報の受け渡し方法に難が生じたりとか,
役割が謎な XXXManager みたいなの「ありき」で実装が始まっているのは,なんつーか,順序が違うと思うのですわよ?

アバター
もるも
記事: 54
登録日時: 8年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by もるも » 1年前

行き着くサンプルが親鳥みたいなもんだからなぁ。
ゲームを作る夢を抱えながら、これが設計の様式美かぁ!ってなりながらこねくり回すわけで、
それをかみ砕いて吸収できるかどうかは本人次第だし、他人がいちいち否定してたらお互い疲れちゃうだけですわ。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

Scene について考えてみる必要がありそうですわね.
「シーン」という概念をクラスで書くのですわね?
その主目的は「そのシーンでしか使わない物をそいつに突っ込む」ことと思えますわ.

CODE:

//このようになりますかしら?
//「タイトル」と「ゲームプレイ中」という2つのシーンですわよ
class TitleScene { タイトルシーン固有の何か };
class GameScene { ゲームシーン固有の何か };
これらを使う側はこのようにされてはいかが?

CODE:

//このようにインスタンスを保有しているとして
TitleScene m_TitleScene;
GameScene m_GameScene;

//処理を実施する箇所ですわ
if( カレントのシーンがタイトル )
{  m_TitleScene.Exec( XXX );  }
else
{  m_GameScene.UpdateGame( YYY, ZZZ );  }
※ここではあえて,呼び出すメソッドの名前や引数の個数が異なる形にしていましてよ?

あとは,「カレントのシーン」を変更できればよろしいのですわね?
TitleScene と GameScene は,それぞれ独自の方法で,このifを書いている側との間で「タイトルシーンに戻りたいのですわ」とか「APPを終了するべき時がきたのですわよ」とか意思疎通なさればどうかしら?
最後に編集したユーザー usao on 2022年7月28日(木) 13:16 [ 編集 1 回目 ]

アバター
usao
記事: 1887
登録日時: 11年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

あら,でもちょっと待ってくださらない?

> 「タイトルシーンに戻りたいのですわ」

というやりとりの形には疑問がありますわね…?

GameScene がこれを言い出すのはどうなのでしょう?
自身がたまたま「シーン」という概念を実装しているからといって,外の世界までも全てそうなっていると考えるのは「おこがましいとは思わんかね?」という感じですわ.
わたくし,そういうの許せない性質(たち)ですの.

「ゲームをリセットしたいですわ」「ゲームがクリアされたのですわ」「ゲームオーバー条件を満たしてしまいましてよ」
といった形で情報伝達するべきではありませんの?
そもそも「ゲームプレイ」を実装しているだけの下賤の者に【「リセット」とは「タイトルシーン」に遷移することである】といった事柄を決める権限はありませんの.分をわきまえなさい!

TitleScene,あなたも同様ですわよ.
「さいしょからゲームを始めたい」「続きからゲームを始めたい」といった形で物申すようになさいませ!

それで何が起きるのかはあなた方の知るところではありませんわ.
そういうのはもっと外側(この例ではifでの分岐を実装している側ですわね)の領分なのですもの.

(この文体,とても疲れるのですが)
最後に編集したユーザー usao on 2022年7月28日(木) 12:38 [ 編集 1 回目 ]

アバター
usao
記事: 1887
登録日時: 11年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

CODE:

if( カレントのシーンがタイトル )
{  m_TitleScene.Exec( XXX );  }
else
{  m_GameScene.UpdateGame( YYY, ZZZ );  }
↑ここがナンセンスだとお思いなのでしょう? ええ,わかりますわよ.
引数もメソッド名も実際上は同じものにできるとおっしゃりたいのでしょう?
そして,こんな形をお考えになるのですわ.

CODE:

//このようなインタフェースクラスを用意して…
class Scene
{//話に不要な部分は省略しますわ
  virtual void Update( 全てのシーンで共通な引数 ) = 0;
};
//こんな形に継承して…
class TitleScene : public Scene { ... };
class GameScene : public Scene { ... };

//カレントのシーンのインスタンスを指し示すポインタでも用意して…
Scene *m_pCurrentScene;

//処理をこう書きたい,とおっしゃりたいのでしょう?
m_pCurrentScene->Update( 全てのシーンで共通な引数 );
最後に編集したユーザー usao on 2022年7月28日(木) 13:19 [ 編集 1 回目 ]

アバター
usao
記事: 1887
登録日時: 11年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

インタフェースが規定するメソッドを呼ぶ部分のコード(最後の行ですわよ)が共通化されましたわ.
これをメリットとお考えですのね?

でも,逆に言えば,「インタフェースが規定していない処理をここには書けなくなった」ということでもあるのですわよ?
そこは大丈夫ですの?

TitleSceneは「続きからゲームを始めたい」と言う必要があり,
GameSceneは「ゲームがクリアされたのですわ」と言う必要がある,
…という異なる振る舞いをどう実装なされるのかしら?

もちろんその方法を考えることは可能ですわ.
でもそれは「そのための機構を新たに考えねばならなくなった&実装せねばならなくなった」とも言えますわ.
明らかに手間が増えましたわね.
そこまでしてたった2種類の「シーン」をifで使い分けるたかだか数行の実装を「共通化」したメリットとは何ですの?
何かが楽になりまして?
最後に編集したユーザー usao on 2022年7月28日(木) 13:15 [ 編集 2 回目 ]

アバター
usao
記事: 1887
登録日時: 11年前

Re: 何故自分が困る書き方を好むのか

投稿記事 by usao » 1年前

「Scene インタフェースのおかげでこんなに良いことが!」

と,

「規定された枠組みの中で(今現在,そして今後も)必要な機能を実装せねばならないという制約」

とを天秤にかけて考えるべきときが来たということですわ.
  • 必要なシーンの種類が今現在わからない.今後どんどん増えるかもしれない.
  • あるいは,必要なシーンの種類の個数が相応に多いということが既知である.
  • シーンごとに分岐するような実装箇所が各所にたくさんある.
  • Scene というインタフェース枠組みでやっていけそうである.
…という場合にはインタフェースを使っていくべき,と思いますの.
大切なのは「天秤にかけて考える」ことだと思うのですわ.

最初にリンクを示した2つの質問でいえば,
一方は「そんなこと言っても,これはどーするんだよ」という疑問点に関する質問ですわね.
ちゃんと考えているのですわ.
でももう一方は,わたくしには,どこかのサンプルの形を「考えずにそのまま」もってきているように見えてなりませんの.
(そしてその持ってきた枠組みの制約に捉われて,やりたいことをやれなくなってしまっているのですわ.)