クラスを使うプログラミング

```rb
users = []
=> []
users << {first_name: 'Alice', last_name: 'Ruby', age: 20}
=> [{:first_name=>"Alice", :last_name=>"Ruby", :age=>20}]
users << {first_name: 'Bob', last_name: 'Python', age: 30}
=> [{:first_name=>"Alice", :last_name=>"Ruby", :age=>20}, {:first_name=>"Bob", :last_name=>"Python", :age=>30}]
users
=> [{:first_name=>"Alice", :last_name=>"Ruby", :age=>20}, {:first_name=>"Bob", :last_name=>"Python", :age=>30}]
users.each do |user|
    pusts "氏名: #{user[:first_name]} #{user[:last_name]}, 年齢: #{user[:age]}"
end

users.each do |user|
    puts "氏名: #{user[:first_name]} #{user[:last_name]}, 年齢: #{user[:age]}"
end
氏名: Alice Ruby, 年齢: 20
氏名: Bob Python, 年齢: 30
=> [{:first_name=>"Alice", :last_name=>"Ruby", :age=>20}, {:first_name=>"Bob", :last_name=>"Python", :age=>30}]
def full_name(user)
   "#{user[:first_name]} #{user[:last_name]}"
end
=> :full_name
users.each do |user|
   puts "氏名: #{full_name(user)}, 年齢:#{user[:age]}"
end
氏名: Alice Ruby, 年齢:20
氏名: Bob Python, 年齢:30
=> [{:first_name=>"Alice", :last_name=>"Ruby", :age=>20}, {:first_name=>"Bob", :last_name=>"Python", :age=>30}]
users[0][:first_name]
=> "Alice"
users[0][:first_mame]
=> nil
users[0][:country] = 'japan'
=> "japan"
users[0][:first_name]
=> "Alice"
users[0][:first_name] = 'Carol'
=> "Carol"
users[0]
=> {:first_name=>"Carol", :last_name=>"Ruby", :age=>20, :country=>"japan"}
````
>ハッシュは新しくキーを追加したり、内容を変更したりできるので「もろくて壊れやすいプログラム」になりがちです
...
小さなプログラムではハッシュのままでも問題ないかもしれませんが、大きなプログラムになってくると、とてもハッシュでは管理しきれなくなってきます。そこで登場するのがクラスです。こういう場合は`Userクラスという新しいデータ型を作り、そこにデータを入れた方がより堅牢なプログラムになります`。
* クラスで新しいデータを作り、データを入れた方が堅牢になる

```rb
irb(main):001* class User
irb(main):002*   attr_reader :first_name, :last_name, :age
irb(main):003*
irb(main):004*   def initialize(first_name, last_name, age)
irb(main):005*     @first_name = first_name
irb(main):006*     @last_name = last_name
irb(main):007*     @age = age
irb(main):008*   end
irb(main):009> end
=> :initialize
irb(main):010> users = []
=> []
irb(main):011> users << User.new("Alice", "Ruby", 20)
=> [#<User:0x000000010cff3130 @age=20, @first_name="Alice", @last_name="Ruby">]
irb(main):012> users << User.new("Bob", "Python", 30)
=> [#<User:0x000000010cff3130 @age=20, @first_name="Alice", @last_name="Ruby">, #<User:0x000000010d090048 @age=30, @first_name="Bob", @last_name="Python">]
irb(main):013* def full_name(user)
irb(main):014*   "#{user.first_name} #{user.last_name}"
irb(main):015> end
=> :full_name
irb(main):016* users.each do |user|
irb(main):017*   puts "氏名:#{full_name(user)}, 年齢:#{user.age})"
irb(main):018> end
氏名:Alice Ruby, 年齢:20)
氏名:Bob Python, 年齢:30)
=> [#<User:0x000000010cff3130 @age=20, @first_name="Alice", @last_name="Ruby">, #<User:0x000000010d090048 @age=30, @first_name="Bob", @last_name="Python">]
irb(main):019> users[0].first_name
=> "Alice"
irb(main):020> users[0].first_mama
(irb):20:in `<main>': undefined method `first_mama' for #<User:0x000000010cff3130 @first_name="Alice", @last_name="Ruby", @age=20> (NoMethodError)

users[0].first_mama
        ^^^^^^^^^^^
Did you mean?  first_name
	....
....
rb(main):021> users[0].first_name = "Carol"
(irb):21:in `<main>': undefined method `first_name=' for #<User:0x000000010cff3130 @first_name="Alice", @last_name="Ruby", @age=20> (NoMethodError)

users[0].first_name = "Carol"
        ^^^^^^^^^^^^^
Did you mean?  first_name
...
```
> Userクラスを導入すると、`タイプミスをした時にエラーが発生`します
...
`新しく属性（データ項目）を追加したり、内容を変更したりすることも防止`できます。

>クラスはこのように、内部のデータを保持し、さらに自分が保持しているデータを利用する独自のメソッドを持つことができます。`データとそのデータに関するメソッドが常にセット`になるので、クラスを使わない場合に比べてデータとメソッドが整理しやすくなります。
...
プログラムが大規模になればなるほど、データとメソッドを一緒に持ち運べるクラスのメリットが大きくなってきます

https://gihyo.jp/book/2017/978-4-7741-9397-7

# 感想
* クラスを作成することでデータの属性の追加、編集ができなくなる
* クラス内にメソッドを登録しておけば`.メソッド名`で呼び出せる

railsで開発してる時はクラスを作っていたんだな。
メソッドでエラーが出るのもクラスがあるおかげか。