パンくず
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}