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

}

これの公開されたインターフェースは、RollsRoyceEngine にあるものではなく、IRolllsRoyceEngine であると言えますか?

もしそうなら、公開された方法と公開された方法の本当の違いは何ですか?

4

2 に答える 2

5

私は彼がコントラクトが王様であることを意味していると思います-あなたのクラスのメソッドがパブリックであるという理由だけで、クライアントがそれを呼び出すことができる、またはそれが何をするかを知っている、またはそれが次にあると仮定する資格がありませんバージョン。API はソースによって定義されるのではなく、契約によって、通常はドキュメントの形で定義されます。

ドキュメント化されていない (公開されていない) 関数を呼び出さないのはクライアントの責任であり、呼び出されるべきではないメソッドを隠す実装者の責任ではありません。

一部の人々はこれに反対するかもしれません - 通常、ドキュメンテーションを信用せず、作者が主張していることではなく、ソースを見て実際の動作を確認することで物事がどのように機能するかを知りたいと考えている人々です。特に文書化されていないコードを扱う場合は特に、実際には意味があるかもしれません。しかし、それはファウラーが言っていること、つまり特定の実装を調べて推論するのではなく、機能を正式に定義する必要があるということとは反対だと思います。

于 2008-12-14T04:02:03.477 に答える
2

私の意見では、言及されたホワイト ペーパーは、インターフェイスとその実装の違いではなく、API のターゲット ユーザーについて述べています。

API が出荷されると、消費者との契約が成立するというフレームワーク デザイン ガイドラインの類推を見つけることができます。たとえば、フレームワークの IService インターフェイスの v1 を出荷した場合、v2 で変更することはできません。これは、最終的な開発者に破壊的な変更が導入されるためです。代わりに、IService から継承された新しいインターフェイス IService2 を作成し、v2 で出荷する必要があります。

したがって、基本的に公開 API は、エンド開発者と「契約を結ぶ」ことで公開されます。

コードに戻ります。たとえば、開発コミュニティに出荷すると公開されます。

この説明が役立つことを願っています。

于 2008-12-14T16:39:20.920 に答える