2008-12-14 118 views
1

根據Martin Fowler的說法:「某些東西可能是公開的,但這並不意味着你已經發布了它。」這是否意味着是這樣的:發佈的和公共的方法/屬性有什麼區別?

public interface IRollsRoyceEngine 
{ 
    void Start(); 
    void Stop(); 
    String GenerateEngineReport(); 
} 

public class RollsRoyceEngine : IRollsRoyceEngine 
{ 
    public bool EngineHasStarted { get; internal set; } 

    public bool EngineIsServiceable { get; internal set; } 

    #region Implementation of IRollsRoyceEngine 

    public void Start() 
    { 
     if (EngineCanBeStarted()) 
      EngineHasStarted = true; 
     else 
      throw new InvalidOperationException("Engine can not be started at this time!"); 
    } 

    public void Stop() 
    { 
     if (EngineCanBeStopped()) 
      EngineHasStarted = false; 
     else 
      throw new InvalidOperationException("Engine can not be started at this time!"); 
    } 

    public string GenerateEngineReport() 
    { 
     CheckEngineStatus(); 
     return EngineIsServiceable ? "Engine is fine for now" : "Hmm...there may be some problem with the engine"; 
    } 

    #endregion 

    #region Non published methods 

    public bool EngineCanBeStarted() 
    { 
     return EngineIsServiceable ? true : false; 
    } 

    public bool EngineCanBeStopped() 
    { 
     return EngineIsServiceable ? true : false; 
    } 

    public void CheckEngineStatus() 
    { 
     EngineIsServiceable = true; 
     //_EngineStatus = false; 
    } 

    #endregion 

} 

可不可以這樣說,這個發佈的接口是IRollsRoyceEngine不是無論是在RollsRoyceEngine?

如果是這樣,公共方法和已發佈方法的真正區別是什麼?

回答

2

在我看來,提到的白皮書談論了API的目標受衆,而不是界面和它的實現之間的區別。

你可以在Framework Design Guidelines找到類比,其中說,一旦你的API發貨,你有一個消費者的合同。例如,如果您在框架IService接口的v1版本中發佈,則無法在v2中更改它,因爲它會向最終開發人員引入重大更改。相反,您必須創建從IService創建的新界面IService2,並將其與v2一起發貨。

因此,基本上公共API會在您與最終開發人員「簽訂合同」後發佈。

返回到您的代碼 - 例如,將它發佈到開發社區時將發佈。

希望這個解釋會有幫助。

5

我認爲他的意思是合同是王 - 只是因爲你班上的一種方法是公開的,不會讓客戶認爲他們可以稱之爲,或者他們知道它做了什麼,或者它會成爲有在下一個版本。 API不是由源定義的,它們是由合同定義的,通常以文檔形式。

客戶端的責任不是調用無證的(未發佈的)函數,也不是實施者隱藏不應該調用的方法的責任。

有些人可能會同意這種看法 - 通常是那些誰不信任的文件,寧可找出事情通過查看源如何工作,看看它實際上確實,不如說是作者索賠它確實如此。他們很可能有一個觀點,尤其是在處理文件不足的代碼時的實踐中。但我認爲這與福勒所說的相反,即功能應該被正式定義,而不是通過檢查特定的實現來推斷。

+1

有關此問題的更多信息,請訪問http://martinfowler.com/ieeeSoftware/published.pdf – 2008-12-14 08:11:24

相關問題