先來說說方法命名吧
一般來說方法多會以動作來命名
ex:Get, Set, InvokeAsync, FindAll, Query
而像是我們前面所使用的範例也有
ex:Load, GetContentAsync, SendAsync
名稱的格式通常如下:
{Behavior):僅描述動作的狀況通常表示,此行為與所屬型別有關
Ok : void Repository<TProduct>.Add(TProduct product) // repository of products Add a item
NoOK : void Repository<TProduct>.AddProduct(TProduct product) // repository of products add product a item
這裡的問題是,文字上很明顯多了Product,而且Repository<TProduct> 也不應該加入非Product的 item
{behavior}{target}: 這種需要額外追述的表示對象不像上述那樣通常為自己存在的型別,所以額外描述對象
Ok:Task<Stream> HttpResponseMessage.GetContentAsync() // response get content
NoOk:Task<Stream> HttpResponseMessage.Get() // response get
這裡的問題則是,Get的對象即便知道是Stream ,也不知道是哪來的Stream,而HttpResponseMessage 本身並不是Stream
{behavior}{target}{effect) / {behavior}{effect):除了上述的描述外,追加此動作的影響
OK:Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
NoOK:Task<HttpResponseMessage> Send(HttpRequestMessage request)
Async 是動作所造成的副效果,所以導致回傳並非原本所預期的 HttpResponseMessage 所以最後追述
{behavior}{target}{relation}:表示此行為對象是target的關係者
OK:FindHistoryBilling(User user) // find history billing of user
NoOK:FindUsersHistoryBillingWithAccountAndUsersMon(User user) // 太長了....
通常超過一個行為就表示該寫第二個方法來接續,不但符合原則也比較清楚
如果真的想這樣寫,那不如直接 FindMon(User user) find mon of user 也許更淺顯易懂
這裡再額外提幾個狀況