### 案1 dataを引数としてクラスから各Printクラスをよぶ
package printRole;
use Moose::Role;
requires qw(print_score1 print_score2);
no Moose::Role;
1;
package printPlate;
use Moose;
with 'printRole';
has data =>(is=>'rw', isa=>'Data');
__PACKAGE__->meta->make_immutable;
no Moose;
sub print_score1{};
sub print_score2{};
1;
package printRow;
use Moose;
with 'printRole';
has data =>(is=>'rw', isa=>'Data');
__PACKAGE__->meta->make_immutable;
no Moose;
sub print_score1{};
sub print_score2{};
1;
package printColumn;
use Moose;
with 'printRole';
has data =>(is=>'rw', isa=>'Data');
__PACKAGE__->meta->make_immutable;
no Moose;
sub print_score1{};
sub print_score2{};
1;
# 全部まとめては別クラスを作りゃいいのかな?
package printAll;
use Moose;
has plate =>();
has row=>();
has column=>();
__PACKAGE__->meta->make_immutable;
no Moose;
sub print_all{ print $self->plate;print $self->row; print $self->column; }
1;
### 案2 各Printクラスを格納するオブジェクトを介する
# Role
package printRole;
# class
package printPlate;
package printRow;
package printColumn;
# これだけ別クラス?メソッド名一緒で処理変えればいい?
package printAll;
# 各Printクラスを格納する
package Printer;
use Moose;
has role =>(
is=>'rw',
does=>'printRole',
required=>1,
handles=>[qw(print_score1 print_score2)],
);
__PACKAGE__->meta->make_immutable;
no Moose;
1;
## 各クラスでの処理
$self->print_score1();
sub print_score1{
#これでいいのか不明
my $printer = Printer->new( role => printXXX->new( data => $self->data() ) );
}
### 案3 一まとめでやる →再利用性がないな…
package Print;
use Moose;
has plate =>();
has row=>();
has column=>();
__PACKAGE__->meta->make_immutable;
no Moose;
sub print_all{ print $self->plate;print $self->row; print $self->column; }
sub print_A{ print $self->plate() };
sub print_B{ print $self->row() };
sub print_C{ print $self->column() };
1;
2009年12月31日木曜日
2009年12月30日水曜日
2.1 Bridgeパターン
モダンPerl入門(牧大輔)
より。
Bridgeパターン:委譲系パターン。
ある機能を実装するのに直接オブジェクトに定義するのではなく、それを定義する別のオブジェクトに処理を委譲する。インターフェースを変えずに同じ型でも実装が違うオブジェクトを定義する。
いやー直接書いちゃうんだよねえ。個人の範疇で書いてると。
1000行越えるとマジで手に負えんくなるからな。つーか500越えたらきついな。
このコードのまんま別のオブジェクト作れるね。
早速作っちゃった。
モダンPerl入門ってステキ。
より。
Bridgeパターン:委譲系パターン。
ある機能を実装するのに直接オブジェクトに定義するのではなく、それを定義する別のオブジェクトに処理を委譲する。インターフェースを変えずに同じ型でも実装が違うオブジェクトを定義する。
いやー直接書いちゃうんだよねえ。個人の範疇で書いてると。
1000行越えるとマジで手に負えんくなるからな。つーか500越えたらきついな。
このコードのまんま別のオブジェクト作れるね。
早速作っちゃった。
モダンPerl入門ってステキ。
plate クラスめも わからんくなったけど
階層がむちゃくちゃだけどメモ。
package calcRoles;
use Moose::Role;
requires qw(set_score1 set_score2 set_pctflag);
no Moose::Role;
1;
package PlateInfo;
use Moose;
with 'calcRoles';
has path => ();
has file_ref => ();
has data => (is=>'rw',isa=>'Data');
has id => (is=>'rw',isa=>'Str',required=>1,);
__PACKAGE__->meta->make_immutable;
no Moose;
sub BUILD{
my ($self,@args) = @_;
# BUILDじゃない気がするが処理はこれ。
$self->data( Data->new( data=>Data::Parser::Plates->new(files_ref=>\@files) ) );
}
sub set_score1{}
sub set_score2{}
sub set_pctflag{}
1;
package RowInfo;
use Moose;
with 'calcRoles';
has data => (is=>'rw',isa=>'Data',);
has id => (is=>'rw',isa=>'Str');
__PACKAGE__->meta->make_immutable;
no Moose;
sub BUILD{
my ($self,@args) = @_;
$self->data( Data->new( data=>Data::Parser::Rows->new( @args ) ) );
}
sub set_score1{}
sub set_score2{}
sub set_pctflag{}
1;
package ColumnInfo;
use Moose;
with 'calcRoles';
has data => (is=>'rw',isa=>'Data');
has id => ();
__PACKAGE__->meta->make_immutable;
no Moose;
sub BUILD{
my ($self,@args) = @_;
$self->data( Data->new( data=>Data::Parser::Columns->new( @args ) ) );
}
sub set_score1{}
sub set_score2{}
sub set_pctflag{}
1;
package Data;
use Moose;
has data =>(
is=>'rw',
does=>'Data::Parser',
required=>1,
handles=>[ qw(methodA methodB methodC) ]
);
__PACKAGE__->meta->make_immutable;
no Moose;
1;
package Data::Parser;
use Moose::Role;
requires qw(extract methodA methodB methodC);
no Moose::Role;
1;
package Data::Parser::Plates;
use Moose;
with 'Data::Parser';
__PACKAGE__->meta->make_immutable;
no Moose;
sub extract{}
sub methodA{}
sub methodB{}
sub methodC{}
1;
package Data::Parser::Rows;
use Moose;
with 'Data::Parser';
__PACKAGE__->meta->make_immutable;
no Moose;
sub extract{}
sub methodA{}
sub methodB{}
sub methodC{}
1;
package Data::Parser::Columns;
use Moose;
with 'Data::Parser';
__PACKAGE__->meta->make_immutable;
no Moose;
sub extract{}
sub methodA{}
sub methodB{}
sub methodC{}
1;
package main;
# ここはきっちり書かんと分からん。
my $plateInfo = PlateInfo->new(path=>'C:\test', file_ref=>\@files);
my $rowInfo = RowInfo->new($plateInfo,'value');
my $columnInfo = ColumnInfo->new($plateInfo,'value');
1;
package calcRoles;
use Moose::Role;
requires qw(set_score1 set_score2 set_pctflag);
no Moose::Role;
1;
package PlateInfo;
use Moose;
with 'calcRoles';
has path => ();
has file_ref => ();
has data => (is=>'rw',isa=>'Data');
has id => (is=>'rw',isa=>'Str',required=>1,);
__PACKAGE__->meta->make_immutable;
no Moose;
sub BUILD{
my ($self,@args) = @_;
# BUILDじゃない気がするが処理はこれ。
$self->data( Data->new( data=>Data::Parser::Plates->new(files_ref=>\@files) ) );
}
sub set_score1{}
sub set_score2{}
sub set_pctflag{}
1;
package RowInfo;
use Moose;
with 'calcRoles';
has data => (is=>'rw',isa=>'Data',);
has id => (is=>'rw',isa=>'Str');
__PACKAGE__->meta->make_immutable;
no Moose;
sub BUILD{
my ($self,@args) = @_;
$self->data( Data->new( data=>Data::Parser::Rows->new( @args ) ) );
}
sub set_score1{}
sub set_score2{}
sub set_pctflag{}
1;
package ColumnInfo;
use Moose;
with 'calcRoles';
has data => (is=>'rw',isa=>'Data');
has id => ();
__PACKAGE__->meta->make_immutable;
no Moose;
sub BUILD{
my ($self,@args) = @_;
$self->data( Data->new( data=>Data::Parser::Columns->new( @args ) ) );
}
sub set_score1{}
sub set_score2{}
sub set_pctflag{}
1;
package Data;
use Moose;
has data =>(
is=>'rw',
does=>'Data::Parser',
required=>1,
handles=>[ qw(methodA methodB methodC) ]
);
__PACKAGE__->meta->make_immutable;
no Moose;
1;
package Data::Parser;
use Moose::Role;
requires qw(extract methodA methodB methodC);
no Moose::Role;
1;
package Data::Parser::Plates;
use Moose;
with 'Data::Parser';
__PACKAGE__->meta->make_immutable;
no Moose;
sub extract{}
sub methodA{}
sub methodB{}
sub methodC{}
1;
package Data::Parser::Rows;
use Moose;
with 'Data::Parser';
__PACKAGE__->meta->make_immutable;
no Moose;
sub extract{}
sub methodA{}
sub methodB{}
sub methodC{}
1;
package Data::Parser::Columns;
use Moose;
with 'Data::Parser';
__PACKAGE__->meta->make_immutable;
no Moose;
sub extract{}
sub methodA{}
sub methodB{}
sub methodC{}
1;
package main;
# ここはきっちり書かんと分からん。
my $plateInfo = PlateInfo->new(path=>'C:\test', file_ref=>\@files);
my $rowInfo = RowInfo->new($plateInfo,'value');
my $columnInfo = ColumnInfo->new($plateInfo,'value');
1;
2009年12月29日火曜日
早速Iterator導入
いま考えてる仕事のプログラムにIterator導入。
中身は本のとほぼ同じにした。
クラスを別のクラスでBundleする必要があるが、
IDがくっついているのでArrayやListでなくHashtableにした。
動くかなあ。
できるまで楽しみ。
明日はPerlで同じようにデザインパターン導入してみる。
Mooseでね。
中身は本のとほぼ同じにした。
クラスを別のクラスでBundleする必要があるが、
IDがくっついているのでArrayやListでなくHashtableにした。
動くかなあ。
できるまで楽しみ。
明日はPerlで同じようにデザインパターン導入してみる。
Mooseでね。
2009年12月27日日曜日
1章Iterator
Java言語で学ぶデザインパターン入門
Iteratorパターン
繰り返しだからFor文とかWhileとかあんなんかな。
for(int i){}
iの働きを抽象化して一般化したものと書いてある。
ネストしたようなあるクラスを束ねるクラスにはすべて当てはまるのかね?
で、本章では、
本と
本棚と
本棚をスキャンするクラス
があって、
集合体=Aggregateをあらわすインターフェースと、
順番に数えてスキャンする=Iteratorインターフェースを作成して
実装してる。
となると、本棚が集合体をあらわすインターフェースを、
スキャンがスキャンするインターフェースを実装しているのね。
こんな感じで考えると、
ネストしてけば、それぞれの階層でこのAggregateとIterator
が実装できるわけだな。
インターフェースの例文は
public interface Aggregate{
public abstract Iterator iterator();
}
public interface Iterator{
public abstract boolean hasNext();
public abstract Object next();
}
定義はいつもこんな感じになるのだろうか?
だいたいIteratorといったら定義される処理が決まってくるのだろう。
この例だとShiftっぽい出す動きしかないけどPushみたいな入れる動きも必要だな。
つーかそれは他の章にあるのか?よまんとわからんな。
デザインパターンとはクラスの再利用かを促進するもの
と書いてあったぞ。
2万行とか書いてるとそこら中に似た処理増えて冗長性たけーわ、修正大変だわってなるもんな。毎度意識して作ったほうがいいわな。
実戦投入しながらコツ掴んでいくしかないな。
でもステキ。
Iteratorパターン
繰り返しだからFor文とかWhileとかあんなんかな。
for(int i){}
iの働きを抽象化して一般化したものと書いてある。
ネストしたようなあるクラスを束ねるクラスにはすべて当てはまるのかね?
で、本章では、
本と
本棚と
本棚をスキャンするクラス
があって、
集合体=Aggregateをあらわすインターフェースと、
順番に数えてスキャンする=Iteratorインターフェースを作成して
実装してる。
となると、本棚が集合体をあらわすインターフェースを、
スキャンがスキャンするインターフェースを実装しているのね。
こんな感じで考えると、
ネストしてけば、それぞれの階層でこのAggregateとIterator
が実装できるわけだな。
インターフェースの例文は
public interface Aggregate{
public abstract Iterator iterator();
}
public interface Iterator{
public abstract boolean hasNext();
public abstract Object next();
}
定義はいつもこんな感じになるのだろうか?
だいたいIteratorといったら定義される処理が決まってくるのだろう。
この例だとShiftっぽい出す動きしかないけどPushみたいな入れる動きも必要だな。
つーかそれは他の章にあるのか?よまんとわからんな。
デザインパターンとはクラスの再利用かを促進するもの
と書いてあったぞ。
2万行とか書いてるとそこら中に似た処理増えて冗長性たけーわ、修正大変だわってなるもんな。毎度意識して作ったほうがいいわな。
実戦投入しながらコツ掴んでいくしかないな。
でもステキ。
Int と longは?
4バイト符号付整数型と 8バイト符号付整数型
これも整数か。Byte shortよりでかい。
Byte short int long で1,2,4,8バイト整数。
Intしか知らんかった。
ちなみに4バイトだと-2147483648〜2147483647か。10億だ。
でかい。型重要だな。
これも整数か。Byte shortよりでかい。
Byte short int long で1,2,4,8バイト整数。
Intしか知らんかった。
ちなみに4バイトだと-2147483648〜2147483647か。10億だ。
でかい。型重要だな。
byteとshortはなんだ?
1バイト符号付整数と 2バイト符号付整数
1バイトで符号つきということは、
±1ビットプラス7ビットだから
2の7乗で±128ってことか?
っておもったら-128から127か。
0が抜けてたな。
じゃあShortは -32768から32767か。
バイト数が決まってるってことは大きさに意味があるってことか?
むやみにでかい入れ物使うと遅くなるのかな?
1バイトで符号つきということは、
±1ビットプラス7ビットだから
2の7乗で±128ってことか?
っておもったら-128から127か。
0が抜けてたな。
じゃあShortは -32768から32767か。
バイト数が決まってるってことは大きさに意味があるってことか?
むやみにでかい入れ物使うと遅くなるのかな?
StringとCharってちがうのか
Perlやってきたから分からんかった。
char って一文字なの?
でStringが文字列?
char a = 'a';
string string = "string";
おれってこういうレベルなのね?
char って一文字なの?
でStringが文字列?
char a = 'a';
string string = "string";
おれってこういうレベルなのね?
扱う型が違う。でも機能は一緒。戻り値も一緒
っていう複数のクラスがあるときに、抽象クラスを作って継承させる方がいいのか。それともインターフェースを作って実装させるのか?
どっちでもいいのか悪いのかの感覚すらない。
最終的にかえすのがDoubleの配列かそれを持ってるクラスになるが、
処理はClassAではStringをゴチャゴチャしてDoubleを返して
ClassBではIntをゴチャゴチャしてDoubleを返すような形になる。
クラス継承だと同じメソッド名でも処理かえるから
これだとInterfaceの方がいいのか?
つーか両方共オーバーライドするから一緒か?
わけ分からん。
とりあえず両方作ってみて理解していこう。
答えがでてくるかな。
つーかJavaでもやるし、PerlでもMooseでやってみよう。
どっちでもいいのか悪いのかの感覚すらない。
最終的にかえすのがDoubleの配列かそれを持ってるクラスになるが、
処理はClassAではStringをゴチャゴチャしてDoubleを返して
ClassBではIntをゴチャゴチャしてDoubleを返すような形になる。
クラス継承だと同じメソッド名でも処理かえるから
これだとInterfaceの方がいいのか?
つーか両方共オーバーライドするから一緒か?
わけ分からん。
とりあえず両方作ってみて理解していこう。
答えがでてくるかな。
つーかJavaでもやるし、PerlでもMooseでやってみよう。
2009年12月25日金曜日
Win32::GUI::Tooltip
my $main_window = Win32::GUI::Window->new(
-name => 'main_window',
-size => [400,300],
-background => '#ffffff',
);
my $tooltip= Win32::GUI::Tooltip->new($main_window,);
$tooltip->AddTool(-window => $main_window,-text => "ahoahoman",);
-name => 'main_window',
-size => [400,300],
-background => '#ffffff',
);
my $tooltip= Win32::GUI::Tooltip->new($main_window,);
$tooltip->AddTool(-window => $main_window,-text => "ahoahoman",);
2009年12月24日木曜日
Tk::TableMatrixのインストールエラー
C:/strawberry/perl/site/lib/Tk/X11/Xlib.h:1206:41: ../../../pTk/tkIntXlibDecls.h
: No such file or directory
とでた。
Findすると、tkIntXlibDecls.hがC:/strawberry/perl/site/lib/Tk/pTk
にあるので、
ファイルの読み取り専用権限を除いた後、
Xlib.hの 1206 行目を
../../../pTk から ../pTk に変更して 再実行。
見事インストール完了
最近こんなん多すぎ。
: No such file or directory
とでた。
Findすると、tkIntXlibDecls.hがC:/strawberry/perl/site/lib/Tk/pTk
にあるので、
ファイルの読み取り専用権限を除いた後、
Xlib.hの 1206 行目を
../../../pTk から ../pTk に変更して 再実行。
見事インストール完了
最近こんなん多すぎ。
2009年12月17日木曜日
Win32::GUI::TreeView 何とかできた
#!perl/bin/perl
use warnings;
use strict;
use Win32::GUI();
my $main = Win32::GUI::Window->new(
-name => 'Main',
-width => 400,
-height => 300,
);
my $tree_view = $main->AddTreeView(
-name => 'TreeView',
-width => 250,-height => 200,
-top=>10,-left=>10,
-buttons =>1,-rootlines=>1,-lines=>1,
-notify=>1,
-showselalways => 1,
-trackselect => 1,
#-onClick=>sub{print "clicked\n";},
);
my $parent1 = $tree_view->InsertItem(
-text => 'parent1',
-indent => 1,
-image => 0,
);
my $child = $tree_view->InsertItem(
-text => 'child',
-indent => 1,
-image => 0,
-parent => $parent1,
);
my $parent2 = $tree_view->InsertItem(
-text => 'parent2',
-indent => 1,
-image => 0,
);
# DblClickのほうが確実
sub TreeView_DblClick{
my $getSelection = $main->TreeView->GetSelection();
if($getSelection == $child){
print "selection:$getSelection\n";
}else{
print "TreeView\n";
}
}
$main->Show();
Win32::GUI::Dialog();
use warnings;
use strict;
use Win32::GUI();
my $main = Win32::GUI::Window->new(
-name => 'Main',
-width => 400,
-height => 300,
);
my $tree_view = $main->AddTreeView(
-name => 'TreeView',
-width => 250,-height => 200,
-top=>10,-left=>10,
-buttons =>1,-rootlines=>1,-lines=>1,
-notify=>1,
-showselalways => 1,
-trackselect => 1,
#-onClick=>sub{print "clicked\n";},
);
my $parent1 = $tree_view->InsertItem(
-text => 'parent1',
-indent => 1,
-image => 0,
);
my $child = $tree_view->InsertItem(
-text => 'child',
-indent => 1,
-image => 0,
-parent => $parent1,
);
my $parent2 = $tree_view->InsertItem(
-text => 'parent2',
-indent => 1,
-image => 0,
);
# DblClickのほうが確実
sub TreeView_DblClick{
my $getSelection = $main->TreeView->GetSelection();
if($getSelection == $child){
print "selection:$getSelection\n";
}else{
print "TreeView\n";
}
}
$main->Show();
Win32::GUI::Dialog();
2009年12月4日金曜日
2009年12月3日木曜日
Oracle Bronze
二週間で受かるものらしい。
http://tryoracle.seesaa.net/category/5759492-1.html
即予約。
翔泳社オラクルマスター
徹底攻略オラクルマスター
絵で見てわかるOracleの仕組み
しかしテスト受けるだけで3万弱って・・・。
ボーナスゼロなのに。
ブロンズとらんとはじまらんしな・・・。
Sunってこれでやっていってるんだな。
http://tryoracle.seesaa.net/category/5759492-1.html
即予約。
翔泳社オラクルマスター
徹底攻略オラクルマスター
絵で見てわかるOracleの仕組み
しかしテスト受けるだけで3万弱って・・・。
ボーナスゼロなのに。
ブロンズとらんとはじまらんしな・・・。
Sunってこれでやっていってるんだな。
2009年12月2日水曜日
Catalyst はじまりはじまり
1. catalyst.pl Aho
2. cd Aho/script
3. ./bookmark_server.pl -p 3000 -r
-pはポートを変更する場合使う。デフォルトで3000
-r を与えると変更が反映される
これだけでとりあえずローカルサーバーが立ち上がる。
ステキ。
2. cd Aho/script
3. ./bookmark_server.pl -p 3000 -r
-pはポートを変更する場合使う。デフォルトで3000
-r を与えると変更が反映される
これだけでとりあえずローカルサーバーが立ち上がる。
ステキ。
登録:
投稿 (Atom)