オブジェクト指向
-オブジェクト指向とOOP-

■オブジェクト指向

オブジェクト指向とはシステムをオブジェクト同士のやり取りによって
作り上げるための考え方のことです。
※オブジェクト同士のやり取りで渡される内容のことを
 メッセージやメッセージパッシングと呼びます。

●OOP(Object Oriented Programming
	OOPとはオブジェクト指向によるプログラミングを行うための
	プログラム方法のことです。
	OOPのために用意された概念や機能としてよく使用されているのが、
	「カプセル化」「継承」「多態性」です。

●OOPの考え方
	OOPはオブジェクトを中心として処理を実行していきます。
	例えば家電で商品を購入するという処理を考えた場合、
	オブジェクト主体と、それ以外の方法は以下のようになります。
	※OOP以外の方法として手続き型プログラミングで記述しています。

	OOP:
		class Kaden
		{
		public:
			static enum KADEN_ITEM
			{
				TV,
				PHONE,
				GAME,
				MAX,
			};

			void Buy(KADEN_ITEM item);
		};

		void Kaden::Buy(KADEN_ITEM item)
		{
			switch (item)
			{
			case TV:
				printf("TV買った\n");
				break;
			case PHONE:
				printf("電話買った\n");
				break;
			case GAME:
				printf("ゲーム買った\n");
				break;
			}
		}

		void main(void)
		{
			Kaden yodobashi;

			yodobashi.Buy(Kaden::KADEN_ITEM::TV);
			yodobashi.Buy(Kaden::GAME);
		}

		実行結果:
			TV買った
			ゲーム買った

	手続き型:
		enum KADEN_ITEM
		{
			TV,
			PHONE,
			GAME,
			MAX,
		};

		void Buy(KADEN_ITEM item)
		{
			switch (item)
			{
			case TV:
				printf("TV買った\n");
				break;
			case PHONE:
				printf("電話買った\n");
				break;
			case GAME:
				printf("ゲーム買った\n");
				break;
			}
		}

		void main(void)
		{
			Buy(PHONE);
			Buy(GAME);
		}

		実行結果:
			電話買った
			ゲーム買った

	上記の処理は両方とも「家電製品を購入する」という処理ですが
	以下の違いがあります。

		OOP:
			「オブジェクトに対して」買いたい製品を伝えた

		手続き型:
			「買うという処理に対して」買いたい製品を伝えた

	オブジェクトに対してか、処理に対してかの違いですが、
	システムを作るための設計を行う場合に大きな違いがでます。
	OOPでは情報(データ)や機能(処理)はオブジェクトの一部でしかなく、
	あくまで、主役はオブジェクトとして設計を行います。

■OOPの本質

●OOPの考え方
	OOPの考え方は人によってかなり異なります。

		例:
			システムを効率よく作るための方法
			大規模開発に適した開発方法
			クラスという部品を組み合わせてシステムを作る方法
			担当分けに優れた方法
			※自分はシステムを効率よく作るための方法派です。

	このようにOOPの考え方は十人十色です。
	ですが、これらの考え方について話しや記事などを聞いたり、見たりすると
	非常に納得できるものが多々あります。
	これらの考え方に対して自分の考えと違うからといって反発するのではなく
	柔軟に受け入れてOOPに対する視野を広げることが大切なのだと思います。

	pgtheory_0040

●OOPの本質
	OOPの本質は「コスト削減」にあります。
	上のOOPの考え方を使って「開発時間」か「保守時間」を削減できたら
	自分の考え方は正しいと思っていいと思います。
	もし、コストが膨れ上がるようなら考え方が少しずれているのかもしれません。
	(クライアントの無茶な要望によるコスト増は除きます)

	保守性:
		保守性とはシステムの維持や管理のしやすさのこと
		保守性が高いほどバグの発見や修正、新規機能の追加も行いやすい

●OOPの理想
	OOPの理想はオブジェクトが単体で1つの機能を有していて
	オブジェクトを1つインスタンス化するだけでその機能を実現できることです。
	そうすれば、別の仕様に対して再利用をする場合も簡単に利用することができ、
	仕様変更があったとしても、影響を受けるのがそのオブジェクトだけなので、
	メンテナンス性も優れています。
	しかし、現実問題そのようなオブジェクトを作成することは難しく、
	オブジェクトは他のクラスとつながりを作ることで機能することがほとんどです。

	・理想に近づける
		理想に近づくためにはオブジェクトの独立性を高める必要があります。
		独立性を高めるにはオブジェクト同士のつながりを浅くしなければいけません。
		つながりが深いほど、オブジェクトを使用する際のルールが増えて、
		修正の際には他のオブジェクトにも多くの影響を及ぼします。

		pgtheory_0041
		pgtheory_0042

		つながりを浅くするための方法としてよく利用されているのが	
		「カプセル化」「多態性」「継承」です。