比方說,我有一個靜態方法,比較兩個對象的近距離匹配並返回一些置信度[0,1]。如何從一個方法返回可選的調試信息?
class Foo
{
...
static double Compare(const Foo& foo1, const Foo& foo2);
...
};
現在我需要返回一個包含具體取決於配置的設置比較細節的其他調試信息。 由於此調試信息不會在生產中使用,但僅用於測試/調試目的,我想知道實現它的適當方式是什麼。
我看到至少有三個選項:
1:創建一個附加的類CompareResult和存儲信心+可選信息存在。如果您不需要,請不要填充可選信息。
class CompareResult
{
...
private:
double confidence_;
CompareOptionalInfo compare_optional_info_;
...
};
...
static CompareResult Compare(const Foo& foo1, const Foo& foo2);
它似乎是最乾淨的一個,但我不確定是否應該將返回結果與可選信息結合使用。
2:使用輸出變量(這樣,我們將不再需要創建一個額外的類,但我們的方法簽名將增長一點)
static double Compare(const Foo& foo1, const Foo& foo2, CompareOptionalInfo* out_compare_info = nullptr);
3:單獨的比較方法可選,信息檢索方法。
static double Compare(const Foo& foo1, const Foo& foo2);
static CompareOptionalInfo GetCompareOptionalInfo();
此選項可能會需要存儲方法調用之間的可選-信息,並從靜態轉向比較方法的實例進行比較的方法。 但是,我不確定它是否合適。
從您的經驗來看,OOP世界中從方法返回可選信息(大多隻用於調試模式)的適當方式是什麼?
您打算使用調試器還是僅在調試模式下打印附加信息?如果你想使用gdb並使用像'call Foo :: compare(foo1,foo2)'這樣的命令,你將不能夠詢問選項1的'compare_optional_info_'。 – Franck
你是否打算在調試模式下將生產代碼構建爲測試,還是你在使用單獨的測試程序? – Peter
這將是一個基於意見的問題(不是真正的主題)。我通常希望單元測試我的函數爲「黑盒子」,它們遵循規範,只關心內部發生的事情(從dbug的角度來看),如果它們失敗的話。如果你真的想要單元測試,那麼也許你可以把它放到它自己的函數中,這個函數可以用來測試(選項1或2),並單獨地測試這個函數,而不是通過測試細節來損害'API'。另一種可能性是*有條件地編譯*在函數中記錄信息。 – Galik