• ベストアンサー

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

phpで、使いまわす可能性が高いコードを関数化しようか 迷っているんですが、関数化するとソースがどんどんカオス化していき 後から見て、ちゃんと管理ができるのかなあと不安になります。 他の人からみても分かるかどうかというのも問題です。 プログラムで、こういうソースコードを関数化したほうがいい 逆に、こういうコードは、直書きしたほうがいいというのがあれば アドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nayuneko
  • ベストアンサー率57% (28/49)
回答No.1

フィーリングプログラマなので、「必ずこうする!」 という定石はないのですが、参考程度にでも。 1. 使用頻度の高いロジックを関数化 これは定番じゃないでしょうか。 2. 保守性の観点から見てわかりづらいものを関数化 ひとつの関数内にだらだらとロジックを書き連ねるのは保守の観点から見るとすごく見づらくなると思います。 なので、"ひとつの機能"を関数化して独立させてあげます。 もしその機能が、他のコードでも使いまわせるようならば、共通関数化してどのコードからも参照できるようにしちゃいますね~。 # どのコードからも使えるように汎用性を持たせるのが難しいですが… 3. ある程度の機能をファイルに分けて管理 関数化、というわけではないのですが、ある程度機能の方向性を分割して、ファイルごとに関数を管理しています。 たとえば、 hogehoge1.php  function hoge_read() {}  function hoge_write() {}  hoge_func()  {   hoge_read();   hoge_write();  } と記述するのではなく、 hogehoge1.php  include_once('read.php');  include_once('write.php');  hoge_func()  {   hoge_read();   hoge_write();  } read.php  hoge_read(); write.php  hoge_write(); のようにファイル分割して関数を管理するとカオス化するのを最小限に抑えられます。 こんなもんでしょうかねぇ…

yuzuru0024
質問者

お礼

回答ありがとうございます。 大変参考になります。 いかに、機能ごとに分割できるかというのがミソですね。 このあたりのアーキテクチャはオブジェクト指向の思想と 共通してるものがありますね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • gon987
  • ベストアンサー率16% (53/313)
回答No.5

自分の場合は最近はクラス化しますね。 である程度似たような機能やある程度まとまった処理のメソッド(関数)を グループとしてひとつのクラスにしておきますね。 (データベース関連/日付計算/ログイン(セッションやクッキー)処理など機能ごとにひとまとめとして) でそのまとまりでひとつの別ファイルをつくりまったく別のプログラムでも再利用しやすいようにしていますね。 ついでに >関数化するとソースがどんどんカオス化していき しっかりコメント書いている? 最低限 関数名・機能説明・引数の値の意味・戻り値の意味など書かないとだめですね。

yuzuru0024
質問者

お礼

回答ありがとうございます。 >しっかりコメント書いている? いままで、あまる書いてませんでした! コメントって相当重要ですね。

全文を見る
すると、全ての回答が全文表示されます。
noname#58606
noname#58606
回答No.4

PHPでは、ある程度なんでも出来るけど、あまりロジックやアルゴリズムは自信が、猛烈にないのですが。^^; 関数ってほーっておくと、訳が分からなくなりますよ。w 私も、分からなくなった口です。 ◆関数はシンプルに、こまめに分ける。 ◆関数名を分かりやすく。 ◆関数の説明は分かりやすく。 すると、ある程度見通しがよくなりますよ。 あとは、グループで開発する場合は、ローカルルールを把握するのが、ポイントです。 それと、一つスクリプトを作った後、紙にプリントアウトして見直すと、「あー、ここは変だ。」ってのが、分かりますよ。 それを元に、もう一度同じスクリプトを作ると、ちょっとだけ効率的なスクリプトが、出来ます。 それの繰り返しが、上達のコツだと、思いますよ。 あとは、感謝と根性ですかねー。w

yuzuru0024
質問者

お礼

回答ありがとうございます。 >関数の説明は分かりやすく。 関数に必ず 処理内容の説明 引数の説明 を入れたら大変分かりやすくなりました。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

よほどのことがないかぎり直書きしたほうがいいソースなんてないでしょ。 (もちろんハローワールドくらいはじかに書いてもいいですけど) まずはメインルーチンをつくって最低限のフローをブロック化するだけの 関数をかいておき各関数の中から、単機能ごとに必要な関数をつくって してしまえばよいでしょう。 実際にはほとんどクラスで管理することになるでしょうから。 メインさえすっきりさせておけば、ソースは追っかけやすくなります。 再利用性の高いソースは、commonクラスなど汎用クラスをつくっておいて どんどん放り込んでやれば、実際に利用するときにはincludeするだけなので 個別のプログラムでカオス化することはすくないとおもいます。

yuzuru0024
質問者

お礼

回答ありがとうございます。 まさしく、そのような設計がオブジェクト指向なんでしょうか。 ライブラリや、サンプルソースを見ると みやすいソースって確かにメインがすっきりしてますね。 commonクラスというか、commonファイル的なファイルを実際に作って見たところ 大変管理しやすくなりました。 とりあえずは、機種依存文字を置換する処理なんですが 何も考えなくても、そのファイルさえ呼び出しておけば 機種依存文字が使われないことが保障されるので大変扱いやすいです。 追加する時も本当に簡単ですし・・・。 大変参考になりました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • 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
このQ&Aのポイント
  • 購入したPCのセットアップ時に、キーボードからの文字入力ができない問題が発生しています。解決方法を教えてください。
  • NEC 121wareを使用しているパソコンのセットアップ時に、キーボードからの入力ができません。対処法を教えてください。
  • PCのセットアップ時において、キーボードからの文字入力が全くできない問題が発生しました。解決方法を教えてください。
回答を見る

専門家に質問してみよう