ドラゴンボールで学ぶオブジェクト指向
はじめに
こんにちは!たかっちと申します。
今回はドラゴンボールからオブジェクト指向について理解しようという
記事を書こうと思います。
今回記事を書こうと思ったきっかけですが、組み込みエンジニアを
やっている同僚がJavaをやりだしたのを機に
オブジェクト指向とはなんぞや?というところを
大好きなドラゴンボール(以下DBで略します)で初学者向けに
ざっくり理解しようではないか!というのがきっかけです
オブジェクト指向ってなあに?
オブジェクト指向(OOP:Object Oriented Programming)とは、ソフトウェア開発の考え方のひとつで「処理を部品化して、部品を組み合わせることで1つのプログラムを作る考え方」のことを指します。
人がシステム開発を効率的に行うために、多くの言語で取り入れられている概念です。
プログラミング言語としては、Java、C++が有名ですね。
オブジェクト指向を使うことによって、共通の処理を再利用・転用して開発作業を効率化できる上に、プログラムを管理しやすくなるので複雑な処理を行うプログラムの構築も容易に
できるというメリットがあります!!!
オブジェクト指向を理解する上で必要な概念とは
1.オブジェクト
これはITの世界では属性(フィールドとも呼ばれる)とメソッドという2つの要素を持った
モノを指します。属性とはそのオブジェクトにどんな特徴があるかという
情報を表したデータを指します。メソッドとは、データに対する処理内容を記述したプログラムで、何かしらの指示があった時にどう動くかといった動作・ふるまいを指します。
例として天津飯で属性とメゾットを学びましょう
天津飯オブジェクトの属性として
- 武道家
- 3つ目
- 頭がつるつる(他にもおるやろがい!ってツッコミはなしで!)
メソッドとしては
- 空を飛ぶ
- 戦う
- 回避する
というような感じです!
2.クラス
クラスとは、オブジェクトのもつ性質ごとに分類することを指します。
よく解説では「設計図」で説明されることが多いです。
クラス分けをすることで、全体からそのオブジェクトの位置づけが明確になり、
ほかのオブジェクトとはどの性質が共通していてどの点で異なっているのかはっきり理解する
事ができるようになります。
例として次はベジータで紹介しましょう!
ベジータクラスは、おおまかな分類では惑星ベジータ出身のサイヤ人ですが
具体化するとベジータという人になります!
サイヤ人というカテゴリの中にベジータという人がいるって感じですね!
クリリンはおおまかな分類では地球人で具体化するとクリリンという人になります!
Z戦士としては共通してますが、地球人とサイヤ人としては異なっています。
つまり何が言いたいのかというと、サイヤ人や地球人という抽象的なオブジェクトを定義して
分類したもの=「クラス」だと思って頂ければと思います。
3.インスタンス
インスタンスとは、実体のない設計図から具体的なモノを作り出す作業の
ことを指します。DBではドクターゲロが作った16号で説明しようと思います。
ドクターゲロは設計図を基に、16号という実体のある人造人間を作成したとします。
設計書だけではなにもできないですが、設計図を基に16号インスタンスを生成して
悟空を倒しに行く人造人間ができあがります。
つまりクラス=設計図で、インスタンス=設計図を元に作られた実体というわけです。
クラスの説明ででてきたベジータやクリリンは、サイヤ人や地球人という抽象オブジェクト
をインスタンス化して具体化したオブジェクトなのでなんとなく
インスタンスのイメージはつかめたのではないでしょうか?
オブジェクト指向の三原則を理解しようではないか!
1.継承
オブジェクト指向といえばっていったら真っ先に継承だよね!
っていうエンジニアが多いはず!っていう事で次は悟空と悟飯で継承をお勉強しましょう!
悟空は親クラス、悟飯は子クラスとして入れ子の関係を持ちます。
継承の最大のメリットとして親クラスの 属性とメソッドが
継承関係のある子クラスに引き継がれます。
なので親クラスで悟空のかめはめ波を子クラスの悟飯もかめはめ波を引き継ぐことができる
ので、同じような機能を持つクラスであれば新たにコードを書く必要がなくなります。
具体的な使い方については下記を参照してくれよな!
2.ポリモーフィズム(多態性)
「同じ名前の機能で、全く違う動きをする処理を実装すること」
だと思ってもらったらいいと思ってます。
オーバライドとオーバーロードが多態性を理解するうえで大事です
次はサイバイマンで多態性を理解しましょう
まずオーバーライドはスーパーサイバイマンAとサブサイバイマンBで
同じAttackメソッド使いたいが、サブサイバイマンBの
攻撃のダメージを変更したいなどのケースに有効です。
Attackメソッドという継承関係で同じメソッドでも
新たに作成したサブサイバイマンBはAttackメソッドを上書きすることができます。
こうすることで、1ダメージでも1000ダメージでも書き換えられるんで
使ってみると便利です。
使い方はこちらのサイトを参照してみるとわかりやすいかも…
3.カプセル化
オブジェクト内のデータをカプセルのように閉じ込めて、外部からアクセスできないように
することで、外部からオブジェクトの中身を自由に操作することを防ぐことができます。
それを動かすのには、専用のメソッドを用意する必要があります。
例として「宇宙の帝王」フリーザ様でカプセル化を紐解いていきましょう…
さあ、行きますよ。ドドリアさん、ザーボンさん!!!
カプセル化の最大の利点はオブジェクトの内部情報を隠蔽し、
外部からのアクセスを制御することにあります。
なのでなんでもかんでも公開してしまうと、フリーザオブジェクトの属性や
メソッドを外部から書き換えられてしまってデスビームが撃てないフリーザ様、
戦闘力が5のフリーザ様などフリーザ様の威厳が損なわれてしまいます…
そこでアクセス修飾子をつかいます。
アクセス修飾子を適切に使うことで、デスビームが撃てるフリーザ様、戦闘力が
53万のフリーザ様と威厳のある悪の帝王フリーザ様という
外部から書き換えられる事のないフリーザオブジェクトになります。
次に、getterメソッド、setterメソッドを使う事で
外部からフィールド(クラスの中でデータの値を保管するために使用するもの)
の値を直接読み書きされることを防ぐことができます。
getterメソッドは、外部からフィールドの値を取得したい時
setterメソッドを呼び出す際は設定したい値を引数として渡して
フィールドに代入することで、フィールド操作ができるって感じです。
詳しくは下記のサイトを参照してください。
さいごに
長々とお付き合いいただきありがとうございました。
今回はオブジェクトについてでしたがいかがでしたでしょうか?
オブジェクト指向にはメリットもあればデメリットもあります。
メリットは
- 記述するコードの量が少なく変更に対応しやすい
- プログラムを効率よく作ることができる
- 不具合が起きたときに対処が容易
デメリットは
- 設計の工程に時間がかかる。
- 再利用する場合、難易度が高い。
- 継承関係で親クラスを消したことで子クラスが動かなくなる(主の仕事先であった実話)
自分も仕事でJavaに携わる事があるのですが、まだまだ理解したとは
程遠いとは思っています。
ですが、自分なりになにかに例えて
理解する事でより理解が進むものだと思っています。
最後までお読みいただき、ありがとうございました
Discussion
自分もドラゴンボール好きです!そしてとても分かりやすく勉強になりました!
特に、ポリモーフィズムをサイバイマンで例える点が印象に残りました(セルジュニアもポリモーフィズムに該当するんでしょうか?笑)
Takeさん コメントありがとうございます!
そうですねむしろポリモーフィズムでセルとセルジュニアのが
継承関係もあってオーバーライドの説明しやすいなって思いました(笑)
※その発想がなかったですw素晴らしい着眼点だと思います
ご回答いただき誠にありがとうございます!
大変勉強になりました!🙌
また機会がございましたら何卒よろしくお願いいたします。