已发布和公共方法/属性之间有什么区别?

时间:2008-12-14 03:55:13

标签: design-patterns public-method

根据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 个答案:

答案 0 :(得分:5)

我认为他意味着合同是王道 - 只是因为你班上的一种方法是公开的,不会让客户认为他们可以称之为,或者他们知道它的作用,或者它会在那里在下一个版本中。 API不是由来源定义的,它们是由合同定义的,通常以文档的形式定义。

客户有责任不调用未记录的(未发布的)函数,而不是实现者负责隐藏不应调用的方法。

有些人可能不同意这一点 - 通常是那些不信任文档的人,并且宁愿通过查看源代码来了解事情是如何工作的,以查看实际的内容,而不是作者声明确实如此。他们可能有一个观点,尤其是在处理文档不足的代码时。但我认为这与福勒所说的相反,即功能应该正式定义,而不是通过检查特定的实现来推断。

答案 1 :(得分:2)

在我看来,白皮书讨论了API的目标受众,而不是界面与其实现之间的区别。

您可以在Framework Design Guidelines中找到类比,其中说明一旦您的API发货,您就与消费者签订了合同。例如,如果您在框架IService接口的v1中发布,则无法在v2中更改它,因为它会向最终开发人员引入重大更改。相反,您必须创建从IService固有的新接口IService2并将其与v2一起发送。

因此,一旦您与最终开发人员签订合同,基本上公开的API就会发布。

返回到您的代码 - 例如,当您将代码发送到开发社区时,它将被发布。

希望这个解释会有所帮助。