Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

本日見かけた酷いコード7

タグ: C++ 酷いコード
class ImplBase
{
public:
	virtual ~ImplBase();
	
	virtual void func1() = 0;
	virtual void func2() = 0;
};
class ImplBase;

class InterfaceBase
{
public:
	virtual ~InterfaceBase();

	virtual void func1();
	virtual void func2();
	
protected:
	virtual ImplBase* GetImplBase() = 0;	
};
void InterfaceBase::func1()
{
	GetImplBase()->func1();
}

void InterfaceBase::func2()
{
	GetImplBase()->func2();
}

pimplのようなもの……かな。
InterfaceBase に関してはもっと良い設計がありそうなものだが、ここでは不問とする。

class Impl; // ImplBase を実装したクラス

class Interface
{
public:
	Interface();

	virtual void func1();
	virtual void func2();

protected:	
	virtual ImplBase* GetImplBase();
	virtual Impl* GetImpl();
	
private:
	Impl* m_impl;
};
Interface::Interface()
{
	m_impl = new Impl;
}

ImplBase* Interface::GetImplBase()
{
	return m_impl;
}

Impl* Interface::GetImpl()
{
	return m_impl;
}

void Interface::func1()
{
	GetImpl()->func1();
}

void Interface::func2()
{
	GetImpl()->func2();
}

Interface で func1() と func2() がオーバーライドされている。
だがこのコード、やっていることはオーバーライド元と同じでは?
まさか GetImplBase() と GetImpl() で返す値を変えるとか、そんな禍々しいことをするわけでもあるまいし。
どうして同じことを2回書くかな?2回書くかな?

この例ではメソッドを2つしか書いていないが、実際にはこのクラスには50以上のメソッドがあり、それらの多くがこの例同様無駄にオーバーライドされている(全てではない。違う挙動にオーバーライドされているものもある)。
そしてさらに、同じような設計のクラスはこれ以外にも何十セットと存在している。

まあパターンだから、確認自体は慣れればそれなりに手早く行えるようにはなる。
しかしこれを修正するとなるとかなり面倒で、インターフェースから修正する必要がある場合は4クラス全てに手を加えなければならない。

……むー、なんでこんな面倒なことになっているのだ?

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/63-1bd16952
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。