よもやま話β版

よもやま話を書きます。内容はぺらぺら。自由に書く。

オブジェクト指向を説明したくてMemoについて考えてみた

オブジェクト指向を説明しようとして、Memoについて考えてみた。(Ruby)

例えば メモアプリで 1つのメモをMemo、全てのメモのまとまりをMemoListとして管理するときは、次のように表現できそう。 Memoは通し番号(id)と内容(content)を持っているものとし、MemoListはそれらを取りまとめる役割を担っている。

class Memo
    attr_accessor :id, :content
    def initialize(id, content)
        @id = id
        @content = content
    end
end

class MemoList
    def initialize
        @memos = []
    end
    
    def add(memo)
        @memos << memo
    end
    
    def find(id)
        @memos.find {|memo| memo.id == id }
    end
end

memo_list = MemoList.new
memo_list.add(Memo.new(1, "1番目のメモ"))
memo_list.add(Memo.new(2, "2番目のメモ"))
memo_list.add(Memo.new(3, "3番目のメモ"))

third_memo = memo_list.find(3)
third_memo.content #=> "3番目のメモ"

オブジェクト化しておくことで、メモに対する機能を増やしたいときは、class Memo にメソッドを生やすとさっと実現できる。 例えば memoの文字数を知る機能をつけたい時は、次のようにすると memo.length を使えるようになる。

class Memo
    # ...省略...
    def length
        @content.length
    end
end

他に、全てのメモの文字数の合計を把握したいとき、それはMemoListの仕事と考えて次のようにしてみた。

class MemoList
    # ...省略...
    def all_length
        @memos.sum {|memo| memo.length }
    end
end

こんな感じで、〇〇をやりたいときは誰(どの"モノ")にやらせるのか考えつつ機能を生やす。 今回のイメージとしては、次のような感覚で考えていた。

  • Memo → ペラ1枚の紙としての "モノ"
  • MemoList → 紙束としてまとまった "モノ" (ブロックメモとして売ってるね)

他にも動物とかで継承の考え方を示してみたいけど、一旦また今度にしよう。