くじけない心

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

くじけない心

投稿記事 by へろりくしょん » 14年前

何か面白そうな話があると、噂話でもプログラムでもまずソースを求めてしまうのは、私が疑り深いせいでしょうか。 嫌な人間です。

そんな訳でソースコードが付いてるとつい読んでしまうのですが、時折異様に長い関数を見かけます。

サンプル的なコードを main() 関数に詰め込んでしまう。 というのはまだ分かるのですが。。。


少し乱暴な言い方ですが、関数は道具である。 というのが関数の本質だと思っていますので、あまりなんでもかんでも詰め込んでしまうというのはいささかどうかと思う訳です。

それに、いったいどうやってテストしているのでしょうか。
テストすべきケースがとんでもない量になるような気がするのですが。

私の場合、長くても50行程度(大体1画面に収まり切れる長さ)をリミットとしています。
と、思って私の書いたコードをさらってみると200行オーバーの関数が何個か見つかりました。 ごめんなさい。

ウィンドウプロシージャの中で #ifdef なんてやってるとどうしても長くなりがちなんですよね。。。

100歩譲って縦に長いならまだしも横に長いってどういう事ですか。
縦に横にスクロールして大忙しです。
どうやってコードを追うのですか? 類い希なる記憶力で全てのコードを記憶しているのでしょうか。
とてもストレスがたまりそうです。

このあたり何かポリシーをお持ちの方はいらっしゃるのでしょうか。 とても興味があります。

私はバカなので、プログラムは関数をレゴブロックみたいに積み上げた物としかイメージ出来ません。
java や C++ も、クラスを積み上げた物というイメージです。

こういったパンドラの箱関数を書き上げるのに必要な物はただひたすらに気合いなのでしょうか。 私には、とても無理そうです。

アバター
山崎
記事: 2
登録日時: 14年前

Re: くじけない心

投稿記事 by 山崎 » 14年前

何か嫌なことでもあったのでしょうかな?

色んな場所で「関数は長くてはいけない」という主張を目にします。どうやら、同じ考えをお持ちのようですね。

私は、どうも「関数を長くしてはいけない」理由が理解できていません。もしよろしければ、説明していただけませんでしょうか。

アバター
バグ
記事: 130
登録日時: 14年前

Re: くじけない心

投稿記事 by バグ » 14年前

長い関数は後で修正や改造する際に分かりづらいからでしょう。仕事で『他人の書いた1000行オーバーの関数』を見かけて、それを修正しないといけないときは、本気で気分が落ち込みました(苦笑)

私もへろりさんと同じですね。クラスというパーツをくみ上げていき、1つの道具とするというイメージですね。ですから、1つ1つのパーツとしての機能はできるだけシンプルにしておくことを心がけています。

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

Re: くじけない心

投稿記事 by ISLe » 14年前

分かりやすい変数名を求めたら長くなってしまって折り返さずに書いたら存外横に長くなることがありますね。
おおむかしに書いたソースを見ると画面の左端っこにチマチマと書かれていて逆に読みにくかったので、それに気付いてからは基本的に画面幅を気にしないようにしてます。
企業内ルールとかの縛りがなければキリがないです。

縦に長い関数は1000行越えも少なくないです。特定のハードウェアのシミュレータとかエミュレータのコードですけどハードウェアに近いことをやるとどうしても分離できないことが多いですね。
ソースファイルにいっさい手を入れる必要がなくて関数を呼び出すだけで使い回せるんですけど別の移植担当者がコードを見て匙を投げたことがありましたね。

yuki
記事: 5
登録日時: 14年前

Re: くじけない心

投稿記事 by yuki » 14年前

私は長い関数に反対はしません。
ただし、それ以上分割する意味が無い場合に限ってです。
長くなる関数はどうしても長くなりますし、正直ヘッダか仕様書に関数の役割なんかを書いて頂ければソースを見る必要も無いですから。
ただ、分割したり短くする余地のある関数をそのままにするのはあまりにも怠惰だと思います。

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

Re: くじけない心

投稿記事 by へろりくしょん » 14年前

>山崎さん

>私は、どうも「関数を長くしてはいけない」理由が理解できていません。もしよろしければ、説明していただけませんでしょうか。
.

長くしてはいけないとは言いませんよ。 ただ何でもかんでも詰め込むのはよろしくないと言うことです。
つまり、十徳ナイフのような万能な関数は必要ありません。

ルールでは無く、心がけの問題ですね。
私も長い関数を書くこともありますし。

関数はあくまでも道具であるべきです。
その道具はただ一つの事が出来ればそれでいいのです。

1関数1機能を心がける事で、バグの特定も比較的容易になります。
さらに、1画面に収まっていると見やすくていいですね。

大体ごちゃっと詰め込んだ関数って、カバレッジ何%ぐらいで良しとしてるのでしょうか。
ちょっと気になります。


>バグさん
>長い関数は後で修正や改造する際に分かりづらいからでしょう。仕事で『他人の書いた1000行オーバーの関数』を見かけて、それを修正しないといけないときは、本気で気分が落ち込みました

そうなんですよね。 前の職場にすごく長い関数を書く人がいて、1つ関数でバッファの確保・バッファの初期化・データ入力・実処理・エラーチェックと、全部を行う人がいて、どうして切り分けないのかと聞いたら、別関数に切り分けても、どうせその関数からしか呼ばれないから無駄だと思うですって。
ちょっとかわいそうになりました。 自分が。


>ISLeさん

>分かりやすい変数名を求めたら長くなってしまって折り返さずに書いたら存外横に長くなることがありますね。

そうですね。 ネストした構造体の深いメンバを見る時などもちょっと大変です。
私は変数名は静的な変数で長くても15文字以内、自動変数やメンバ変数で8文字以内だと思ってます。
関数名は多少長くても気にしません。 WindowsAPI て長いの多いですよね。 CreateCompatibleBitmap() とか。 最近ではむしろこれが普通になってしまってます。

>おおむかしに書いたソースを見ると画面の左端っこにチマチマと書かれていて逆に読みにくかったので、

K&Rなんかそんな感じですよね。
私は横は150文字ぐらいまでならと思ってます。


>yuki さん
>長くなる関数はどうしても長くなりますし、正直ヘッダか仕様書に関数の役割なんかを書いて頂ければソースを見る必要も無いですから。

えっと、これはただ利用するだけだから、実装などは気にしないと言う意味でしょうか。

それとも、ホワイトボックステストの類は行わないという意味でしょうか。。。

アバター
山崎
記事: 2
登録日時: 14年前

Re: くじけない心

投稿記事 by 山崎 » 14年前

へろりさん、そして御意見を下さった皆様、ありがとうございます!

「十徳ナイフのような万能関数ではいけない」という言葉、妙にしっくり来ました。私もこれからそのお言葉を胸に留めておこうと思います。1関数に1昨日、という意味なのですね。いやぁ、いきなりお邪魔した私の疑問にお付き合いしていただいて本当にありがとうございました。

yuki
記事: 5
登録日時: 14年前

Re: くじけない心

投稿記事 by yuki » 14年前

すみません言葉足らずでした。
利用するだけならば極端な話ソースを見なくても、という意味です。
というか、完全に利用者側の意見ですね。すみません…

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

Re: くじけない心

投稿記事 by ISLe » 14年前

> 1つ関数でバッファの確保・バッファの初期化・データ入力・実処理・エラーチェックと
ホワイトボックステストがあって単体テストはしないのですか?

ゲーム開発だとホワイトボックステストはどこもやってないと思います。少なくともわたしが関わったことのある会社ではどこもやってませんでした。