DDDをちょっとかじってみる
技術書を出版している翔泳社さんという出版社があり、たまに電子書籍のセールをやっています。
そこで、前から気になってはいたけどよく知らない、Webでさらっと見たけどとっつきにくそう、最近耳にした、ということでDDDの本を買ってみました。
例示のコードはC#で、C#は名前しか知らないんですが・・・まぁ、なんとかなります。読むだけなら。
というかプログラム言語って「上から下に読む」「カッコの中はまとまりのある内容」「英語」という共通点があるので、なんとかなってる感です。
(たまに、それでなお読めない言語とかもあるけど)
Perlにはない仮引数とかも、JavaScriptで見たやつだなーとか、そんなレベルで見て写経しています。
ただ、言語の違いよりは「値オブジェクト」とかのDDD特有の概念を噛み砕いていくのが大変そうという感じです。
Kindle版で読んでいるので11%くらいの読破率なのですが。何度もスルメみたいに噛んで覚える本なのかもしれません。
#!/usr/bin/env perl use strict; use warnings; use feature qw/say/; use Data::Dumper; my $name_a = FullName->new( "Larry", "Wall" ); say $name_a->last_name; # Wall my $name_b = FullName->new( "Anders", "Hejlsberg" ); say $name_b->last_name; # Hejlsberg # オブジェクトの属性を取り出しての比較。一見自然だが・・・ # FullNameオブジェクトが値であることを考えると不自然な記述 # この辺りはまだ納得がいっていない(「値である」のところ) # # ただ、後述の比較方法の方が「自然」というのはわかる。 if ( ( $name_a->last_name eq $name_b->last_name ) && ( $name_a->first_name eq $name_b->first_name ) ) { say "equal"; } else { say "not equal"; } # 値オブジェクト同士を比較するメソッドを用意する方法(自然) if ( $name_a->Equals($name_b) ) { say "equal"; } else { say "not equal"; } # 値オブジェクト同士の比較を、演算子オーバーライドを活用する(より自然) if ( $name_a == $name_b ) { say "equal"; } else { say "not equal"; } package FullName; use overload '==' => "Equals"; sub new { my $class = shift; my ( $first, $last ) = @_; my $self = bless { first_name => $first, last_name => $last }, $class; return $self; } sub last_name { my $self = shift; return $self->{last_name}; } sub first_name { my $self = shift; return $self->{first_name}; } sub Equals { my $self = shift; my $other = shift; if ( $self->first_name eq $other->first_name && $self->last_name eq $other->last_name ) { return 1; } else { return 0; } }