作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] 新手關於 #include 的問題
時間Sat Apr 9 00:44:23 2011
: 我不是很清楚你的想法
: 這麼說好了,前文的 Header 大概如下
: // b.h
: class A;
: class B {
: A *obj_a;
: public:
: void do_something();
: A *do_something_with( A *a);
: };
: 你有幾點訴求
: 1) 效率
: 2) 可讀性
: 2.1) 典型的重複程式
: 2.2) 從介面來看, 傳址不改值 and 傳參考卻會改值, 呼叫端的閱讀也會不利
: 先看可讀性的 2.1 部分好了
: 以上的寫法就算在內部實作,也頂多像下面這樣
: void B::do_something() {
: obj_a->blah();
: }
: 如果你 B::obj_a 宣告成這樣:A obj_a;
: 那以上的實作便成為:
: void B::do_something() {
: obj_a.blah();
: }
: 對我來說是沒有什麼差別...
我的意思是指這裡雖然免除了引入 a.h, 到後來龜毛一點你可能更
進一步為了免除所有引入 b.h的client必須做的修改, 用了pimpl
idom, 類別 b的規格變成這樣:
-
// b.h
class A;
class Pimpl;
class B
{
Pimpl *objs;
public:
void do_something();
A *do_something_with( A *a);
};
-
// b.cpp
#include "b.h"
struct Pimpl
{
A a;
C c;
D *d;
// 更多成員 ...
};
// 其他實作碼
void B::do_something()
{
objs->c.method();
objs->d->method();
}
實作碼這時候就會變得複雜, 但是所減少的編譯成本還比你的方法
來得多
: 接下來 2.2 我有點不懂,傳址就會改值啊,當做你寫傳值的筆誤好了
: 你可以用簡單的方法處理掉這個問題,以上面的第二個 member function 來看
: 你只需要如下宣告,就很清楚
: const A *do_something( const A *a);
沒有筆誤, 假如你開發的類別長這樣:
class YourClass
{
void DoSomething( A
const *a );
void DoOtherThing( A &a );
};
而同事開發的類別:
class MyClass
{
void DoSomething( A
const &a );
void DoOtherThing( A *a );
};
然後在使用上:
A a;
YourClass yours;
MyClass mine;
yours.DoSomething( &a );
yours.DoOtherThing( a );
mine.DoSomething( a );
mine.DoOtherThing( &a );
然後我跟你說, 其實 DoSomething 只是將 a 當做 in parameter,
DoOtherThing 將 a 當做 out parameter, 而這些在方法名稱上都
看不出來, 下面的程式碼較為符合從C語言繼承下來的呼叫習慣.
: 好吧,最後談到效率
: 的確很多時候透過指標取值的效率會有點差異
: 但是或許還有另一點值得注意
: 就是複製整個複雜的 structure 遠比複製指標還慢
: 一般的情況下連 string 這種小東西都有人建議多使用 const string &s 取值了
這就像我說的
pointer to non-const & reference to const
遠比
pointer to const & reference to non-const
來得好, 不只有你開發端的地方要注意, 客戶的使用也要考慮進來
, 強迫客戶用 by reference 語法來傳遞引數, 以達成 by value
語意是相當不自然的.
但是你就算選擇了第一個方案, 還會面臨到介面在呼叫起來不方便
的問題, 引數一下要加 &一下又不用加(但比較建議).
你改到通通都不加也不是一件好事, 因為這樣就無法一眼就看出函
式的行為是何種, 還記得7 +- 2 法則嗎?你讓讀者背的東西愈多,
程式碼的品質也愈差.
: 而通常我們都能夠分辨哪些東西是夠小,夠常被存取的東西
: 哪些東西是很大,我們不常重複的存取整份資料的東西
: (Managed C++ 把它們分為 value class/ ref class)
: (或者你也可以用 struct 與 class 區分它們)
: 而就我的經驗,使用 pointer 的機會應該遠比直接存取變數情況要多得多
: 當然,那些情況使用 pointer 的效率比較好,程式碼也比較單純
: 尤其是在使用 vector 將你的 class 裝起來的時候
--
▂▅▂ ▁ ● ◣ 朴 ☆ 素 ★ 妍 ◢
◢ ◣ ◢▂▂◣ ◢▂※◣ ◢▄▂◣ T.T.L Listen 2
★ ★ ★ ★ ▉ ★ ★▏▉ ★ ★◣ http://ppt.cc/jIUk
◥ˇ◢ ▃◥ˇ◤▃ ◥ˇ◤ ◥ˇ◤◢ 說什麼結束
▃▃▇▃▃ ◢▇◣ ▋
▎ ▋¥▎ ◢ http://ppt.cc/zQtB
▼ ▼ ▼ ▼ ψ髮箍 ◤ ◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
推 legnaleurc:我覺得你舉的例子有點極端, 一般來說協作時其介面的風 04/09 01:24
→ legnaleurc:格不太可能會差那麼多, 除非真的只是個內部 helper 04/09 01:25
那也要有內部標準才行呀 XD
→ legnaleurc:那種問題其實跟 pimpl 沒關係吧 04/09 01:25
其實我一開始是回錯, 見笑了. 囧
※ 編輯: loveme00835 來自: 140.121.197.115 (04/09 01:27)