C++中為什么盡量不增加函數(shù)的參數(shù)個(gè)數(shù)

本篇內(nèi)容主要講解“C++中為什么盡量不增加函數(shù)的參數(shù)個(gè)數(shù)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++中為什么盡量不增加函數(shù)的參數(shù)個(gè)數(shù)”吧!

為白銀等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及白銀網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、做網(wǎng)站、白銀網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

Reason(原因)

參數(shù)過多會(huì)增加混淆的可能性。和其他方式相比,傳遞很多參數(shù)的代價(jià)通常也很高。

Discussion(討論)

函數(shù)參數(shù)過多通常有兩個(gè)原因:

  1. 抽象缺失。這里缺少一個(gè)抽象,因此組合數(shù)據(jù)被分開傳遞而不是作為包含不變量的單獨(dú)的對(duì)象。這不是擴(kuò)展參數(shù)列表的問題,而是由于組合值不被強(qiáng)制不變量保護(hù)而引發(fā)錯(cuò)誤的問題。

  2. 違反了“一個(gè)函數(shù),一個(gè)職責(zé)”原則。函數(shù)試圖做一件以上的事情,應(yīng)該被重構(gòu)。

  3. Example(示例)

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

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

注意這是因?yàn)榍懊嫣岬降牡谝粋€(gè)問題:抽象缺失。STL傳遞了迭代器對(duì)(沒有包裝的組合值)而不是range(抽象)。

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

這里一共有四個(gè)模板參數(shù)和六個(gè)函數(shù)參數(shù)。為了簡(jiǎn)化最常見和最簡(jiǎn)單的用法,比較操作可以默認(rèn)為<(小于號(hào)):

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

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

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

將參數(shù)分組打包是一種減少參數(shù)數(shù)量的通常技術(shù),這樣也可以增加檢查的機(jī)會(huì)。

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

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

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

安全規(guī)則群組推薦將

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

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

Note(注意)

多少參數(shù)算太多?爭(zhēng)取讓參數(shù)的個(gè)數(shù)少于4個(gè)。存在一些4個(gè)獨(dú)立參數(shù)是最佳表達(dá)方式的函數(shù),但不多。

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

可選項(xiàng):使用默然參數(shù)或重載以便更加通用的調(diào)用形式可以使用較少的參數(shù)。

Enforcement(實(shí)施建議)

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

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

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

       (非強(qiáng)制)這是一個(gè)事關(guān)編程哲學(xué)的準(zhǔn)則,無法直接檢查。

到此,相信大家對(duì)“C++中為什么盡量不增加函數(shù)的參數(shù)個(gè)數(shù)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

標(biāo)題名稱:C++中為什么盡量不增加函數(shù)的參數(shù)個(gè)數(shù)
轉(zhuǎn)載來源:http://www.muchs.cn/article18/jdosdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、虛擬主機(jī)關(guān)鍵詞優(yōu)化、響應(yīng)式網(wǎng)站、云服務(wù)器、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化