前言
此文章目前尚未整理完成,如需學習完整內容可參考隨附的 reference,或自行 google 搜尋
但因為作者要整理的筆記太多,如果想早點看到整理後的文章,可以下方留言「期待整理」之類的… 我會努力找時間優先整理!
pimpl 用途
pimpl 是一種程式設計的方式,pimpl 拆開來就是 pointer to implementation 的縮寫,
正如同「pointer to implementation」的名字,
我們把實作(implementation)從 class 中拆開,
並在原先的 class 宣告一個 pointer 指向實作方式。
為什麼要這樣設計?
首先我們要先把握一個概念「沒有一定最好的設計,只有最適合的設計」,
意思就是如果沒有必要,不需要硬套用設計模式,
這很有可能發生我們常說的「over design」。
不論是「poor design」、「over design」都是不好的情況,需要自己判斷最適當的使用。
pimpl 是把 class 本身的一些實作直接拆出來的方法,在程式架構還不夠複雜的時候基本沒有必要使用。
隱藏實作 (接口與實作的分離)
我們觀察下方的程式碼,因為我們把「原 MyClass foo() 實作部分」改成「用 impl 去拿位於 MyClassimpl 的 foo()」。
如果我們今天是開 API 給其他使用者,其他使用者只會看到 MyClass 的 foo(),而我們可以把 MyClassimpl 的 foo() 給隱藏起來。
而我們真正的實作都在 MyClassimpl 的 foo()
void foo(){
return impl -> foo();
};
降低耦合、更少的編譯時間
目前有點看不懂,先放著,改天想通再回來寫
範例程式碼
#include <iostream>
using namespace std;
class MyClassimpl{
public:
void foo(){
cout << "foo in MyClassimpl" << endl;
};
};
class MyClass{
public:
void foo(){
cout << "foo in MyClass" << endl;
return impl -> foo();
};
private:
// MyClassimpl* impl;
typedef unique_ptr<MyClassimpl> MyClassimplPtr;
MyClassimplPtr impl;
};
int main(){
MyClass obj;
obj.foo();
return 0;
}