オブジェクト指向の理解と実践

## 始めに
社会人1年目を乗り切る前に、初めてQiitaを投稿します。

新卒1年目、現場で使用するJavaの基礎体力をつけるため、とにかく資格をと思い、
Java BronzeとJava Silverを受験し、どちらも無事合格しました。
ですが、参考書を利用し勉強を行う中で「オブジェクト指向」のチャプターだけ避け続けてきました。


第一印象で苦手だと感じると、その印象を拭うのに時間がかかる性格なこともあり、
「オブジェクト指向」というワードが出てくると『はいはい、捨て問ね』と勝手に決めつけ、40ページほどスキップする、そんな勉強をしていました。
運良く資格勉強では障壁になりませんでしたが、現場で働く際、
メンバーと共通の考え方を持つために、「オブジェクト指向」を身につけることはマストだということに気づいたため、今回は苦手克服を目的として執筆しようと思います。

### この記事の対象者
- 新卒1年目～2年目エンジニアの方
- Javaの学習を始めた方
- オブジェクト指向から逃げようとした私

### この記事で伝えること
- Javaを用いたオブジェクト指向について理解する
- オブジェクト指向を普段の業務でどのように実践するか整理する

## 背景
まずわからないことは調べるのが鉄則。「オブジェクト指向」でググります。
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91)では以下のように説明されています。

>データとプロセスを個別に扱わずに、双方を一体化したオブジェクトを基礎要素にし、メッセージと形容されるオブジェクト間の相互作用を重視して、ソフトウェア全体を構築しようとする考え方がオブジェクト指向である。

この説明が私をオブジェクト指向の理解から遠ざけた悪の根源です。


オブジェクト指向を理解して、自分の技術力に落とし込めなければ意味がないため、
今回は2冊の本を参考に、私がいつ見返しても困らない、やさしい理解と実践方法を以下の章でまとめていきたいと思います。

## オブジェクト指向 理解
### オブジェクト指向
オブジェクト指向とは、ソフトウェアを効率的、かつ楽に開発・拡張・保守するために生み出された考え方のことです。

もう少し具体的に落とし込むと、ソースコードにて正常に動作する「部品」を多数用意し、それらを柔軟に組み合わせて、ソフトウェア構築をしていくという考え方となります。
### メリット
オブジェクト指向を取り入れるメリットとしては以下を挙げることができます。

現実世界の認識をそのまま活用するため、役割分担が明確になる
容易に転用ができるため、コードの重複や散在を防ぐ
修正箇所を限定的にすることができ、影響を狭い範囲に絞れる

一つずつ簡単に見ていきます。

1. **現実世界の認識をそのまま活用するため、役割分担が明確になる**
従来の考え方はコンピュータで表現したいことを順序立てて整理した上で完成形を独立して作成していましたが、オブジェクト指向で開発を行う際は、登場人物や物など役割分担を明確にすることを一番に求めます。
役割を明確にすることで、手続き全てを追わずに「何がどうなっているのか」を知ることができ、システムの全体像を容易に把握できるようになります。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687609/bf25ee96-2765-59e8-21fd-fe3ca8b0d95c.png)



2. **容易に転用ができるため、コードの重複や散在を防ぐ**
1.に挙げたように役割が明確であるが故、土台が自ずと固まります。
この土台をコピーして同じコードを重複させるのではなく、オブジェクト指向ではコードを展開することに重きを置くため、応用が簡単にできるようになります。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687609/10372226-7c22-0085-9d6a-9d7b600c3540.png)



3. **修正箇所を限定的にすることができ、影響を狭い範囲に絞れる**
狭い範囲で役割を明確にするオブジェクト指向は、いざ変更を加えようとした際に、変更箇所が散らばっていたり、予想外の副作用を引き起こしたりという事態に陥りません。
膨大なソースコードの中に修正箇所が散らばっていれば、少量の修正であっても修正漏れを生む可能性がありますが、オブジェクト指向では未然に防ぐことが可能です。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687609/70c7c81d-9851-9af8-a7c3-ac3d90e57e01.png)



以上3点のメリットを押さえ、オブジェクト指向がどのような考え方なのかわかったところで、次に何を実践すればオブジェクト指向を定着させることができるのかまとめていきます。
## オブジェクト指向 実践
### 既存ソースコードを改善しながら学ぶ
システムの規模が膨大になり、修正や拡張が繰り返される複雑なプログラムを相手にオブジェクト指向設計を学ぶのは、日々の開発・改修で少しずつ始められる実践的な学習方法です。
- 重複したコードをメソッドに抽出する
- 小さなクラスに分解する
- 小さなクラスを束ねるクラスを追加する  

オブジェクト指向は、事前に設計を固定するアプローチ方法ではないからこそ、部分的に少しずつ上記3つの観点でリファクタリングを行ってみましょう。

重複したコードをメソッドとして抽出する、そのひと手間がコードを読みやすくし、変更しやすくします。
また、小さなクラスに分解した後も、さらに小さくすることはできないか、組み立てやすい部品に改良することはできないか、繰り返し考えることが大切です。
時には、分解した小さな部品を束ねる視点を持つことも必要です。

開発の過程で、より良い部品を見つけることや既存部品をより使いやすく改善し続けることが、オブジェクト指向を定着させる近道となります。
### 極端なコーディング規則を用いてオブジェクト指向らしい設計を定着させる
リファクタリングと並び、実際のコードを特殊なルールに沿って書き換えることも実践的な学習方法として挙げることができます。
- 1つのメソッドのインデントは1つまで
- 1行につきドットは1つまで

インデントは1つの処理単位です。1つ目のインデントより深い処理をメソッドに抽出するルールを設けることで、部品化していく思考、発想を養うことができます。
また、ドットを多用して複数のメソッドを連ねたコードは、他の箇所で再利用できないことから、同じ処理が重複して書かれる原因となります。
説明用の変数などを用意して意図を明確にした処理を独立させて、コードの再利用の機会を創出していきましょう。

## 最後に
今回は2冊の参考書からオブジェクト指向について学んだことをまとめてみました。
システム開発を行う上で、
- なぜオブジェクト指向を押さえなくてはいけないのか
- オブジェクト指向に則って開発を行わないとどんな事態を引き起こしてしまうのか

について理解できたと思います。

今後業務を行う上で、
自分が今できる実践方法を意識しながら、オブジェクト指向を自分のものにしていきたいと思います。

## 参考文献
- [なぜ,あなたはJavaでオブジェクト指向開発ができないのか~Javaの壁を克服する実践トレーニング](https://amzn.asia/d/2gzXUfB)
- [現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法](https://amzn.asia/d/fcXjXv1)