您好,登錄后才能下訂單哦!
本篇內容介紹了“C++接口類型怎么定義”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
類型是最簡單、最好的文檔。經過良好定義的類型可以提高易讀性,也可以在編譯時被檢查。同時,類型明確定義的代碼通常也會被優化得更好。
Example, don't(反面示例)
Consider:(考慮以下代碼)
void pass(void* data); // weak and under qualified type void* is suspicious
調用者無法確定函數可以接受何種類型和數據是否可能被修改(由于沒有用const修飾)。注意所有的指針類型都可以隱式轉換為void*,因此調用者很容易(隨便)提供一個值。
被調用者必須(通過默契)將數據靜態轉換為未經驗證的類型以便使用它。這樣的代碼易錯且冗長。
只有在傳遞設計上C++無法描述的數據時才可以使用const void* 。否則考慮使用variant或者指向基礎類型的指針作為代替手段。
可選項:模板參數經常可以消除void*而使用T*或者T&。對于一般的代碼,這里的T可以是普遍的或者概念約束的模板參數。
譯者注:concept是C++20已經決定引入的新概念。
Example, bad(反面示例)
Consider:考慮以下代碼:
draw_rect(100, 200, 100, 500); // what do the numbers specify?draw_rect(p.x, p.y, 10, 20); // what units are 10 and 20 in?
調用者在描述一個矩形這一點是明確的,但卻不知道具體描述的是那些方面(四角坐標還是邊長)。同時,整形數據可以攜帶任意形式的信息,單位也存在很多可能,因此我們必須猜測四個整形參數的含義。前兩個很有可能是x,y坐標對,但是,后兩個呢?
注釋和參數名稱可以提供幫助,但是我們可以(通過參數類型)更加清晰地表達:
void draw_rectangle(Point top_left, Point bottom_right);
void draw_rectangle(Point top_left, Size height_width);
draw_rectangle(p, Point{10, 20}); // two corners
draw_rectangle(p, Size{10, 20}); // one corner and a (height, width) pair
顯然,我們無法通過靜態類型系統捕捉所有錯誤(例如,認為第一個參數是左上角這個事實就是一種慣例(命名和注釋))Example, bad(反面示例)
Consider:(考慮以下代碼)
set_settings(true, false, 42); // what do the numbers specify?
參數的類型和值沒有說明哪種設定將會被修改,也沒有說明值的含義。
This design is more explicit, safe and legible:
下面的設計更清晰、安全和可讀。
alarm_settings s{};s.enabled = true;s.displayMode = alarm_settings::mode::spinning_light;s.frequency = alarm_settings::every_10_seconds;set_settings(s);
For the case of a set of boolean values consider using a flags enum; a pattern that expresses a set of boolean values.
對于成組使用布爾值的情況,考慮使用枚舉類型;下面的模式可以表示一套布爾值。
enable_lamp_options(lamp_option::on | lamp_option::animate_state_transitions);
In the following example, it is not clear from the interface what time_to_blink
means: Seconds? Milliseconds?
在下面的例子中,接口沒有明確time_to_blink的含義:單位是秒還是毫秒?
void blink_led(int time_to_blink) // bad -- the unit is ambiguous
{
// ...
// do something with time_to_blink
// ...
}
void use()
{
blink_led(2);
}
std::chrono::duration類型(C++11)可以讓時間間隔的單位更明確。
void blink_led(milliseconds time_to_blink) // good -- the unit is explicit
{
// ...
// do something with time_to_blink
// ...
}
void use()
{
blink_led(1500ms);
}
這個函數可以如下設計以便接受任何單位的時間間隔。
template<class rep, class period>
void blink_led(duration<rep, period> time_to_blink) // good -- accepts any unit
{
// assuming that millisecond is the smallest relevant unit
auto milliseconds_to_blink = duration_cast<milliseconds>(time_to_blink);
// ...
// do something with milliseconds_to_blink
// ...
}
void use()
{
blink_led(2s);
blink_led(1500ms);
}
Enforcement(實施建議)
(Simple) Report the use of void*
as a parameter or return type.
(簡單)報告使用void*作為參數或返回值的情況。
(Simple) Report the use of more than one bool
parameter.
(簡單)報告以多個布爾值為參數的情況。
(Hard to do well) Look for functions that use too many primitive type arguments.
(很難做好)找到使用太多原始類型參數的函數。
“C++接口類型怎么定義”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。