实战经验:pimp技法实现面向接口编程

实战经验:pimp技法实现面向接口编程

作者:BlogUpdater |  时间:2018-07-15 |  浏览:3139 |  评论已关闭 条评论

在大型工程中,编译时依赖会逐渐成为一个问题。每当我们修改了组件的内部实现,都影响到了组件的客户,导致客户代码重新编译,这种情况对于大型工程往往是不可接受的,微软的COM技术尝试通过接口解决此问题,但是不足之处是:COM技术依赖注册表实现组件的定位,这大大限制了组件的跨平台能力。今天,我们来讲讲pimp技法,实现轻量级的面向接口编程。

示例代码

=====================MyComponent.h=====================
#pragma once
class CMyComponent
{
public:
	CMyComponent(void);
	~CMyComponent(void);
public:
	void DoSomething();
private:
	class CMyComponentImpl;
	CMyComponentImpl * m_impl;
};
=====================MyComponent.cpp=====================
#include "StdAfx.h"
#include "MyComponent.h"

class CMyComponent::CMyComponentImpl
{
public:
	CMyComponentImpl() {}
	~CMyComponentImpl() {}

public:
	void DoSomething() {printf("Do something\n");}
};

CMyComponent::CMyComponent(void)
	: m_impl(new CMyComponentImpl)
{
}
CMyComponent::~CMyComponent(void)
{
	delete m_impl;
}
void CMyComponent::DoSomething()
{
	m_impl->DoSomething();
}
=====================Main.cpp=====================
#include "stdafx.h"
#include "MyComponent.h"

int _tmain(int argc, _TCHAR* argv[])
{
	CMyComponent obj;
	obj.DoSomething();

	getchar();

	return 0;
}

代码解析
在以上示例代码中,我们定义了组件类CMyComponent,同时定义了私有嵌套类CMyComponentImpl,我们的对外接口DoSomething的实现代码被转发到了内部类CMyComponentImpl,这样做的实现的效果是:客户仅需要面向CMyComponent,而CMyComponent的实现被隔离到内部CMyComponentImpl类中。只要保持CMyComponent类的公共接口不变,则客户代码不需要重新编译。
例如,我们在内部实现中添加一个数据成员,此时虽然内部类的对象尺寸发生了变化,但是我们的客户却不需要重新编译。这种隔离措施,使我们的组件开发者可以随意改变组件的内部实现代码而不会影响到客户,这也是面向接口编程的精髓之处。

结论
1) 善用pimp技法,可以实现接口与实现隔离,防止客户代码的不必要重新编译。
2) pimp内部通过转发实现,有一定的运行时性能损失,但我们得到的却是代码的封装和可维护性。
3) 尽量在组件接口中避免声明数据成员,仅定义对外方法,给予组件实现者最大限度的更改自由。

标签:

评论已关闭。