中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++接口類型怎么定義

發布時間:2021-11-25 16:28:59 來源:億速云 閱讀:297 作者:iii 欄目:大數據

本篇內容介紹了“C++接口類型怎么定義”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

I.4 Make interfaces precisely and strongly typed(接口類型應該精準且嚴格)

Reason(原因)

類型是最簡單、最好的文檔。經過良好定義的類型可以提高易讀性,也可以在編譯時被檢查。同時,類型明確定義的代碼通常也會被優化得更好。

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 cornersdraw_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);
Example, bad(反面示例)

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);}
Example, good(范例)  

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++接口類型怎么定義”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

江源县| 五大连池市| 辽源市| 定结县| 甘德县| 木里| 那曲县| 惠来县| 余庆县| 怀远县| 土默特右旗| 鹿泉市| 江永县| 台中县| 滨海县| 巴塘县| 阜新| 南充市| 遵义市| 尚义县| 涡阳县| 衡东县| 陆丰市| 潼南县| 九江市| 北川| 伽师县| 博客| 平定县| 澳门| 安吉县| 万山特区| 抚顺县| 珲春市| 康平县| 北碚区| 东山县| 鄂伦春自治旗| 仙游县| 射洪县| 逊克县|