オブジェクト指向perl
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/05/29 01:51ID:vRl7MJUjやサイトないですか?なかなか見つかりません。
0069nobodyさん
03/08/09 22:12ID:???最終的にif文からは逃げられない。せいぜいその部分を外に出すだけ。
そのあと機能ごとに同じ名前のメソッドを作ってポリモフィズム。
メリットはmainのソースをいじらなくてすむことかな。
package main;
my $app = FooBar::Factory->func($mode);
$app->run;
exit;
package FooBar::Factory;
use base 'FooBar';
sub func {
my ($mode) = @_;
if ($mode eq 'view') {
return FooBar::View->new;
} elsif ($mode eq 'Regist') {
return FooBar::Regist->new;
}
return FooBar->new;
}
package FooBar;
sub new { ref $_[0] ? ref $_[0] : $_[0] }
sub run {
my $self = shift;
$self->doing;
$self->output;
}
package FooBar::View;
use base 'FooBar'; sub doing { ... } sub output { ... }
package FooBar::Regist;
use base 'FooBar'; sub doing { ... } sub output { ... }
007069
03/08/09 22:13ID:???0071nobodyさん
03/08/10 09:38ID:???ありがとうございます。
昨日「オブジェクト指向perlマスターコース」買ってきて読み始めましたが、
まだ言葉の意味から探っている段階です。
書いて頂いたもの、僕が出した例の「条件分岐によるサブルーチンの振り分け」
のその上に「オブジェクト指向」という概念、というかレイヤーをもうひとつ
かぶせている、という事でしょうか。
オブジェクト指向でプログラムを構築する、と言うのはある程度の規模でこそ
メリットが発揮される、というように感じますがどうなんでしょう。
今書いているものは2000行程ですが行の半分はHTML展開部分です。
で、進め方は設計の概略は最初に考えるものの細かな部分を含め、
どうしてもボトムアップな進め方になってしまってます。
こんな進め方は「オブジェクト指向」なプログラムには向かないような気がしています。
もっとトップダウンで進める、というか、初期の設計段階にもっと時間を
かける、というか。
僕が書いたやり方だとプログラムの構造が「フラット」な気がします。対して
書いて頂いたものはもっと「階層構造的」なきがします。
「フラット」なものは全体が煩雑になりがちですが、でもどうにでもいじくれます。
でも書いた本人以外にはわかり難い物になるでしょうね。
でも「階層構造的」なものは一部分の変更は容易で他の人にもプログラムの
全体構造はわかりやすいでしょうが、逆に言うといじくれる範囲が限定されてくる。
その分全体構造なり仕様を設計初期である程度明確にする必要がある、様な気がします。
> メリットはmainのソースをいじらなくてすむことかな。
これは僕が書いたやり方でもプログラムの構造が変わらない限り、同じだと
思うのですが、そういうことではない、という事ですか?
0072nobodyさん
03/08/10 16:17ID:???オブジェクト指向はしっかりとした設計を先に練らないと役に立たないし、
そうしないと後から後からやってくる仕様変更に耐えられません。
(そうしたいい加減な設計に振り回された人達が
「オブジェクト指向は実践では役に立たない」と広める結果に)
だから何かを作る時に、プログラミングは最後の段階というか、
あとは予定通りにコードを書けば完成、というくらいになるまで書かない方がいいと思う。
ってそれが出来たら苦労しないんだけど。
> これは僕が書いたやり方でもプログラムの構造が変わらない限り、同じだと
> 思うのですが、そういうことではない、という事ですか?
コードは一つのファイルに全てを書かずに、モジュールに分割してください。
オブジェクト指向だろうがなんだろうが、綺麗なソースは変更点が少なくてすみます。
あとこれは嫌味ではなく、一度別のオブジェクト指向の言語に触れておいた方がいいです。
その方が理解が速い。Perlは独特だから。
007371
03/08/10 17:33ID:???ありがとうございます。
なるほど、やっぱりある程度の規模で今までより大きなプログラムの
設計概念から入れ、それでこそ生きる手法、って事でしょうか。
今、ある組織のサイトの為にperlで書いたCGIスクリプトが三つあるんです。
ひとつは主要なデータを抽出して対外的にアナウンスを出すもの。
二つ目は組織の各部署を統合しながらスケジュール管理するもの。
三つ目は活動記録などをリクエストされた形態で表示するものです。
三つはもともとその時その時の必要に応じて書いたもので、
もちろんデータも別に持っているのですが、ここに来て同じようなデータを
持っていたり、あるいはちょっと加工することでデータやルーチンを共有
した方が効率的だ、何とかならないかな、と思っていました。
こういう要求には「オブジェクト指向」って役に立ちそうですね。
もっと勉強しなければなりませんが、勉強するモチベーションはあがりそうです。
>一度別のオブジェクト指向の言語に触れておいた方がいいです。
これはよく聞きます。
まあもともとperl自体がオブジェクト指向を念頭に設計されてない、って事でしょうね。
オブジェクト指向、とは別にある方からJAVA勉強すれば、といわれているのです。
とりあえず今のところperlに一所懸命なものでなかなか手につかないのですが、
zdnetやらatmarkitやら暇を見つけてはJAVAについての記述を読んだりしていますが
なかなか難しいです。
どうしてもWEB関連での開発ということになるので、まずテスト環境から構築しなければならないですし。
ありがとうございました。
このスレももっと動いて欲しいですね。
0074nobodyさん
03/08/11 02:19ID:???0075山崎 渉
03/08/15 22:39ID:???│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
007671
03/08/28 12:36ID:???結局いきなりオブジェクト指向なコーディングに入っても、
やっぱり漠然としてるもんで、atmarkitで、
「ここから始めるオブジェクト指向」、と「初歩のUML」読んでます。
なんとなく漠然としてた物がはっきりしてきたような。
本職設計業では良くある具現化手法なのでとっつきやすいし、
イメージつかみ安いですね。
0077nobodyさん
04/01/10 06:31ID:???慣れの問題かもしれんがかなり変則的な書き方してる気もする。
Perl6をとりあえず、待ってみる。もう少し他の言語のOOPに近づいてほしい。
今はとりあえず、利用する側として勉強するにとどめます。
0078nobodyさん
04/08/26 15:36ID:CuD1nIEH0079nobodyさん
05/02/03 03:22:49ID:bOooCN0T0080nobodyさん
05/02/20 13:47:57ID:7xcSHK1jdelphiでいうclassの、プロパティ及びメソッドへのアクセスは全て「.」でした。
perlだと「->」と言う風に認識していました。
ところが最近見たソースで(今手元に無いのですが)、
perlのパッケージ(classと同義?)内の関数を
&パッケージ名'関数名(引数)
と言う形で使っているものがありました。
ソースを見た限りでは、なんとなくclassをインスタンス化せずに
関数を使っている場合に「'」を使用しているように見えるのですが、
この認識は間違っていないでしょうか?
->
'
::
の違いが良く判りません。。
こういう記号ってgoogleだと検索できないし…
0081nobodyさん
05/02/20 14:30:53ID:???0082nobodyさん
05/02/20 14:47:41ID:tXrbjTyl0083nobodyさん
05/02/20 17:58:25ID:???0084nobodyさん
05/02/21 11:26:28ID:???0085nobodyさん
05/02/22 05:38:41ID:???OOPじゃないPerlの解説も親切でわかりやすい。
俺はラクダ本を読んだことがないのでこれを読んでようやくlocalとmyの違いがわかった。
一般書籍レベルの解説書にはそれぞれの変数の振る舞いについては欠かれていたが、
本質的な定義について理解できたのは偏にこの本のお陰だ。
ちょっとでもOOPに興味があったら買うべし。
>>80
それはPerl4の頃の仕様じゃないか?
昔は名前空間の定義が曖昧だったためにパッケージ変数にアクセスするときに
「$パッケージ名'型グロブ」としていたときのものと思われる。
互換性を保つためにPerl5でもそれが読めるようだが、本質的にPerlオブジェクトは
$スカラにオブジェクトへのリファレンスを格納して->でデリファレンスするので
オブジェクトメソッドにアクセスするには->を使う。
ちなみに::はPerl5以降での名前空間の参照に用いる。
これでわかるか?てか合ってるかな?
008785
05/02/23 02:16:19ID:???×「$パッケージ名'型グロブ」
○「*パッケージ名'型グロブ」
たまに配布版掲示板CGIなんかでjcode.plをこの方法で使っているのを見かける。
わかったなら良かったよ・・・。
0088nobodyさん
2005/04/11(月) 20:39:48ID:gPOrHcmM$class = new Class;として、
$class->func(...); と Class::func($class, ...); はほぼ同じときいたので、
ちょっと汚く見えますけどClass::func($class, ...);と書いても問題はないのでしょうか。
Class::func()のほうはただサブルーチンを呼び出しているだけなので
$class->func()より速いという結果になりました(当たり前ですけど…)。
$classが何のオブジェクトか分からない場合は->演算子を使うのですが、
$classが必ず"Class"のオブジェクトでしかありえない場合では普通に呼び出したいと思うことがあります。
0089nobodyさん
2005/04/11(月) 20:43:51ID:???http://192.168.0.5/
http://192.168.0.5/~ss.jpg
http://kouichi/
http://kouichi/~ss.jpg
0090nobodyさん
2005/04/13(水) 02:23:33ID:???そうでなく、静的かインスタンスかで理解したほうが。
コンストラクタでblessした$selfなんかの値は使えないよ。
0091nobodyさん
2005/04/18(月) 17:58:39ID:???遅れてすみません。
Class::func("Class",...);はいいけどClass::func($class,...);は駄目ということですよね。
(あまり理解できていないような気がします、ちょっと不安…)
ありがとうございました。
0092nobodyさん
2005/05/29(日) 01:27:45ID:???0093nobodyさん
2005/05/29(日) 16:52:06ID:???Class::HPLOOという便利な奴があるみたいですが、
皆さんは何を使ってますか?
ちなみにここを参考にしました。
http://naoya.dyndns.org/~naoya/mt/archives/000870.html
0094nobodyさん
2005/06/27(月) 15:05:43ID:EleSXDWpクロージャとハッシュと無名関数だけでOOPを実装。
インスタンス、カプセル化、継承、多態性が実装されてるからOOPだよね。
sub String_new{
my $value = shift;
my $self;
$self = {
set => sub{$value=$_[0]},
value => sub{$value},
};
}
sub String2_new{
my $base = String_new(@_);
my $self;
$self = {
%$base,
set => sub{my$str=$self->{value}();$base->{set}($_[0]);$str},
length => sub{length $self->{value}()},
}
}
$s1 = String_new('abcde');
$s2 = String2_new('1234567');
print $s1->{value}(),"\n";
print $s1->{set}('wxyz'),"\n";
print $s1->{value}(),"\n";
print $s2->{value}(),"\n";
print $s2->{set}('890'),"\n";
print $s2->{value}(),"\n";
print $s2->{length}(),"\n";
0095nobodyさん
2005/06/29(水) 05:34:38ID:???0096山碕渉
2005/07/05(火) 00:52:32ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山碕渉
0097nobodyさん
2005/12/17(土) 00:54:36ID:Nve1rpZB0098nobodyさん
2005/12/17(土) 05:11:53ID:L4AdeMAk0099nobodyさん
2005/12/17(土) 15:31:32ID:???0100nobodyさん
2005/12/29(木) 17:34:47ID:Nhlmh3Zf取って解析したあと、解析した値を他のモジュールから呼び出すにはどういう記述
をすれば良いですか?
0101nobodyさん
2005/12/29(木) 17:35:40ID:Nhlmh3Zfpackage Common::Parser;
sub new {
my $class = shift;
my $self = {
query => undef
};
bless $self, $class;
if ($ENV{'CONTENT_LENGTH'} or $ENV{'QUERY_STRING'}) {
$self->{query} = $self->_parse_query;
}
}
0102nobodyさん
2005/12/29(木) 17:36:58ID:Nhlmh3Zfmy $self = shift;
my ($data, $query);
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
} else {
$data = $ENV{'QUERY_STRING'};
}
foreach (split(/&/, $data)) {
my ($name, $value) = split(/=/);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
$query->{$name} = $value;
}
}
1;
0103nobodyさん
2005/12/29(木) 18:21:13ID:???というかCGI.pm使えば?
0104nobodyさん
2005/12/30(金) 09:29:38ID:???0105nobodyさん
2005/12/30(金) 13:18:26ID:WC8C4E+l頑張ってみたいと思います。
解答ありがとうございました!
0106nobodyさん
2005/12/30(金) 13:58:41ID:WC8C4E+l>>101のように、コンストラクタの中に
if ($ENV{'CONTENT_LENGTH'} or $ENV{'QUERY_STRING'}) {
$self->{query} = $self->_parse_query;
}
のように、本来のコンストラクタの仕事である関連付け以外の処理をさせても良いのですか?
0107nobodyさん
2005/12/30(金) 18:10:38ID:???PerlでのOOの勉強目的でやってんならCPANモジュールの中身見て
どんなことをやってるか参考にしたらいいよ
0108nobodyさん
2006/01/01(日) 16:23:29ID:???0109nobodyさん
2006/04/24(月) 03:56:56ID:???0110nobodyさん
2006/05/07(日) 21:19:51ID:???0111nobodyさん
2006/05/21(日) 05:12:37ID:???書籍以外に何を見たらいいの?
自分はCGIのためにPerl始めたんだが
そこらで配布されてるCGIにオブジェクト指向が取り入れられてる例を見たことがない。
適材適所とは思うけど、小規模なスクリプトだからってオブジェクト指向イラネってことも
ないと思うんだけど・・・
身近で、興味が持てる例があれば理解の助けになると思うのに
それともフリー配布のCGIに教材的な面を望むのが無謀なのか。
0112nobodyさん
2006/05/21(日) 07:06:33ID:???まず最初に、その検索能力の無さをなんとかしろよ
0113nobodyさん
2006/05/21(日) 08:38:29ID:???0114nobodyさん
2006/05/21(日) 08:48:25ID:???0115112
2006/05/21(日) 12:27:40ID:???しょーがねーな
なんか反応が素直だからいくつかURL貼ってやるよ
ttp://serennz.cool.ne.jp/sblog/
ttp://apps.cside.com/
あとはここで好きなだけ探せ
ttp://search.cpan.org/
0118112
2006/05/21(日) 18:49:49ID:???俺は
>そこらで配布されてるCGIにオブジェクト指向が取り入れられてる例
を紹介しただけ。
綺麗な書き方のはお前さんにまかせた。
0120nobodyさん
2006/05/21(日) 21:26:43ID:???0121nobodyさん
2006/08/09(水) 14:48:38ID:???># 2.00a [2004/11/17] generated ... oh, it's my birthday.
痛いコメントハケーン
0122nobodyさん
2006/08/19(土) 14:23:39ID:???作者の誕生日にはわざわざお知らせを出すようになってる
もっと痛いスクリプトも世の中にはあるぞ。
オブジェクト指向は取り入れられてないからこのスレには書かないが。
0123nobodyさん
2006/08/20(日) 00:59:39ID:???> もっと痛いスクリプトも世の中にはあるぞ。
> オブジェクト指向は取り入れられてないからこのスレには書かないが。
存在を知らせる必要すらなくね?
0125nobodyさん
2008/01/20(日) 12:39:36ID:eQx+pRRH0126nobodyさん
2009/07/02(木) 00:20:51ID:???サブルーチンにリファレンスでぐちゃぐちゃだったコードがすっきりした
単純にうれしい
0127 忍法帖【Lv=40,xxxPT】(4+0:8) 【28.1m】 電脳プリオン ◆3YKmpu7JR7Ic
2012/09/30(日) 17:38:58.16ID:????PLT(12079)∧_∧
( ・∀・) | | ガガッ
と ) | |
Y /ノ .人
/ ) .人 < >_∧∩
_/し' < >_∧∩`Д´)/
(_フ彡 V`Д´)/ / ←>>63
/ ←>>59
0128nobodyさん
2013/08/15(木) NY:AN:NY.ANID:???■ このスレッドは過去ログ倉庫に格納されています