オブジェクト指向プログラミングは逆転の発想から生まれた
オブジェクト指向プログラミングが生まれる前には、構造化プログラミングの時代でした。構造化プログラミングは、関数(機能)を視点においてプログラミングをしていました。C言語でプログラミングしてみると、その世界が体験できます。
#include
struct Foo
{
int value;
};
void Add( struct Foo* a, struct Foo b )
{
a->value += b.value;
}
int main()
{
struct Foo a, b;
a.value = 1;
b.value = 2;
printf( "加算前の値;%d\n", a.value );
Add( &a, b );
printf( "加算後の値;%d\n", a.value );
return 0;
}
Add関数にFoo構造体を渡して計算しています。これは関数(機能)を主眼に置いているので、関数視点のプログラミングです(※関数型プログラミングの話しではありません)この時代の構造化プログラミングは、データと関数が別々のものでした。従って大規模になると、大量のデータと関数が必要になり、管理と集団作業が難しい状態でした。今度は、C++によるオブジェクト指向プログラミングの例を見てみましょう。
#include <iostream>
class Foo
{
private:
int value;
public:
void SetValue( int value )
{
this->value = value;
}
int GetValue() const
{
return this->value;
}
void Add( Foo b )
{
this->value += b.value;
}
};
int main()
{
Foo a, b;
a.SetValue( 1 );
b.SetValue( 2 );
std::cout << "加算前の値;" << a.GetValue() << std::endl;
a.Add( b );
std::cout << "加算前の値;" << a.GetValue() << std::endl;
return 0;
}
今度はデータの方に注目して、プログラミングをしている事が分かると思います。変数を自由に触れないので、プログラムの行数が増えます。ですが、変数に直接触る事による弊害の方が多いので問題になりません。また、関数がデータに付属しており、管理と集団作業が構造化プログラミングよりも簡単になりました。以上の様に、視点を変えると新しいものが見える事があります。関数とデータの立場を逆転した事により、新しいプログラミングパラダイムが生まれました。オブジェクト指向プログラミング見れば、見方を変える事は大変重要だという事が分かります。また歴史を知っておけば、よりプログラミングが面白くなると思います。