神戸プログラミングアカデミーのブログ

「未経験から」「スキルアップ」「起業を目指す」無料で学べる神戸のプログラミング学校&学習コミュニティ

オブジェクト指向とは?

オブジェクト指向とは?

いっぱい記事を読んで、本を読んで。楽しんで、学びましょう。

qiita.com

qiita.com

なぜオブジェクト指向で書くのか?それは、予め頻繁に変更されるであろう箇所をクラスに抽出することで、システムが変更に対して柔軟に対応できるようにするためなのです。

これな。

一回読んで理解できる記事はない。いっぱい実践していっぱい調べて身につけていってください。

オブジェクト指向のキーワード

キーワード 意味
Class オブジェクトの設計図
オブジェクト(インスタンス) クラスから生成された実態
継承 元のクラスのプロパティやメソッドを引き継いで自分でカスタマイズできる
オーバーライド 継承元の元クラスもメソッドを上書きすること
インターフェース 抽象クラス。インスタンス化することはできない
implements 抽象クラスを実装すること
コンストラク クラスが生成されるときに呼び出されるメソッド
デストラク クラスが破棄されるときに呼び出されるメソッド

具体例

// インターフェース(仕様を決める設計図)
// インターフェースにはプロパティを持つことはできない。(メソッドの定義だけ)
interface IPerson {
  getFullName(): string
}

// インターフェースIPersonを実装
// プロパティに名字・名前を持つ
class Person implements IPerson {
  protected firstName: string;  // プロパティは分かりやすい命名規則があったりなかったり。
  protected familyName: string;
  //インスタンス化するとcounstructor()が実行される
  constructor(familyName: string, firstName: string) {
    this.familyName = familyName;
    this.firstName = firstName;
  }
  getFullName(): string {
    return `${this.familyName} ${this.firstName} さん`
  }
}

// Personを継承
// getFullNameをオーバーライド
class Girl extends Person {
  getFullName(): string {
    return `${this.familyName} ${this.firstName} ちゃん`
  }
}
// Personを継承
// getFullNameをオーバーライド
class Boy extends Person {
  getFullName(): string {
    return `${this.familyName} ${this.firstName} くん`
  }
}

// new クラス名() でインスタンス化できる
const people: Array<IPerson> = []
people.push(new Girl('伊藤', '凛'))
people.push(new Person('佐藤', '蓮'))
people.push(new Person('鈴木', '樹'))
people.push(new Boy('高橋', '律'))
people.push(new Girl('田中', '結菜'))
people.push(new Person('渡辺', '芽依'))
people.push(new Person('山本', '大翔'))
people.push(new Girl('中村', '莉子'))
people.push(new Boy('小林', '大翔'))
people.push(new Person('加藤', '楓'))

// 共通のインターフェースを持っているので、ループで回せる(多態性)
for (let i = 0; i < people.length; i++) {
  console.log(people[i].getFullName())
}

多態性の必要性

プリンタで文字を印刷するプログラムを作ってください。

f:id:prog-ac:20200602124135p:plain

具体的実装(Not 抽象的)
function print(str){
  printer = GetCurrentPrinter()
  if( printer == "CANON-MG7730" ){
    ゴニョゴニョゴニョ  
  }else if( printer == "EPSON-カラリオ808A" ){
    ゴニョゴニョゴニョ  
  }else  if( printer == "CANON-MG7730" ){
    ゴニョゴニョゴニョ  
  }else if( printer == "ブラザー-J963N" ){
    ゴニョゴニョゴニョ  
  }else if( printer == "CANON-MG3688" ){
    ゴニョゴニョゴニョ  
  }else if( printer == "EPSON-708A" ){
    ゴニョゴニョゴニョ  
  }
}

よし!できた!市場にリリースだ!!!

f:id:prog-ac:20200602124351p:plain

リリース1週間後…

新しいプリンターが発売しました。

f:id:prog-ac:20200602124434p:plain

え、新しいプリンタには対応していません。

抽象化設計

  • アプリ→OS
API用意しておくから、印刷したかったら、この関数に情報突っ込んで呼んでね
  • OS→ドライバ(プリンタメーカーの実装)
アプリから印刷命令受けたら、こういう情報を渡すから、新しいプリンタ発売するときは、ドライバ実装して配布してね。

抽象化設計の例題集

qiita.com