ページ 11

SLG ソースコードの長さ

Posted: 2011年12月19日(月) 02:01
by コレジャナイ
件名通りです(ここでのSLGはFFタクティクスのようなものだと思ってください)

以前の質問のご回答を参考に大幅な書き直しをするに当たって、気になったので質問致しました。

SLGでの一般的なソースコードの長さはどれくらいなのでしょうか?
といってもあまりに漠然過ぎるので、ステージは一つ、敵のAIは無し(プレーヤー対プレーヤー)という形に限定します。
(これでもまだエフェクトに凝れば・・・などありそうですが。。)

AIに関しては自分自身今年の中頃からC言語を初めて学習した身であり、一先ずプレーヤー対プレーヤーが実装出来れば満足かなと思っているため実装は先送りにしようかと思っています。
(AIは後から付け足す事も出来ると思いますので、一通りゲームとして形にしてからじっくり練っていこうと思います)



それで現在 マップ表示 マップスクロール マウス入力関連実装 移動範囲表示 移動 段差(高度1まで実装) 移動後メニューの表示 待機の実装 それに伴うターン(時間設定)の実装 攻撃の実装中
という段階で既にヘッダー、ソースファイル合わせて2700行も使ってしまっている事に気付きました。

何も考えずだたひたすらに書いていったらこうなってしまっていた、という状態で素人故こんなに行数の多いプログラムは初めてです。(かなり弱いAI付きオセロでさえ500~700行?ほどでした。)

単純に行数が多ければ立派なプログラムだ という訳では決してないことを重々承知しておりますが、上記の内容を実装した段階で一般的にどれほど行数が必要になるものでしょうか?

やはり全体を見直し行数削減に努めるべきなのでしょうか・・・。

Re: SLG ソースコードの長さ

Posted: 2011年12月19日(月) 08:53
by beatle
プログラムに慣れてくると2700行って言われてもあまり驚かなくなりますね。
全体の行数を減らそうとするよりも、一度にいじるソースコードの範囲を狭めるという方針のほうがいいのではと思います。
要するに、「きちんとモジュール化せよ(部品に分割せよ)」ということです。

関数で言えば、一つの関数は一つの仕事をするように心がけることです。「関数hogeは〇〇をする」と一言で言えるようになればいいんじゃないでしょうか。クラスでも同様です。
いわゆる「分割統治法」というやつですね。大きな問題は分割して統治せよ。
きちんとモジュール化してあれば、機能Aを実装するときには関連する関数だけに注目すればいいですから、一度に考える必要がある行数が減ります。機能Aに関連するコードが各地に分散していると、一度に考えるべき行数が大幅に増えてしまいます。

ある程度の指針として、不吉な匂いというものがありますから参考になさってはいかがでしょうか。

Re: SLG ソースコードの長さ

Posted: 2011年12月19日(月) 10:10
by softya(ソフト屋)
今までの経験からプロ・レベルの完成度なら5万から10万行ぐらいはいくんじゃないでしょうか。つまり、どれだけ簡単にしても1万行は軽くオーバーする気がします。私の書いた簡単RPGの講座のコードでも8000行をオーバーしてますからね。
このソースコードの長さがSLG/RPG系でプログラミング初心者を挫折させる大きな原因となると私は思っています。

テクニック的には、beatleさんの言われる通りなんですがこれがうまく出来ないから初心者ってのも有るわけです。少し作っては再構築(リファクタリング )を繰り返して学んでいくしか無いと私は思いますよ。
「リファクタリング (プログラミング) - Wikipedia」
http://ja.wikipedia.org/wiki/%E3%83%AA% ... %E3%82%B0)

過去の話題。
「【雑談?】リファクタリングのコツは? • C言語交流フォーラム ~ mixC++ ~」
http://183.181.50.211/forum/viewtopic.p ... 19&p=75563


ついでに、参考になるもの。リファクタリング とは関係ないですが。
「プログラミングの禁じ手Web版 C言語編(InternetArchiveよりサルベージ) - Akio’s Log」
http://d.hatena.ne.jp/elwoodblues/20090206/1233878763

Re: SLG ソースコードの長さ

Posted: 2011年12月19日(月) 17:44
by ISLe
SLGはauケータイ向けのBREWアプリ(移植でしたけど)しか作ったことが無いですけど15000行ほどですね。
フレームワーク含まないアプリ固有のソースだけで。
全部入れたら3万行近くにはなるでしょうか。
こちらは平面マップで比較的単純なAIなのでその分削ってもたいして変わらないです。

だらだら書いたら余裕で倍以上になると思うのでリファクタリング頑張ってください。

Re: SLG ソースコードの長さ

Posted: 2011年12月20日(火) 03:35
by コレジャナイ
>>beatleさん
確認した所一番行数の掛かっている関数はマウスのインプットに関する関数でした。
ゲームの状況に応じて、キャラ選択、メニュー選択・・・などSwitchで場合分けしているので見易いといえば見易いのですが、どこぞの書籍で一つの関数は30~50行が目安だと書いてありました。
100行越えているものは分割するか見直せと。
今後も攻撃などの場合分けでこの関数は伸びていく事が予想されるのですが、こういったものも関数を分割した方が宜しいものでしょうか?

一つづつサイトを見ながら確認、返信しているため返信コメが複数になってしまうことをお許し下さい。

Re: SLG ソースコードの長さ

Posted: 2011年12月20日(火) 03:43
by コレジャナイ
>>ソフト屋さん
多分今自分が使える知識と技術では関数の簡略化は難しそうです・・・。
取り敢えず変数名を働きを示す英単語に置き換える事から始めてみます(大体もうそうなっているのですが、所々日本語が・・・。)
これでしたら今でも確実にこなせそうですので頑張ってみます。

Re: SLG ソースコードの長さ

Posted: 2011年12月20日(火) 03:48
by コレジャナイ
>>ISLeさん
完成後にリファクタリングする事も可能ですよね?
勿論現在進行形でリファクタリングしていければそれが一番だとは思いますが、完全独学のため関数スリム化の上手い方法など全く知らず・・・。
書店でそういった類の書籍を幾つか見つけたので、リファクタリングするぞと決めてから書籍を購入し、一気にやっていきたいなとは思っております。

Re: SLG ソースコードの長さ

Posted: 2011年12月20日(火) 07:25
by beatle
コレジャナイ さんが書きました:確認した所一番行数の掛かっている関数はマウスのインプットに関する関数でした。
ゲームの状況に応じて、キャラ選択、メニュー選択・・・などSwitchで場合分けしているので見易いといえば見易いのですが、どこぞの書籍で一つの関数は30~50行が目安だと書いてありました。
100行越えているものは分割するか見直せと。
今後も攻撃などの場合分けでこの関数は伸びていく事が予想されるのですが、こういったものも関数を分割した方が宜しいものでしょうか?
具体的にどう分割したらいいのか分からないけど分割はしたい、っていうときは、この掲示板にでも書きこめば誰か答えてくれると思います。
「ゲームの状況に応じて」とありますが、ゲームの状況がN種類に分割できるなら、N種類それぞれに対応する関数に分割すればいいのではないでしょうか。

Re: SLG ソースコードの長さ

Posted: 2011年12月20日(火) 11:49
by softya(ソフト屋)
後回しにすると破綻すると思います。リファクタリングの過程で動かないプログラムになる可能性が高いです。
まぁ、その前に整理できていないと巨大化したプログラムで身動きができなくなって完成できなくなる可能性が高いのですが。

別のトピックにも書きましたが、このあたりを勉強されては?
「構造化プログラミング」
http://www2.cc.niigata-u.ac.jp/~takeuch ... cture.html
「Cプログラミング診断室」 悪い例を学んでみましょう。
http://www.pro.or.jp/~fuji/mybooks/cdia ... tml#mokuji
「CERT C Secure Coding Standard 日本語版」
http://www.jpcert.or.jp/sc-rules/
「C言語のよくある間違い」
http://www.ncos.co.jp/products/cgi-bin/errorcall.cgi
「書籍案内:C言語 デバッグ完全解説|gihyo.jp … 技術評論社」
http://gihyo.jp/book/2008/978-4-7741-3362-1
「目から鱗が落ちるように分かるプログラミング講座 モジュール化の概念 エスエムジー株式会社 SMG」
http://www.smg.co.jp/~toyo/Program/index18.html

Re: SLG ソースコードの長さ

Posted: 2011年12月20日(火) 18:54
by ISLe
よほど意思が固くなければ、完成したらもう触りたくなくなると思いますけど。
リファクタリングを楽しいと思えるなら既に取り掛かっていておかしくないですし。

締め切りに追われているならともかく、やろうと思ったときがやるときですよ。

キャラ選択にしてもメニュー選択にしても、選択される側が自分が選択されているかどうかを判断すると良いです。
そうすれば入力関数の中で状況に応じての場合分けなんてする必要なくなります。

Re: SLG ソースコードの長さ

Posted: 2011年12月20日(火) 23:48
by Dixq (管理人)
コードがどうなって多くなっているかによると思います。
非効率なプログラムが延々と書かれて長くなっているなら改善すべきですし、
適切に分割すべきところで分割し、結果的にコードが多くなっているなら良い事だと思います。
ただゲームを作っててコードが数千行行くことなんて普通だと思いますよ。

Re: SLG ソースコードの長さ

Posted: 2011年12月21日(水) 03:50
by コレジャナイ
皆様御回答有難う御座いますm(_ _)m
関数分割の大切さとリファクタリングの重要性がある程度把握出来ました。
なるべく一つの関数を60行前後に留める癖を付けていきたいと思います。

また何か問題が発生した場合はこちらで質問させて頂きますm(_ _)m

Re: SLG ソースコードの長さ

Posted: 2011年12月21日(水) 08:57
by softya(ソフト屋)
コレジャナイ さんが書きました:皆様御回答有難う御座いますm(_ _)m
関数分割の大切さとリファクタリングの重要性がある程度把握出来ました。
なるべく一つの関数を60行前後に留める癖を付けていきたいと思います。

また何か問題が発生した場合はこちらで質問させて頂きますm(_ _)m
60行前後でも十分長いですよ。理想は一画面に収まる40行前後を基準にしてもらった方が良いでしょう。
40行をオーバーする関数が出るのは仕方ないですが、多くの関数は40行未満である事を心がけるべきです。