39105


ruby で開発をしています。プログラムを開発していると、多種多様な Value Object を定義することに (定義したく)
なりますが、その手順が、以下に示す通り同じようなことの繰り返しなので、どうにか効率化できないかと考えています。

具体例 Value Object クラス

[code]

    class Person
      attr_reader :name, :age
      def initialize(name, age)
        @name = name
        @age = age
      end
    
      def ==(other)
        name == other.name &&
          age == other.age
      end
    end
    
[/code]

これは、２つのフィールドを持つクラスなので、まだシンプルですが、フィールド数が増えてくると、特にフィールド変更のプログラム修正を行う場合などに苦痛です。

質問:

  * ruby において value object を効率よく記述するための手法・ライブラリなどはありますか？


CC BY-SA 3.0
2017-10-28T10:32:04.353
39103
2017-10-28T12:22:06.480
754
question
ruby
ruby で Value Object を効率的に記述したい


[Structクラス](https://docs.ruby-
lang.org/ja/latest/class/Struct.html)を使う方法はどうでしょうか？

[code]

    Person = Struct.new(:name, :age) do
      def initialize(*args)
        super
        freeze
      end
    end
    
    taro = Person.new('太郎', 18)
    hanako = Person.new('花子', 18)
    taro_adult = Person.new('太郎', 36)
    taro_clone = Person.new('太郎', 18)
    
    puts taro
    puts taro == hanako
    puts taro == taro_adult
    puts taro == taro_clone
    
    taro.age = 19 # => Error
    
[/code]

単に`Struct.new`でクラスを作成した場合はmutableなオブジェクトになってしまいますので、`initialize`を上書き定義して`freeze`しておく必要があります。

他にもいくつかgemがあるようですので、そちらを使うという手もあります。

  * [value](https://rubygems.org/gems/value)
  * [value_object](https://rubygems.org/gems/value_object)
  * [value-object](https://rubygems.org/gems/value-object)
  * [value_struct](https://rubygems.org/gems/value_struct)


CC BY-SA 3.0
2017-10-28T12:22:06.480
39105
2017-10-28T12:22:06.480
7347
39103
answer