我有一堂鸟课。鸟能学,鸟能飞(方法)。鸟只有在学习之后才能飞翔。
考虑到两种方法都是公开的。您如何向其他开发人员说明这一点。通常,他们应该查看一下公共方法的名称,并了解他们所做的事情。但是,如果不阅读注释或者理解method2只能在method1之后调用的封装代码,他怎么能理解呢?
发布于 2013-05-08 20:12:26
最干净(但并不总是最实用)的方法是让learn返回一个EducatedBird,然后再返回一个fly。
我不确定是否有一个以它命名的正式模式,但是这种模式对于其他类型的状态转换(比如打开连接)非常有效。
发布于 2013-05-08 20:34:01
特拉斯廷的回答是教科书上的建议,也不是一个坏的建议。这被称为状态模式,可以在大多数编程语言中实现,但我发现它非常笨重,当您开始进入10-20状态范围时,您会希望已经将该模式作为一系列的装饰器来实现,并且当您完成时,您将已经完全过时了。
只有当状态和状态转换的数量清晰而不同时,状态模式才会有用。如果您想拥有任意数量的状态,或者具有多维状态,则应该使用装饰图案。不过,这也有它自己的警告。根据您的语言,它也可能很笨重(如果您有一个期望FlyingBird的方法,但是您传递了一个包装FlyingBird的YellowBird .)。通过这种方式实现修饰器模式,您可能会失去语言的一些好处。
在我看来,最好的方法是为对象和异常处理隐式地实现状态模式,或者在运行时组合对象(如果您的语言支持的话)。
发布于 2013-05-08 22:15:15
通常,如果我必须在编译时强制执行一种方法必须首先发生,并使编码器明白,我通常要么使用与Telastyn的状态模式类似的monad,要么强制使用令牌。
返回一个FlightKnowledge对象。该对象应该具有一个构造函数可见性,从而阻止普通消费者创建自己的对象(私有、受保护、内部等)。然后,将Fly(FlightKnowledge)公开为Fly方法的唯一重载。这要求编码器传入一个有效的FlightKnowledge对象(取决于您的语言,您可以使FlightKnowledge成为一个不能为空的类型,或者通过装饰来强制该参数不能为空),如果他能够获得的唯一方法是调用Learn(),那么您已经执行了您的操作顺序。
只是不要将它转换为"King's Quest“反模式(要飞(),您必须拥有FlightKnowledge,您可以通过调用Learn()来获得它,它通过调用AskForTuition()调用AskForTuition()来获取一个由AskForTuition()生成的学费对象,该对象接受的是.的SweetTalk对象)。如果您的操作顺序如此之深,则令牌本身就是错误的模式。
https://softwareengineering.stackexchange.com/questions/197463
复制相似问题