Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby応用 | 抽象データと継承

パンくず

Ruby応用
抽象データと継承

概要

抽象データと継承について

複雑さ

システム開発は複雑な問題をプログラムで扱います。
旧来のプログラム言語は記述の難度が高く、人間に取って理解するのが難しいものでした。

進化の過程

プログラム言語は以下のような変遷を辿っています。

GoTo文による制御
↓順序、反復、分岐、サブルーチンを利用可能になり処理構造が理解しやすくなった
構造化プログラミング
↓クラス、インスタンスメソッドによりデータと振る舞いが現実の事象と近くなり理解しやすくなった
オブジェクト指向

クラス

システム開発における重複は大きなリスクを産みます。
オブジェクト指向のクラスは似た機能を抽象化し、共有することで重複を排除します。

Programmerを扱う処理があるとします。
さまざまなプログラマーが存在しますが、手続き型処理では都度Programmerを扱う処理・データを個別にコーディングしていました。
オブジェクト指向では共通の処理・データはひな形としてクラスにします。
個別の処理やデータの違いはクラスから生成する具象=インスタンスで管理します。

例えばProgrammerに田中さんと鈴木さんがいれば

class Programmer
  attr_accessor:name

  def initialize(name)
    @name=name
  end
end

tanaka = Programmer.new("tanaka")
suzuki = Programmer.new("suzuki")

puts tanaka.name
puts suzuki.name

のように。

継承

さらにJavaProgrammerを扱う処理とRubyProgrammerを扱う処理が必要になった場合、
Programmerクラスを継承してJavaProgrammerクラス、RubyProgrammerクラスを作成することで
Programmerとしての共通の振る舞いやデータは親クラス(基底クラス)であるProgrammerクラスが受け持ち
JavaProgrammerやRubyProgrammer特有の振る舞いやデータについては子クラスで受け持つことで
冗長な処理を排除することができます。

class Programmer
  attr_accessor:name

  def initialize(name)
    @name=name
  end

  def coding()
    puts "コーディング"
  end
end

class JavaProgrammer
  def coding()
    puts "Javaでコーディング"
  end
end

class RubyProgrammer
  def coding()
    puts "Rubyでコーディング"
  end
end

programmers = [JavaProgrammer.new,RubyProgrammer.new]
programmers.each {|programmer| programmer.coding}