R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

今時の C 言語な質問

どう書くべきかで悩んでいるので、

C 言語の有識者の方

教えてください。


struct _operation {
  int  id;
  void (*execute)();
};

struct log {
  int  employeeId;
  operation* logic; // ログイン時に選択することでセットされる
}


で、かなり端折ってますが、以下のような動きをする訳です。


void main() {
  struct log* l = login();
  l->logic->execute(); // ログイン時に選択された処理が動く
  何やら共通性の高い処理です
  logout(l);
}


で、こう書くと、operation の execute 内で、log の employeeId や logic の id を知るためには、以下のようにするしかないような気がする訳です。


l->logic->execute(l);


結局、無駄な抵抗をせずに、以下のように書く方が良いのでしょうか?


struct log {
  int  employeeId;
  int logicId;
}

void main() {
  struct log* l = login();
  switch (logicId) {
    case 0: Hoge1Logic(l);
    case 1: Hoge2Logic(l);
    case 2: Hoge3Logic(l);
    default: ShowError();
  }
  logout(l);
}


関数ポインタで配列使うとか、その辺のテクニックはあると思うのですが、あくまでもデザパタ的な要素を含んだオブ脳を意識して書いて上記のように壁にぶち当たりながら先に進むべきか、C 言語なんだから素直に構造化プログラミングに徹するべきなのかで悩んでいます。

いろいろな概念を知ってしまうと、素直に書くのが辛くなってくるという言うことで、こんな質問をさせていただきました。

投稿日時 : 2008年12月24日 10:14

Feedback

# re: 今時の C 言語な質問 2008/12/24 10:28 επιστημη

んー、
void log_execute(struct log* l);
を宣言しといて(他に引数があるなら適宜追加):

struct log* l = login();
log_execute(l);

ですかねぇ。
OOぽく動かすため、第一引数をメッセージ・レシーバ(this)として用います。

# re: 今時の C 言語な質問 2008/12/24 10:37 επιστημη

そーいや↓こんなの書いたなり。
http://codezine.jp/article/detail/885

# re: 今時の C 言語な質問 2008/12/24 10:45 まっきゅ

個人的には,どちらでも良いってのが結論なんですが…。
読む人が居るプログラムであれば,「読める」ように書いてあげるのが良いのではないでしょうか?
関数のポインタだけで嫌悪反応な人も結構多いはずです :)
C言語に限らず。

# re: 今時の C 言語な質問 2008/12/24 11:04 TMK

(*execute)にemployeeIdが必要なら、引数として与えるのが
素直だと思いますが、どうでしょ

struct _operation {
  int id;
  void (*execute)(int);
};

struct log {
  int employeeId;
  operation* logic;
};

--------------------------------------------------------------------------
使うとき
  l->logic->execute(log->employeeId);

もう1点、(*execute)内でlogicのidを知る、というのは
関数がすべきこととは違う気がする
概念的には、x番のoperationはxxxをやる、z番のoperationはzzzをやる...
という考えなんですよね。たぶん。
_operation{
  int id;
  void (*execute)(int);
};
この構造体↑に対して、こんな、いわばmapがあるのと違いますか?↓
_operation operations[] ={
  {0, logicA},
  {1, logicB},
  {2, logicC},
};

# re: 今時の C 言語な質問 2008/12/24 11:27 もり ひろゆき

正直、郷に入り手は郷に従えという感じがしないでもないです。

やはりコンパイラやIDEなどに補助の仕組みがないままOO的なアプローチを進めるのは少々やっかいなことになりそうな気がします。

ここはひとつ、可読性を落とすことにもなりそうなので適切な構造化プログラミングを進めるのが吉ではないかなあということで、素直に後者ではないかなぁと・・・(^^;

# re: 今時の C 言語な質問 2008/12/24 13:21 p

TPOです

# re: 今時の C 言語な質問 2008/12/26 9:15 R・田中一郎

επιστημη さん

>struct log* l = login();
>log_execute(l);
>
>ですかねぇ。

やっぱり、そんな感じで使うのが良さそうですね。

>そーいや↓こんなの書いたなり。

もちろんですが、既に読んでますよぉ~

------------------------------
まっきゅ さん

>関数のポインタだけで嫌悪反応な人も結構多いはずです :)

あ~、僕がそうですw
結局 C には C なりの読みやすさがあるのかもしれませんね。

------------------------------
TMK さん

>(*execute)にemployeeIdが必要なら、引数として与えるのが
>素直だと思いますが、どうでしょ

ですね~
そういう形にしていこうと思います。

>この構造体↑に対して、こんな、いわばmapがあるのと違いますか?↓

struct Hoge {

Operation* operation;

}

というインターフェイス的なものを実装した訳です。
でも、皆さんのコメントを読んで、既に書き換えました。

------------------------------
もり ひろゆき さん

>正直、郷に入り手は郷に従えという感じがしないでもないです。

あ、やっぱりですか。
誰かに、この言葉を言って欲しかったのです。
助かりました。

------------------------------
p さん

>TPOです

深いです。

# 私のブログを見てください。 2009/07/11 13:01 タカ

http://blog.goo.ne.jp/cadan

# MInQhdAljMtfbfJuZ 2011/12/12 18:53 http://www.birthcontrolremedy.com/birth-control/cl

Gripping! I would like to listen to the experts` views on the subject!!...

# smOlikOpcPOVDyFY 2011/12/16 0:30 http://www.upscalegallery.com/

Thanks for the news! Just was thinking about it! By the way Happy New Year to all of you:D

タイトル
名前
Url
コメント