関数がうまく作れない

アバター
namachan10777
記事: 32
登録日時: 10年前
住所: 四国
連絡を取る:

関数がうまく作れない

投稿記事 by namachan10777 » 10年前

D言語でDXライブラリを使いプログラミングしているのですが、関数の引数がやたらと長くなってしまうんです・・・
単体テストとか契約プログラミングにも手を出したいとい思ってるので出来るだけ純粋な関数にしたいのですが、状態フラグ、ハンドル・・・と、どんどん増えていって引数がキモイことになってしまうんです。
引数に構造体を使ってみたりしましたが根本的な解決になってない気がします。
関数型プログラミングをしたいので副作用をなくして書きたいのですがうまくいかず・・・

みなさん関数はどのような感じになっているのでしょうか?

Aozora0630
記事: 85
登録日時: 10年前

Re: 関数がうまく作れない

投稿記事 by Aozora0630 » 10年前

先日はチャットで会いましたね。

私が思いついた方法としてはグローバル変数を引数代わりに作って関数を呼び出す前に引数をセットしてから・・・。ということですね・・・。

というか何が問題なのかよく分かりません。
まあ、視覚的には汚いですがね・・・。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前

Re: 関数がうまく作れない

投稿記事 by Hiragi(GKUTH) » 10年前

とりあえず関数っぽい感じでゲーム作ってた時のプロトタイプ宣言置いときますね。

CODE:

void Init(SDL_Surface **scr,SDL_Surface **image,SDL_Rect *m_rect,SDL_Rect *scr_m_rect,SDL_Rect *s_rect,SDL_Rect *scr_s_rect);

int CheckEvent(SDL_Event event); //イベントチェック

bool Draw(SDL_Surface *image,SDL_Rect m_rect,SDL_Rect scr_m_rect,SDL_Surface *scr);

bool Animation(SDL_Rect *m_rect); //アニメーションさせる
void chara_ani(int *ani); //自機のアニメーション

void Move(SDL_Rect *scr_m_rect); //画像の移動

void M_shot();

void DrawText(SDL_Surface *letters_image,SDL_Surface *scr,int x, int y, const char* format, ...);

最近クラスを使うオブジェクト指向なるものを使い始めてからこう言うキモイのは無いかなぁ、オブジェクト自体が情報を持っている場合が多いので
当たり判定とかの時の座標受け渡しぐらいの時ですかねぇ?

関数型であっても、
ここの新・ゲームプログラミングの館にあるゲームプログラミング設計の所を読むと幸せになれるかもしれません。

ISLe
記事: 2650
登録日時: 14年前

Re: 関数がうまく作れない

投稿記事 by ISLe » 10年前

関数型プログラミングは、(格納される)オブジェクトが継続して保持し変化するステートを管理する方法までは提供しません。
必要な処理の呼び出しや処理順による副作用の変化などはすべて呼び出し側への負担となります。
その負担を減らすべく生まれたのがオブジェクト指向プロラグラミングというものです。

ゲームのコンテンツ自体は副作用で動くものなので、副作用で動く部分とそうでない部分は区別すべきと思います。