iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 17
0
自我挑戰組

Framework 設計原則系列 第 17

Member Design (6) - Parameter

  • 分享至 

  • xImage
  •  

本文重點

1.Parameter 設計原則
2.Enum vs Boolean
3.驗證參數的exception
3.Parameter Pasing
4.傳入的參數數量不確定時


Parameter是只傳入方法或建構子的值
也是命名規則中為一 Camel Casing的

Parameter 設計原則

  1. 盡量使用原始型態的Parameter
    這裡不是指int, string這類的
    而是說當有繼承或實做的關係時,傳入的參數型態盡量為上層型態
    例如,使用IEnumerable,而非ArrayListIList

  2. 不要加上沒有用途的Parameter,做為以後預備用的之類的

基本上整段書都在講,不要未雨綢繆的多寫一些自以為未來會用到的東西預備著
如果未來有需要的話,建議overload

  1. out Parameter 請放在所有Parameter與 ref Parameter之後
public struct DateTimeOffSet{
    public static bool TryParse(string input, out DateTimeOffSet result);
}
  1. 實作的Type必須跟Interface宣告的Parameter名稱一樣
    如下列的other,實作方法CompareTo也必須宣告為other
public interface IComparable<T>{
    int CompareTo(T other);
}

public class Nullable<T> : IComparable<Nullable<T>>{
    public int CompareTo(Nullable<T> other){...}
}

Enum vs Boolean

前面有提到當狀態只有兩種時,通常會用Boolean表示
ture代表可以....
false代表不可以....

但如果要增加程式碼的可讀性,可以考慮用Enum表示

那到底甚麼時候適合Enum,甚麼時候適合Boolean呢??

  1. 當方法中有兩個以上的boolean參數時,使用Enum
    以下為例,兩個boolean參數,不易判斷前後各代表甚麼意思
    改用Enum,不僅增加可讀性,也因為被Enum型態限制住,不會弄錯前後的內容
// 兩個boolean參數,不易判斷前後各代表甚麼意思
Stream stream = File.Open("foo.txt",true,false);

// 增加可讀性
Stream stream = File.Open("foo.txt", CasingOptions.CaseSensitive, FileMode.Open);
  1. 非常確定只會有兩種狀態,不會增加其他狀態的情況下,可以使用Boolean

驗證參數的exception

傳入的參數如果不符合規定

之前我愚蠢的做法是會另開一個新的exception來說明這個參數哪裡出問題了

但是讀了這本書之後才發現,其實原生exception就足夠用來表達了

而且因為是默認的規則,大家都會知道問題是出在是傳入的參數

如果要自己寫新的Exception的話,請繼承System.ArgumentException

1.因為傳入Null而出錯的話,請throw ArgumentNullException
2.因為傳入的Enum範圍出錯的話,請thorw ArguemntOutOfRangeException
3.不要使用Enum.IsDefined來檢查範圍

Parameter Pasing

參數又分為三種

  1. by-value parameters
  2. ref parameters
  3. out parameters

大部分的情況都是第一種-by-value

使用方法是copy一份參數內容給需要的方法,不會影響到原來呼叫時的值

ref parameters跟out parameters則是傳址,會影響到原來的值

但是使用out parameters時一定要在return前修改參數內容

1.不過書中的建議是請大家不要使用ref parameters跟out parameters
除非你非常知道他的運作方式為何

2.使用ref parameters時,不要assign給另一個ref parameters

傳入的參數數量不確定時

也就是在最後一個參數使用陣列

以下面常用的String.Format來說

不確定到底有多少個{0}....{n}將被取代時

最後一個參數parameters使用陣列傳入

public class String{
    public static string Format(string format, object[] parameters);
}

在Java來說的話就是..

public class String{
    public static string Format(string format, object.. parameters);
}

使用上可以直接給一個string array,也可以在後面一直加上object

string.Format("File {0} not found in {1},new object[]{filename, directory});

string.Format("File {0} not found in {1},filename, directory);

上一篇
Member Design(5) - Field
下一篇
Member Design (7) - Extension
系列文
Framework 設計原則30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言