初めてのclass

初めてperlでclassを作ってみた。
内容はあんまり無い、phpで誰しも真っ先に作るclass。
配列にkeyとvalをぽんぽん入れて、出せて、毎回array_key_existsしなくて良い。
そんなclassはどう書くのか試してみた。

      1 #!/usr/local/bin/perl
      2
      3 package dataContainer;
      4 use strict;
      5 use warnings;
      6 use Data::Dumper;
      7 use Class::Struct;
      8
      9 struct( container => '%', ); # classのメンバ変数を宣言
     10
     11 sub init {
     12     my ($self) =@_;
     13     my %hash_ref;
     14     $self->container(\%hash_ref);
     15 }
     16
     17 sub set {
     18     my ($self,$key,$val) =@_;
     19     ${%{$self->container}}{$key} = $val;
     20     return 1;
     21 }
     22
     23 sub get {
     24     my ($self,$key) = @_;
     25     my %hash_ref = %{$self->container};
     26     return $hash_ref{$key} if exists $hash_ref{$key};
     27 }
     28
     29 package Main;
     30
     31 my $obj  = new dataContainer; # constructor
     32 my $obj2 = new dataContainer; # constructor
     33
     34 $obj->init();
     35 $obj2->init();
     36
     37 print "================================\n";
     38 $obj->set('hoge', 'moge');
     39 $obj->set('hoge1', 'moge1');
     40 $obj2->set('agg', 'hagehaghe');
     41 $obj2->set('iya', 'sorehanai');
     42
     43 # DEBUG
     44 #my @hoge = ( %{$obj->container} );
     45 #my $dumper = new Data::Dumper(\@hoge);
     46 #print $dumper->Dump();
     47
     48 print $obj->get('hoge'). "\n";
     49 print $obj->get('hoge1'). "\n";
     50 print $obj2->get('iya'). "\n";
     51 print $obj2->get('naiyo'). "\n";
     52
     53 1; 

きもいようきもいよう。
コード貼り付けにVOXは向いてませんね。
やはりはてなでしょうか。

何でキモイと思うのでしょう。

  • Class::Structを利用するとコンストラクタが使えない?ので毎回initが必要?マジで?コンストラクタ使いたいよ。
  • メンバ変数containerはハッシュだってstructで宣言してるのにinitで必ずリファレンスと紐つけねばならない
  • 運命の19行。self->containerをハッシュにキャストして、それをスカラーにキャストして扱う。(これしかないの?マジで?)
  • 26行みたいな書き方はすげーいやだったのが段々快感に・・・
  • 値のdumpが面倒。
  • 引数のチェックは自前実装?(してないけど)
  • typoしまくる。(俺のせいか、テストハーネス早いうちに学ばないと。)
  • あああ、setでARRAYやHASHを入れる場合の考慮してないや、どう動くのかしら。