• ベストアンサー

どういうプログラムを関数化をしたほうがいいのか しないほうがいいのか

hrm_mmmの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

>関数化するとソースがどんどんカオス化 関数を作ったら、スパゲッティソースになるというのは、よっぽど変な作りかたしているとしか思えない。 まずは、メインの流れの中に関数定義は置かないこと。 同じファイル内なら、定義部分はソースの最後でよい。(トップダウン方式ともいう、私はもっぱらこの方が理解し易い) 考え方はいろいろあるので、先に関数定義をざっと並べておいて、最後にメインルーチンという方法もある。(ボトムアップ方式) 関数定義を別ファイルにする方が、メインルーチンでは、requireで読み込んだ後は、組み込み関数と同じ感覚で呼び出しすればいいので、よりすっきりする。 関数名の管理が、ごちゃごちゃする(かち合うと2重定義エラーになるし)というなら、命名規則を自分で作ってそれに沿って名付ける。 変数は、関数内でのみ使う局所変数は、他の関数で使っていてもなんの関係もないので、内部で、解りやすい命名をおこなう。 そのルーチンは一回しか使わなくても、変数の局在化の目的で関数にすることもある。 関数定義の別ファイルが大量に出来て、ファイル群がカオス化すると言う意味なら、ファイル名も命名規則で見分けやすくするとか用途別にディレクトリ分けするとか。 読む方の読みやすさというのは、つまり、数ヵ月後その中身を忘れた頃に自分が読んで直ぐに理解できるかってあたりで判断してもよいかとおもいます。 ということで、私は、コメントは残しておく方です。 例 トップダウン方式 // // main routine $s = start_func(); if( $s ){ $a = syori_1($s); }else{ $a = syori_2($s); } print_body($s,$a); end_func(); // // 以下定義 /* この定義の並べる順番は、phpにとっては、どうでもよいが、読む方にとっては、実行順の方が理解しやすいだろう。 */ function start_func(){ $res = true; $res = header_else($res); // header 関係操作とか いろいろ実行 return $res; } // 関数の内容表題 引数の意味、返値の意味などコメントしておくとよい // 引数($s : startの返値); // return string function syori_1($s){ $res = 'performed'; // いろいろ実行 return $res; } // ...略... // end //

yuzuru0024
質問者

お礼

回答ありがとうございます。 トップダウン方式で書いてみたところ、 関数系プログラムが一番下に固まるので大変見やすくなりました。 直書きから、インクルードに切り替える時も 一番下に固まってるので大変取り出しやすいです。 ファイル名のつけ方も惜しみなく長い名前にしたほうがよさそうですね。 エンコード変換関数とかでsjis to eucを s2e とかする人いますが、 一見なにやら、よくわからないですものね。 ありがとうございました。

関連するQ&A

  • 良いプログラムを書くためには

    今回、プログラミングの上達方法に関してアドバイス頂きたく質問しました。 現在、ソフトウェア開発の仕事に就いていてCやJavaなどでプログラムを書いたりしています。主にCで書くことが多いです。与えられた課題に対して動くプログラムは作れるのですが、先輩などからプログラムが汚いとよく指摘されます。 指摘される事柄は色々ありますが、何点か挙げるとまずモジュール分割が上手く出来ていない。1000行位の動くプログラムを書き始められた頃は、共通の処理などの関数が分割されておらず、同じ処理がやたら多いなど、余計な処理が多くコードに無駄が多いと指摘されました。それを改善したところ、今度は無駄に関数の分割が多くなり、読みにくいなどの指摘を受けました。 その他にも、例えば関数の中で、for(条件式)の条件式を上手く工夫すれば、for()の中で、余計な条件分岐などが減るなどの、細かい記述に関しても指摘を受けます。 質問はプログラムを作成する上で、大きな観点からだと、どのようにすれば綺麗にモジュール化などが出来るのか、モジュール化だけではなく、ソフトウェアの設計全般に関してです。また細かいことで、いえば先ほどのfor()の様に、文法を上手く使いこなすためにはどうすればよいか。本などのサンプルコードでは、forならfor、ifならifの説明など、主に単独の説明が多いように思えます。関数の中で、各文法同士を上手く使いこなし、他人が見ても読みやすいコードなどを書きたいです。 先輩からは、他人のソースコードを見ることなどと言われますが、何か他人のソースコードを見る上でも、上で挙げた指摘を改善するための見方とか、他にも自分でプログラムを作る場合に、こういう事に注意しながら作るといいなど何か改善するアドバイスがあれば宜しくお願いします。また参考になる書籍やサイトなどもあったら教えて頂くと助かります。 長くなりましたが宜しくお願いします。

  • プログラムで関数は使わない方が速くなる?

    大きなプログラムを書く際、プログラムの見通しが良くなり、後から修正しやすくするため、 同じ計算が複数回出る際には関数を多用したものを作成してきました。 ところが、プログラムの計算速度を上げたいと思い、計算時間を比較してみたところ、 関数を使わない方が圧倒的に速くなることが分かりました。 Matlabを使って、 for j = 1:100000 for i = 1:1000 y = i*i * j *j; end end の計算を行った際の計算時間と、ループ内の計算を関数で置き換えた for j = 1:100000 for i = 1:1000 y = zikan_sokutei_function ( i, j ); end end function [ kei ] = zikan_sokutei_function ( i, j ) kei = i * i * j * j; end の計算を行った時間は、 それぞれ、0.5秒と1分7.3秒、という結果になりました。 つまり関数で置き換えたことで、計算時間が実に135倍も増大したということです。 上記と同じプログラムを使ってVBAで比較したところ、 それぞれ、8.29秒と20.70秒、という結果になりました。 つまり関数で置き換えたことで、計算時間が2.5倍も増大したということです。 また、関数を使わない場合には、Matlabが最速で、関数を使う場合にはVBAが最速であるという結果になっています。 これは関数を全く使わない方が、圧倒的に高速に計算を実行できるという結果になっていますが、 こういうものなのでしょうか? 2倍程度なら許容範囲ですが、100倍以上も遅くなるのであれば、 関数は全く使うべきではない、ということになりますが、なぜこれほどまでに時間がかかるのでしょうか? Matlabの方がVBAよりも数値計算に適しているため、VBAよりも実行速度は速くなるべきだと思いますが 関数を使った場合には、これが逆転してしまうという、かなり腑に落ちない結果となりましたが、 こういうものなのでしょうか?

  • Perlコードを、自動的にPHPコードに変換してくれるプログラム!

    Perlコードを、自動的にPHPコードに変換してくれる、そんな「ドラえもん」のようなプログラムがありましたら教えて下さい! もちろん、変換後のコードが完全なPHPコードでなくても、大体、関数とか、変数、その他の定型ルーチンの違いを置き換えてくれる程度のもので結構です。 その他、何か、そういったPerlからPHPへの乗り換え支援ツール見たいなものがあったら教えて下さい。

    • 締切済み
    • PHP
  • fsockopen関数について

    PHPでPOSTを送ろうと思ったのですがfsockopen関数の使い方が分かりません。 以下の例のソースコードを書いてくれませんか? 例 http://www.sample.com/post.phpの$_POST['name']にtestを送る

    • 締切済み
    • PHP
  • PHPの関数の動き方が分かりません。

    PHPの関数の動き方が分かりません。 Wordpressというブログシステムを使っていますが、 問題が発生しております。 (メニューが2重表示される,関数の2重呼び出しはないことを確認しています。) http://okwave.jp/qa/q5988841.html 関数その物、もしくはデータベースの不具合を疑っておりますが、 以下の関数のPHPコードの読み方が分かりません。(プログラム自体は経験あるので、読み方が分かれば障害がどこか、ある程度判別できると思います。) function get_constructor_menu($before = '', $after = '') { global $main; $main->getMenu($before, $after); } ご存じの方教えていただけませんでしょうか?

    • 締切済み
    • CSS
  • OSSemPendという関数とは?

    いま見ているC言語ソースコードに”OSSemPend”という関数があったのですが、ソースコードでどのように使われているかよくわかりません。この関数にはどのような機能があるのかご存じの方いらっしゃいませんでしょうか。

  • CGIプログラム

    以下の問題について教えてください。 お願いします。 PHPに限らず、CGIプログラムで変数の内容を使ったHTMLコードを生成する場合に、単純にHTMLコードを出力しただけでは、正しいHTMLコードにならなかったり、CGIプログラムが動かないことがある。その場合には、どのようにしてその問題を回避するか。

  • exec()で他ディレクトリのexeプログラムを実行したい

    url2bmpという、指定したURLのスクリーンショットを作成できるコマンドライン対応のソフトを使用しています。これをPHPから実行させたく、exec()関数を使っています。PHPプログラムとexeプログラムは同じ階層にあり、コードは exec("url2bmp.exe 以下、引数"); のようにしており、問題なく動作していました。 その後、url2bmp.exeを1階層下のフォルダに移し、コードも修正したのですが、動かなくなってしまいました。コードは以下の通りで exec("kasou/url2bmp.exe 以下、引数"); ディレクトリ指定は間違っていないはずであり、原因は明らかにurl2bmp.exeがPHPプログラムと同じディレクトリにないことなのですが、これの対処法は存在しないのでしょうか?同じコードをコマンドプロンプトで実行するとうまくいくのに、exec()関数では動かないという点に納得がいきません。

    • ベストアンサー
    • PHP
  • Webから得るJAVAプログラム

    わたしの入手した「JAVAプログラング技法」(堀内泰輔訳)に、「逆アセンブラ(javap)は、ソースコードが入手できないコンパイル済みのJavaプログラム(例えば読者がWebから得るJavaプログラム)を、元のソースコードに戻すための手ごろなツールです。」(24頁)と説明されています。WebからJavaプログラム(のバイトコード)を得る方法を教えて戴けないでしょうか。

  • CGIプログラム

    PHPに限らず、CGIプログラムで変数の内容を使ったHTMLコードを生成する場合に、単純にHTMLコードを出力しただけでは、正しいHTMLコードにならなかったり、CGIプログラムが動かないことがある。その場合には、どのようにしてその問題を回避するか。

    • ベストアンサー
    • CGI