91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

C++中為什么盡量不增加函數的參數個數

發布時間:2021-11-29 11:58:16 來源:億速云 閱讀:316 作者:iii 欄目:大數據

本篇內容主要講解“C++中為什么盡量不增加函數的參數個數”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++中為什么盡量不增加函數的參數個數”吧!

Reason(原因)

參數過多會增加混淆的可能性。和其他方式相比,傳遞很多參數的代價通常也很高。

Discussion(討論)

函數參數過多通常有兩個原因:

  1. 抽象缺失。這里缺少一個抽象,因此組合數據被分開傳遞而不是作為包含不變量的單獨的對象。這不是擴展參數列表的問題,而是由于組合值不被強制不變量保護而引發錯誤的問題。

  2. 違反了“一個函數,一個職責”原則。函數試圖做一件以上的事情,應該被重構。

  3. Example(示例)

標注庫merge()就處在我們可以舒服地處理的上限:

template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare>OutputIterator merge(InputIterator1 first1, InputIterator1 last1,                     InputIterator2 first2, InputIterator2 last2,                     OutputIterator result, Compare comp);

注意這是因為前面提到的第一個問題:抽象缺失。STL傳遞了迭代器對(沒有包裝的組合值)而不是range(抽象)。

譯者注:range是C++14引入的新特性。譯者注:range是C++14引入的新特性。

這里一共有四個模板參數和六個函數參數。為了簡化最常見和最簡單的用法,比較操作可以默認為<(小于號):

template<class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator merge(InputIterator1 first1, InputIterator1 last1,                     InputIterator2 first2, InputIterator2 last2,                     OutputIterator result);

這并沒有減少復雜性,但是降低了面向很多用戶的表面上的復雜度。為了真正減少參數的數量,我們需要將參數綁定到高級別的抽象中。

template<class InputRange1, class InputRange2, class OutputIterator>OutputIterator merge(InputRange1 r1, InputRange2 r2, OutputIterator result);

將參數分組打包是一種減少參數數量的通常技術,這樣也可以增加檢查的機會。

或者,我們也可以使用concept( 在ISO技術規范中定義)來定義合并操作必須可用的三個類型。

譯者注:concept將會被C++20正式引入。

Mergeable{In1, In2, Out}OutputIterator merge(In1 r1, In2 r2, Out result);
Example(示例)

安全規則群組推薦將

void f(int* some_ints, int some_ints_length);  // BAD: C style, unsafe

with(替換為)

void f(gsl::span<int> some_ints);              // GOOD: safe, bounds-checked

這里,我們使用一個安全而且健壯的抽象,而且通常也可以減少參數的數量。

Note(注意)

多少參數算太多?爭取讓參數的個數少于4個。存在一些4個獨立參數是最佳表達方式的函數,但不多。

可選項:使用較好的抽象:將參數分組并形成有意義的對象然后傳遞它(傳值或傳址)。

可選項:使用默然參數或重載以便更加通用的調用形式可以使用較少的參數。

Enforcement(實施建議)

  • Warn when a function declares two iterators (including pointers) of the same type instead of a range or a view.

    如果函數定義了相同類型的兩個迭代器(包括指針)而不是range或view。

  • (Not enforceable) This is a philosophical guideline that is infeasible to check directly.

       (非強制)這是一個事關編程哲學的準則,無法直接檢查。

到此,相信大家對“C++中為什么盡量不增加函數的參數個數”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

c++
AI

石城县| 苗栗县| 明星| 田东县| 江津市| 汉源县| 兖州市| 衡山县| 锡林郭勒盟| 钟山县| 芜湖县| 柏乡县| 泾阳县| 武冈市| 同仁县| 台东县| 松江区| 浦县| 南溪县| 乌拉特中旗| 济宁市| 桃园市| 宜兰市| 克什克腾旗| 乌拉特后旗| 江源县| 清水河县| 广平县| 肇州县| 朝阳区| 西城区| 石屏县| 新密市| 普洱| 大竹县| 桓台县| 台北县| 扶绥县| 巩留县| 大渡口区| 琼中|