sironekotoroの日記

Perl で楽をしたい

DDDをちょっとかじってみる

技術書を出版している翔泳社さんという出版社があり、たまに電子書籍のセールをやっています。

そこで、前から気になってはいたけどよく知らない、Webでさらっと見たけどとっつきにくそう、最近耳にした、ということでDDDの本を買ってみました。

www.shoeisha.co.jp

例示のコードは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;
    }

}