造句 - Fluent Interface

  • 3256
  • 0
  • 2010-12-14

造句 - Fluent Interface

 

巴別塔(Tower of Babel) --《聖經·創世記

當時人類聯合起來興建能通往天堂的高塔。為了阻止人類的計劃,上帝讓人類說不同的語言,使人類相互之間不能溝通,計劃因此失敗,人類自此各散東西。

 

「語言是誤解的開始,也是理解的開始」

讓我們把領域限縮一下,把語言限縮到-->程式語言。

如果你寫程式,不管是新手或老手,在接手或維護新程式時,常常會遇到讓你不知所云的程式碼;

或是當使用第三方的類別庫時,冗餘繁雜的程式碼常讓人有「丈二金剛」的感覺。

 

 

問題是什麼

問題是難以理解的程式碼,造成維護或使用上的困難度增加。

 

 

該怎麼解決

於是乎註解就產生了,而你就會在程式碼中看到大量的註解,隨著程式碼的複雜度增加,註解也如預期般的增加。

但是註解做了什麼,程式碼裡的註解,確實有其幫助,幫助維護人員了解這段程式碼做了什麼。

這樣就夠了嗎?

看看這個例子:


IMenuCommandService menuService = pServiceProvider.GetService(typeof(IMenuCommandService)) as IMenuCommandService;
MenuCommand command = menuService.FindCommand(StandardCommands.Copy);    
 if (command != null)
 {
 	menuService.RemoveCommand(command);
 }
command = menuService.FindCommand(StandardCommands.Cut);
if (command != null)
 {
 	menuService.RemoveCommand(command);
 }
command = menuService.FindCommand(StandardCommands.Paste);
if (command != null)
 {
 	menuService.RemoveCommand(command);
 }
command = menuService.FindCommand(StandardCommands.SelectAll);
            if (command != null)
 {
 	menuService.RemoveCommand(command);
 }

 

 

這個例子很明顯的是要移除一些Command,

如果你是程式設計師,要達到需求,你所需要知道的類別及方法,就是上述程式碼那樣的多。

這表示了什麼,這表示你要知道「How to do」,

但是其實只要了解如何移除Command就足夠達到需求,過多的資訊反而讓程式設計師混淆(「Law of Demeter」法則)

 

 

 

程式語言→語言

現在讓我把程式來做個映射,映射到語言上。

程式碼 → 單字,

方法 → 單詞,

註解 → 單詞解釋,

Fluent Interface → ???。

 

image

 

 

Fluent Interface

來看看Wiki怎麼說:

In software engineering, a fluent interface (as first coined by Eric Evans and Martin Fowler) is a way of implementing an object oriented API in a way that aims to provide for more readable code.

A fluent interface is normally implemented by using method chaining to relay the instruction context of a subsequent call (but a fluent interface entails more than just method chaining). Generally, the context is

  • defined through the return value of a called method
  • self referential, where the new context is equivalent to the last context
  • terminated through the return of a void context.

This style is beneficial due to its ability to provide a more fluid feel to the code.

 

總而言之,Fluent Interface就是透過物件導向的方式,讓程式碼更直覺與更具閱讀性。

 

 

Fluent Interface → 句子

 

了解什麼是Fluent Interface後,讓我們利用重構雜亂程式碼的方式來造句吧。


pServiceProvider.MenuCommandService()

.RemoveMenu(StandardCommands.Copy)

.RemoveMenu(StandardCommands.Cut)

.RemoveMenu(StandardCommands.Paste)

.RemoveMenu(StandardCommands.SelectAll);

 

上面那段程式碼明顯指出使用ServiceProvider的MenuCommandService移除Copy、Cut、Paste、SelectAll Command,沒有其他不必要的類別資訊介入,API使用起來更直覺與方便。

 

當程式設計師使用Fluent Interface後,程式碼更簡潔、明瞭、易懂連考試都得一百分呢。

 

部分程式碼

       public static IServiceModel<IMenuCommandService> MenuCommandService(this IServiceProvider pProvider)
        {
            return pProvider.Service<IMenuCommandService>();
        }
        public static IServiceModel<IMenuCommandService> RemoveMenu(this IServiceModel<IMenuCommandService> pMenuCommandService, CommandID pCommandId)
        {
            IMenuCommandService service = pMenuCommandService.Service;
            MenuCommand command = service.FindCommand(pCommandId);
            if (command != null)
            {
                service.RemoveCommand(command);
            }
            return pMenuCommandService;
        }
 
    public interface IServiceModel 
    {
        IServiceProvider ServiceProvider
        {
            get;
        }
    }
 
    public interface IServiceModel<T>:IServiceModel
    {
        T Service
        {
            get;
        }
    }
 
    class ServiceModel<T> : IServiceModel<T> where T:class
    {
        public ServiceModel(IServiceProvider pServiceProvider) 
        {
            ServiceProvider = pServiceProvider;
        }
 
        #region IServiceModel 成員
 
        public IServiceProvider ServiceProvider
        {
            get;
            private set;
        }
 
        #endregion
 
        #region IServiceModel<T> 成員
 
        public T Service
        {
            get 
            {
                return ServiceProvider.GetService<T>();
            }
        }
 
        #endregion
    }
 

重構成Fluent Interface的 優點

  • Intelligence
  • 提高可讀性
  • 程式碼也透露出較多的「What to do」,而不是「How to do」,EX:Linq中的select、where示意了「What to do」,但不說「How to do」。
  • 封裝程式碼
  • 抽象 → 單元測試

 

結語

註解一直是軟體開發領域被開發者廣為討論的問題,包含註解的撰寫方式、風格等...,程式編碼風格亦同。

最終的目標都是其可理解性、可讀性,Fluent Interface提供了一個方式,組織程式碼、類別與方法,使程式碼更能自我示意。

透過文件、註解能夠了解程式中方法的使用方式,而透過Fluent Interface可以讓你的程式碼文情並茂、更具章法。

 

參考

http://www.martinfowler.com/bliki/FluentInterface.html

 

 

What is language for? Some people seem to think it's for practicing grammar rules and learning lists of words——the longer the words the better. That's wrong. Language is for the exchange of ideas, for communication. --《學好外語的黃金法則》

分享