2011-01-08 80 views
2

我在此之前發佈了幾個關於使用std::function而不是快速代理的問題,以及如何將std::function存儲在集合中以顯示可添加和刪除的事件的行爲。在編寫一整套小型的課程時,我還詢問了最佳實踐,並且這個小小的設計決定也已經得到了解決。這是一個偉大的社區!很多功能vs很多Lambdas?

現在,序言一邊,我必須有我的結構,現在是編寫所有處理傳入數據的處理程序的時候了。我有一個std::map,看起來像這樣:

typedef std::function<void(const CommandData&)> CommandDelegate; 
typedef boost::shared_ptr<CommandDelegate> CommandDelegatePtr; 
typedef std::map<short, CommandDelegatePtr> CommandMap; 

我想約200處理程序添加到這一點。我可以選擇標準成員函數和lambda表達式。

當我想到成員函數時,我首先想到的是200個聲明和200個實現以及一個大屁股源文件。

我並沒有用所有這些處理程序污染我的班級,我認爲「嗯,它們只是句柄,爲什麼不使用lambdas?似乎很簡單,當構建類時它可以將所有這些匿名函數分配給地圖。完成任務!

然後我意識到構造將是巨大的。我可以稱之爲「initializeMap`輔助函數可以想見,走在它自己的文件,因爲大小。

你們覺得呢?

  1. 200報價.h文件,200個實現(除其他功能)在cpp文件
  2. 200聲明在.h文件,單獨的「handlers.cpp`實現文件
  3. 沒有聲明,分配在構造函數200層的lambda
  4. 否聲明,在其自己的文件中分配了initializeMap函數中的200個lambda表達式。

在此先感謝!

回答

2

我的意見是,儘可能使用lambda。他們更易於維護。例如,如果您有成員函數,則每次更改時都必須更新聲明和定義,並且還必須爲其指定唯一的名稱。蘭姆達斯是最好的選擇。如果我可以對成員變量進行自動類型推演,我就不會使用成員函數。

1

你真的需要這些功能是動態的嗎?因爲如果你唯一的擔心是不污染你的主類,那麼有更好的(更快的)解決方案,比如做一個子類,或者把所有的代碼分成多個文件。

如果你有200個函數的標題,但永遠不會改變,它不會讓你的項目膨脹得太多,因爲它只是躺在那裏。另一方面,臃腫的構造函數更糟糕,因爲您有更高的機會需要在某個時間更改它,然後它將不得不重新編譯所有這些200個初始化。

編譯時間可能不會那麼長,但爲什麼要麻煩呢?

我只是將它們的聲明保存在主類或其他專用類或文件中,但不能在ctor中動態生成它們。

+0

不確定你的意思是'動態'...數據是用代碼進來的,並且必須調用該代碼的適當處理程序,因此具有`std :: function`的地圖。如果這不是動態的意思,你是什麼意思? – 2011-01-08 14:22:29

+0

我只是指lambda函數。對不起,如果我不清楚。 – Cray 2011-01-08 14:26:00