本篇內(nèi)容介紹了“C++接口類(lèi)型怎么定義”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)站空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、遂寧網(wǎng)站維護(hù)、網(wǎng)站推廣。
類(lèi)型是最簡(jiǎn)單、最好的文檔。經(jīng)過(guò)良好定義的類(lèi)型可以提高易讀性,也可以在編譯時(shí)被檢查。同時(shí),類(lèi)型明確定義的代碼通常也會(huì)被優(yōu)化得更好。
Example, don't(反面示例)
Consider:(考慮以下代碼)
void pass(void* data); // weak and under qualified type void* is suspicious
調(diào)用者無(wú)法確定函數(shù)可以接受何種類(lèi)型和數(shù)據(jù)是否可能被修改(由于沒(méi)有用const修飾)。注意所有的指針類(lèi)型都可以隱式轉(zhuǎn)換為void*,因此調(diào)用者很容易(隨便)提供一個(gè)值。
被調(diào)用者必須(通過(guò)默契)將數(shù)據(jù)靜態(tài)轉(zhuǎn)換為未經(jīng)驗(yàn)證的類(lèi)型以便使用它。這樣的代碼易錯(cuò)且冗長(zhǎng)。
只有在傳遞設(shè)計(jì)上C++無(wú)法描述的數(shù)據(jù)時(shí)才可以使用const void* 。否則考慮使用variant或者指向基礎(chǔ)類(lèi)型的指針作為代替手段。
可選項(xiàng):模板參數(shù)經(jīng)常可以消除void*而使用T*或者T&。對(duì)于一般的代碼,這里的T可以是普遍的或者概念約束的模板參數(shù)。
譯者注:concept是C++20已經(jīng)決定引入的新概念。
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?
調(diào)用者在描述一個(gè)矩形這一點(diǎn)是明確的,但卻不知道具體描述的是那些方面(四角坐標(biāo)還是邊長(zhǎng))。同時(shí),整形數(shù)據(jù)可以攜帶任意形式的信息,單位也存在很多可能,因此我們必須猜測(cè)四個(gè)整形參數(shù)的含義。前兩個(gè)很有可能是x,y坐標(biāo)對(duì),但是,后兩個(gè)呢?
注釋和參數(shù)名稱(chēng)可以提供幫助,但是我們可以(通過(guò)參數(shù)類(lèi)型)更加清晰地表達(dá):
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
顯然,我們無(wú)法通過(guò)靜態(tài)類(lèi)型系統(tǒng)捕捉所有錯(cuò)誤(例如,認(rèn)為第一個(gè)參數(shù)是左上角這個(gè)事實(shí)就是一種慣例(命名和注釋?zhuān)?strong>Example, bad(反面示例)
Consider:(考慮以下代碼)
set_settings(true, false, 42); // what do the numbers specify?
參數(shù)的類(lèi)型和值沒(méi)有說(shuō)明哪種設(shè)定將會(huì)被修改,也沒(méi)有說(shuō)明值的含義。
This design is more explicit, safe and legible:
下面的設(shè)計(jì)更清晰、安全和可讀。
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.
對(duì)于成組使用布爾值的情況,考慮使用枚舉類(lèi)型;下面的模式可以表示一套布爾值。
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?
在下面的例子中,接口沒(méi)有明確time_to_blink的含義:?jiǎn)挝皇敲脒€是毫秒?
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類(lèi)型(C++11)可以讓時(shí)間間隔的單位更明確。
void blink_led(milliseconds time_to_blink) // good -- the unit is explicit
{
// ...
// do something with time_to_blink
// ...
}
void use()
{
blink_led(1500ms);
}
這個(gè)函數(shù)可以如下設(shè)計(jì)以便接受任何單位的時(shí)間間隔。
template
void blink_led(duration
time_to_blink) // good -- accepts any unit {
// assuming that millisecond is the smallest relevant unit
auto milliseconds_to_blink = duration_cast
(time_to_blink); // ...
// do something with milliseconds_to_blink
// ...
}
void use()
{
blink_led(2s);
blink_led(1500ms);
}
Enforcement(實(shí)施建議)
(Simple) Report the use of void*
as a parameter or return type.
(簡(jiǎn)單)報(bào)告使用void*作為參數(shù)或返回值的情況。
(Simple) Report the use of more than one bool
parameter.
(簡(jiǎn)單)報(bào)告以多個(gè)布爾值為參數(shù)的情況。
(Hard to do well) Look for functions that use too many primitive type arguments.
(很難做好)找到使用太多原始類(lèi)型參數(shù)的函數(shù)。
“C++接口類(lèi)型怎么定義”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!