⚙️

OOP(オブジェクト指向プログラミング)について

2024/06/19に公開

OOP(Object Oriented Programming)とは

OOPとは、処理をコンポーネントとして組み合わせることで1つのプログラムを作る考え方。

オブジェクトとして処理をコンポーネント化し、ソフトウェア開発を行うため、コードの可読性・再利用性があがることで影響範囲の特定が容易になるかつ、修正も一部分だけで良い。
結果的に、保守性や拡張性が上がる。

抽象化について

Absutraction(抽象化)
ひとつのアプリケーションにある機能を細かく区別し、処理をコンポーネント化すること。

例では、足し算をsum.dartに分けて、管理している。
足し算に関わる変数とメソッドをクラスにまとめらることで、main.dart内のコードは見やすくなる。

main.dart
import 'sum.dart';

void main() { 
  int num1 = 3;
  int num2 = 3;
  
  var callsum = Sum(num1:num1,num2:num2);
  print(callsum.result());
}
sum.dart
class Sum{
  Sum({required this.num1,required this.num2});
  
  int num1;
  int num2;
  
  int result () => num1 + num2;
}

OOPの三大要素

encapsulation(カプセル化)

コンポーネント化したクラスの内部データを外側から隠蔽して、メソッドを通じてのみアクセスを許可させる概念。

例では、list.dartにコンポーネント化したNumbersListのデータ(numbers)が書き換えられていることが分かる。numbers変数をパブリック変数として呼び出せるためだ。

main.dart
import 'list.dart';

void main() { 
  var list = NumbersList();
  // 3
  print(list.numbers[2]);
  list.numbers[2] = 7;
  // 7
  print(list.numbers[2]);
}
list.dart
class NumbersList{
  List<int> numbers = [1,2,3,4,5];
}

NumbersListクラスの変数を_numbersとして、プライベート変数にすることでメソッドを通さないと、データにはアクセスできない。

main.dart
import 'list.dart';

void main() { 
  var list = NumbersList();
  print(list.number(3));
}
list.dart
class NumbersList{
  List<int> _numbers = [1,2,3,4,5];

  int number (int i) {
    return _numbers[i];
  }
}

inheritance(継承)

Humanクラスのメソッド、プロパティをMonkeyクラスで使えるようにする。

main.dart
void main() { 
  Human me = Human();
  Monkey george = Monkey();
  me.talk();
  george.talk();
}

class Human {
  double height = 15;
  int age = 0;

  void talk () {
    print("hello");
  }
}

class Monkey extends Human {
}

polymorphism(多態性)

継承したクラスと同じデータタイプのインスタンス変数に入れることができる。

  • 呼び出される(サブルーチン)でメソッドやプロパティの修正があったとしても、呼び出す側(メインルーチン)を修正する必要はない。
main.dart
void main() {
  Person tom = Person();
  Person george = Monkey();
  tom.greeting();
  george.greeting();
}

class Person {
  
  void greeting() {
    print("hello");
  }
}

class Monkey extends Person {
  
}

また、継承した親クラスのプロパティやメソッドを上書きできる。
子クラスのメソッド内で親クラスのメソッドを呼び出すこともできる。

main.dart
void main() {
  SuperMan me = SuperMan();
  // 100
  print(me.age);
  // hello
  // hi
  me.talking("hi");
}

class Human {
  double height = 170;
  int age = 20;

  void talk () {
    print("hello");
  }
}

class SuperMan extends Human {
  
  int age = 100; 
  void talking (String text) {
    super.talk();
    print(text);
  }
}

Discussion