国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

控制參數(shù)個數(shù)的幾種方式

2019-11-17 03:50:13
字體:
供稿:網(wǎng)友
最近整理了一下公司規(guī)范,其中“函數(shù)的參數(shù)個數(shù)不宜超過4個”這一條在推廣的時候有些爭議,在能完成任務的情況下參數(shù)越少肯定越好,這本身沒什么可爭議的,但這樣做可能會在編程時帶來困難,爭議點在是否值得這樣做。我覺得為了讓使用函數(shù)者更簡單這樣做還是值得,至于編程時的困難往往是因為我們不熟悉一些減少參數(shù)的方法,這里總結(jié)幾條供大家參考:

1、使用結(jié)構來封裝參數(shù)

例子:添加用戶

原函數(shù)體:AddUser(string userName,string passWord,string address,string phone,int age)

重構:添加一個User類:



class User
    {
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
        public int Age { get; set; }
    }





將AddUser改為:AddUser(User user)

存在的問題:如果添加的這個類沒有其他地方用,常常會覺得這樣做并不值得,這時我們可以考慮使用匿名類封裝參數(shù)的方法。

2、使用屬性來替換參數(shù)

如果將1中的AddUser方法置于User類中,那么AddUser方法中的user參數(shù)都可以省掉了,有的時候可能為了減少某些方法的參數(shù)個數(shù)而添加某些屬性。面向?qū)ο笤O計中,對象應該自己負責自己,而且應該清楚定義責任。某個方法參數(shù)太多的原因可能是這個方法寫在了他不該存在的地方,GRasp原則中講的“信息專家”模式很多情況下可以減少參數(shù)的個數(shù)。

例子:帳戶轉(zhuǎn)賬

原函數(shù):Transfer(Account from,Account to,decimal money)

重構:



代碼
public class TransferPRocess
    {
        private Account From;
        private Account To;
        public TransferProcess(Account from, Account to)
        {
            this.From = from;
            this.To = to;
        }
        public void Transfer(decimal money)
        {
            if (money<From.Money)
            {
                From.Money = From.Money - money;
                To.Money = To.Money + money;
               //更新數(shù)據(jù)庫
            }
            else
            {
                throw new Exception("超出余額");
            }
        }
    }
注:信息專家模式是面向?qū)ο笤O計的最基本原則,我們設計對象(類)的時候,如果某個類擁有完成某個職責所需要的所有信息,那么這個職責就應該分配給這個類來實現(xiàn)。這時,這個類就是相對于這個職責的信息專家。



3、使用私有函數(shù)

調(diào)用某個函數(shù)時往往并不需要很多的交互參數(shù),但我們提供參數(shù)時則需要提供所有的情況,這時我們可以把函數(shù)分類,將最復雜的函數(shù)封裝成私有的,而暴露出來的簡單函數(shù)調(diào)用這些復雜函數(shù)完成功能。我們來看看mvc中的TextBox方法的實現(xiàn)方式:



代碼
   public static string TextBox(this HtmlHelper htmlHelper, string name, object value, IDictionary<string, object> htmlAttributes) {
            return InputHelper(htmlHelper, InputType.Text, name, value, (value == null) /* useViewData */, false /* isChecked */, true /* setId */, true /* isExplicitValue */, htmlAttributes);
        }

        private static string InputHelper(this HtmlHelper htmlHelper, InputType inputType, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary<string, object> htmlAttributes) {
            if (String.IsNullOrEmpty(name)) {
                throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");
            }

            TagBuilder tagBuilder = new TagBuilder("input");
... ...


但有時我們?yōu)榱私o調(diào)用者最大的靈活性,可能也會把最復雜的那個函數(shù)重載暴露出來。

4、params 關鍵字

指定在參數(shù)數(shù)目可變處,采用參數(shù)的方法參數(shù)。

用法:

代碼
static void Main(string[] args)
        {
            UseParams(1, 2, 3);
        }
        public static void UseParams(params int[] list)
        {
            for (int i = 0; i < list.Length; i++)
            {
                Console.WriteLine(list[i]);
            }
            Console.WriteLine();
        }


這種方法實際上并沒有減少參數(shù)的個數(shù),只是簡化了函數(shù)體。

5、使用匿名類封裝參數(shù)

準備知識:我們先來看看RouteValueDictionary



代碼
static void Main(string[] args)
        {
            RouteValueDictionary r = new RouteValueDictionary(new { id=1,name="lfm"});
            foreach (var item in r)
            {
                Console.WriteLine("{0}:{1}", item.Key, item.Value);
            }
            //Console.WriteLine();
        }


結(jié)果:

id:1

name:lfm

RouteValueDictionary可以將實例的屬性名及屬性值存入到字典中。

mvc中很多地方使用這種方式傳遞參數(shù)。

比如: <%= Html.ActionLink("Details", "Details", new { id=item.id })%>

ActionLink方法體中就是使用RouteValueDictionary將匿名對象進行了分解,然后將其拼裝到鏈接上。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 罗平县| 达州市| 集贤县| 抚远县| 西盟| 陆川县| 台东县| 临西县| 克什克腾旗| 松原市| 乡城县| 抚顺县| 灵台县| 潼南县| 桂平市| 中西区| 滨州市| 凉山| 阿巴嘎旗| 荆州市| 松潘县| 江口县| 梅州市| 东阳市| 清丰县| 隆林| 大洼县| 札达县| 株洲市| 秦皇岛市| 长丰县| 德格县| 志丹县| 钟祥市| 定安县| 观塘区| 博客| 叙永县| 泰顺县| 龙南县| 宾阳县|