• ベストアンサー

単なる関数の集まりかオブジェクト化どっちが優れていますか?

Perl5.6でCGIを作成しております。 単なるサブルーチンの集まりの関数と、オブジェクト(packageしたもの )で同じ機能の関数を呼び出した場合に、動作スピードや開発の柔軟性など いろいろ考えた場合に、 require か useのどちらにどのような長所があり優れて、どのような短所があるか 現在理解できていません。 皆様の様々なご意見をお聞かせ下さい。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

まず、requireとuseの違いは、コンパイル時に読み込まれるか実行時に読み込まれるかの違いですので、オブジェクトと単なるサブルーチンというくくりとは違います。 さて、オブジェクト化と関数の集合とどちらが有利かということですので、それぞれの特徴をあげてみます。 【オブジェクト化(OOP)】 ◎オブジェクト指向のメリットを享受できる   →カプセル化   →継承   →多様性 ◎再利用性に優れている   →オブジェクトの利用者が、楽をできることが多い ×コンパイル時のプロトタイプによる型チェックが使えない 【関数の集合体】 ◎速度は速い  (が、ハードの性能が悪くない限りは数%程度しか変わらない) ◎シンプルな機能であれば、関数の方が簡単に実装できる ×引数が増え過ぎることがある ×パッケージ名が無い場合、名前空間の衝突の危険性がある  (特に、mod_perlなど1プロセスで大量のファイルをコンパイルする環境下) 一長一短ですので、あるデータに対する処理の集合(例えば、会員オブジェクトに対する登録・退会・属性取得等)はオブジェクト指向の方がまとまりますし、単なるユーティリティ(単位変換や数式等)は関数で書いた方が楽に書けると思います。

関連するQ&A

  • オブジェクト指向はなぜそんなにいいのですか?

    perlやphpでも昨今オブジェクト指向で書く人が増えてます。 同じ処理を繰り返さなくて済むとよくいいますが、 共通のファイルをrequireしてそこに共通のfunctionを定義するのとどうちがうのでしょうか? perlであったらサブルーチンを定義するのも同様。 そういうことを考えるとオブジェクト指向に乗り換えっていうのができません。 ご助言いただければ幸いです。

    • ベストアンサー
    • PHP
  • サブルーチン Perl みたいに C言語 で使うには 

    いままで数年HPを運営していたためにCGIを開発する手段として、Perl言語を使用してきました。その後、あるきっかけでC言語をするようになり、理屈上PerlとC言語が似ていました。 いままで、Perlでは開発・デバッグ等を効率よくするためサブルーチンを他のファイルにパッケージファイルとして開発していました。非常に便利でこれがC言語でも同じく使えたらいいなとつくづく思っています。 Perl言語の例 main.cgi(本体のファイル) package.pl(パッケージファイル) 本体ほファイルで実行させ、実行の途中必要なサブルーチンをパッケージファイルから呼び出します。 呼び出すには、 %渡す値=&パッケージ名::サブルーチン名; 同じようにC言語でやるときはどのようにすればいいのでしょうか?

  • require後、関数を実行時にサブルーチンが存在すれば実行させたい

    perlでrequire後、関数を実行時にサブルーチンが存在すれば実行させたいのですが、どうやれば調べられるかご存知でしたらご教授願えませんでしょうか。 foreach(...){ require "$file"; &Print;・・・ここでエラーが出てしまうのを関数が存在する場合だけ実行するようにしたいのです。 } 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 自分で定義した関数をすぐに使いたい

    自分で定義した関数を最初から実装されているabs()やsqrt()のように何もせず(呼び出さずに)使用することはできないのでしょうか。 現在,"C://Perl/function/~.pl"といったようにfunctionという名前のフォルダに自分で作成した関数を保存しています。そしてその関数を使うときには, require("C://Perl/function/var.pl") &パッケージ名::サブルーチン名(引数); などとして使用していますが,呼び出す関数が1つ2つなら良いですが統計学に関する関数がないためほとんど自分で定義したものをつかっています。そうすると使用したい関数が多くなるほど,呼び出す手間が多くなってしまうのですが何か良い手段はないものでしょうか(モジュールを作成してもそれほど手間が省けるようにも思えないのですが、、、)。

    • ベストアンサー
    • Perl
  • requireしたライブラリにuseを記入

    メール送信のプログラムを作っています。 本体のプログラムmain.cgiから、 メール送信用のサブルーチンを記入した、 email.plというのを require 'email.pl'; とメール送信が必要な場合だけ読み込んでいます。 この email.plに use Encode; や use Jcode; のようにuse文を記入するのは、 Perlの作法としては適切なのでしょうか。 それともuse文はmain.cgiに記入するのが適切なのでしょうか。 email.plにuse文を記入しても動きますし、 main.cgiにuse文を記入した場合とベンチマークを比べたりしましたが あまり変わらないのですが、 useはコンパイルしたときに実行されるので、 実行のときに読み込まれるrequireしたライブラリに記入していいのか不安なのです。 私としては必要なときだけ読み込みたいので、 email.plにuse文を記入したいのですが。 どうぞよろしくお願いします。

  • cgi-lib.plのReadParse関数

    あるパールからcgi-libを呼び出して、ReadParse関数を使おうとするとInternal Server Errorがでてしまいます。 パールの中身は #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*in); です。 そこで3行目と5行目の行頭に#をつけて飛ばすとパールは正常に動きます。 これってcgi-lib.plのReadParse関数がいけないんでしょうか? ダウンロードしたまま何も変更していないのに..... ちなみにサーバーのパールのバージョンは5.004のようです。

    • ベストアンサー
    • CGI
  • useとrequireでエラー

    初歩的な質問で失礼いたします。 下記の記述でプログラムを実行すると正常にプログラムが動きます。(省略以降は全く同一のプログラムです) ■実行問題なし1 #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; --------省略--------------- ■実行問題なし2 #!/usr/local/bin/perl use strict; use DBI; --------省略--------------- しかし、下記の記述だとエラーが発生していまいます。 #!/usr/local/bin/perl use strict; use DBI; require 'cgi-lib.pl'; require 'jcode.pl'; --------省略--------------- エラーログは、下記の通りです。 Global symbol "$in" requires explicit package name at search.cgi line 21. Global symbol "$parameter" requires explicit package name at search.cgi line 23. Global symbol "$name" requires explicit package name at search.cgi line 23. Execution of search.cgi aborted due to compilation errors. requireとuseは同時に記述してはいけないのでしょうか? 同時に記述しないと目的のプログラムを実現する方法が大きく変わってきてしまうので、非常に困ってしまいます。 もし、ご存知の方がいらっしゃったら教えてください。 宜しくお願い致します。

  • オブジェクト指向Perlの勉強の仕方について

    今までPerlで掲示板などを自作した事があるのですが、オブジェクト指向をまったく取り入れていません。 オブジェクト指向でないPerlプログラミングについてはおおよそ理解しているつもりなのですが、 オブジェクト指向Perlについては全く理解できていません。 書籍を探しても、Perlについての書籍は大抵が初心者向けのものか、私にとっては難解なもの(オライリーなど)ばかりで、ちょうどいい程度の書籍が見当たらないのですが、 何かオススメの書籍がありましたらご紹介ください。 ---参考:私が理解している範囲--- 1.Perlプログラミングの基礎 変数、配列、ハッシュなどのデータ型 ループやサブルーチン、ライブラリなどの構造 2.オブジェクト指向について MacromediaFlashのActionScriptがある程度 理解できていますので、 「オブジェクト指向とは何か」 は多少理解しているつもりでいます。 (錯覚かもしれませんが) 3.目的 PerlMagickなどのパッケージを利用したいのだが、 利用方法がわからないため ------------------ 以上、身勝手な質問で恐縮ですが、 よろしくお願いします。

    • ベストアンサー
    • Perl
  • speedyCGIで動作させるようにする為の、修正について

    お世話になります。 speedyCGIで動作させるようにする為の修正箇所や手順、要点についてお伺い出来ればと思い投稿しております。 現在、speedyCGIにてオプション -r1にて動作中です。 ※-rとは、指定回実行すると、SpeedyCGIプロセスは終了する その為、1回実行すると終了し、の繰り返しなのですが、これですと正常に動作するのですが、結果的に毎回起動させる為、出来れば-r3などにして動作するようにしたいと考えております。 下記に修正を行なった手順を示します。 1.スクリプトの最初部分を変更 #!/usr/bin/perl を下記に変更 #!/usr/bin/speedy -- -M3 -r1 -t300 -b50000 -B50000 BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use strict 'vars'; use warnings; 2.local変数をすべてmy変数に置換 3.スクリプト実行時のエラーログから、 Global symbol "$abc" Global symbol "@abc" Global symbol "%abc" などのGlobal symbol ""以外の部分を取り出し下記 use vars qw //; の中に記述 use vars qw /$abc @abc %abc .../; 4.元のスクリプトに上記を追加 上記の手順でPerlスクリプトを実行時、正常に実行されております。 しかし、オプションの-r1を-r3に変更した場合、リロードを行ないますとそのスクリプトのCopyrightしか表示されず、他のスクリプトの場合によっては何も表示されません。 スクリプト内部の全体的な処理の流れですが、 require"/dir/common.cgi" require"/dir/set-up.cgi" require"/dir/name1.cgi" require"/dir/name2.cgi" require"/dir/name3.cgi" &Form; $Copyright="Copyright"; if($FORM{mode} eq "aaa"){&Test;} のような形で特定の関数へ処理を分岐させてゆくような形式です。 あまり良くわかってないのですが、オブジェクト指向的なというか徹底したモジュール化されているようなスクリプトではない(関数をrequireで毎回呼び出すような)タイプのスクリプトの場合、speedyCGIで2回目以降の呼び出し時にも動作させるようにするには、どのような手順で修正してゆけばよいのでしょうか。 *wikiのspeedyCGI対応しているスクリプト内部を参考に見てみたのですが、戸惑うばかりでどこからどのように手をつけてよいのかわかりません。 お手数ですがご教授頂けますようお願い致します。 また参考になるHPなど御座いましたら合わせてご案内頂けますと幸いです。

  • 関数定義での変数について

    Perl/CGIより移行してきた者です。 この度、サブルーチン(PHPで言う関数定義)にて疑問があります。 当方、PHP5を利用しています。 Perl/CGIでは関数外で定義した変数も利用できたかと思うのですが、PHPでは利用できますか? 簡単なスクリプトでテストしたら表示されなく頭を悩ませています。 以下コードになります。 <?php $prints ="aaa"; $printss ="bbb"; function check3(){ print "$prints"; print "$printss"; } check3(); ?> Perl/CGIですと $test = "aaa"; &print(); sub print { print "$test"; } でもばっちり表示されたかと思うのですが。 伝わりにくいかと思いますが、ご存知の方宜しくお願い致します。

    • ベストアンサー
    • PHP