2013年11月21日 (木)抽象と曖昧は似てるようで全く違う
おはようございます。
先日、コンビニで1000円札を支払って買い物をしたところ、
「おつりとレシートです」と言いながらおつりと1000円札を渡された本日の当番。
プログラマーのS.Kです。
※1000円札はちゃんと店員に返しました。
さて今回のブログですが『抽象化』について書いていこうと思います。
C++等のオブジェクト指向のプログラム言語での『抽象化』とは
大雑把に言うとインターフェイスと実際の動作を分けて記述する事です。
※厳密な内容はWebで検索!
例えば抽象化によって下記のような実装が出来ます。
class ICharacterBase
{
public:
virtual int GetHp(void) = 0;
};
class CCharacter1 : public ICharacterBase
{
int GetHp(void){ return 5; }
};
class CCharacter2 : public ICharacterBase
{
int GetHp(void){ return 10; }
};
void Test(void)
{
ICharacterBase* pCharactor1;
ICharacterBase* pCharactor2;
pCharactor1 = new CCharacter1;
pCharactor2 = new CCharacter2;
printf("Charactor1 HP:%d\n", pCharactor1->GetHp());
printf("Charactor2 HP:%d\n", pCharactor2->GetHp());
//=====結果=====
//Charactor1 HP:5
//Charactor2 HP:10
//==============
delete pCharactor1;
delete pCharactor2;
}
といった感じにインターフェイスは同一のままで
各キャラクター毎の挙動や設定を変更して制御する事も出来ます。
他にも便利な使い方としてはハード依存の処理のラッピングも出来ます。
例えばファイル読み込みでは下記のようなインターフェイスを作成しておき
読み込みを行う箇所ではインターフェイスを使用して実装します。
class IFile
{
virtual bool Open(char* pPath) = 0;
virtual void Close(void) = 0;
virtual int Reading(void* pBuffer, int uiSize) = 0;
virtual int GetSize(void) = 0;
};
void Test()
{
IFile* pFile;
#ifdef _WINDOWS
// Windows用に実装したファイル読み込みクラスを生成
pFile = new CFileWindows;
#else
~ ハード毎に実装したクラスを生成 ~
#endif
if( pFile->Open("test.txt") )
{
int iSize = pFile->GetSize();
void* pBuffer = malloc(iSize);
pFile->Reading(pBuffer, iSize);
~ データの解析等の処理 ~
pFile->Close();
}
delete pFile;
}
こういった形で実装を行うと各ハードでの実装の差を減らす事が出来るので、
移植等が必要な際に掛かる負担を軽減する事が出来ます。
場合によってはハード依存の処理が必要になる事もあるので
必ずしも対応出来るという訳ではありませんが、
こういった手法が約に立つ場面は多々あります。
※仮想関数の呼び出しはオーバーヘッドが大きくなるので注意が必要です。
又、ハードに合わせた最適化等が難しくなるといったデメリットもあります。
C++等のプログラム言語を使用している人であれば
既に知っている人が多いとは思いますが、
もし使った事がなかったり使いどころが分からないって人は
調べて色々と試してみて下さい!
| 固定リンク | コメント (0) | トラックバック (0)
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
この記事へのコメントは終了しました。
コメント