Poltergeist反模式示例

6

我目前正在阅读《反模式》一书,其中描述了这种反模式。如果一个人无法理解它,那么我认为解释有问题。我自己也无法理解。事实上,我并没有看到短暂对象的问题,事实上,“用方法对象替换方法”重构就是这样做的:它创建了一个类,其实例是短暂的。但是它们有状态。也许Poltergeists的问题在于它们是无状态的(例如,某个具有非静态方法的实用程序类)?但是仍然有使用(几乎)无状态类来实现多态行为的用例。 - Vytenis Bivainis
我注意到我们代码库中有一个类,想知道它是否可能是个幽灵。它的名字叫做ImageFromBmp。它的构造函数只接受$url作为参数,并且有一个有用的方法返回图像实例。 - Josef Sábl
这个函数能否移动到图像类中?如果可以,那么你可能遇到了一个幽灵。 - James A Mohler
2个回答

3
维基百科对命令模式的描述如下:
命令模式是一种行为设计模式,其中一个对象用于表示和封装调用方法所需的所有信息,以便在以后的某个时间调用该方法。一个组件可以向另一个特定的组件发送命令,并假设当满足某些条件时,命令将被触发。
这个概念非常像函数式编程中的functor(functor基本上是一个黑盒子中的函数,包括参数等)。
Poltergeist的描述如下:
Poltergeist是一个短暂的、通常是无状态的对象,用于执行初始化或在另一个类中调用方法。
命令是通用的,必须能够包含足够的状态以便重复使用。Poltergeist通常是专用的,只存在于摇晃一些椅子并在地下室发出响声之后就会消失。Poltergeist通常用作构建或初始化对象的支架,很少用于在构建后共享状态更改。
换句话说,是的,它们有些相似,但Poltergeist不灵活,代表静态操作,而命令是通用的,可重用的,并代表可配置的操作。

我在尝试想象这种情况:有些类只是被创建来“帮助构造或初始化对象”。它是否像某些依赖项的存根或者像一个工厂,可以创建以特定方式初始化的对象? - Oleg Oshkoderov
这就是问题所在,实际上并没有必要。它们通常是由程序员的误解引起的,几乎从来没有真正需要使用它们。 - Wug
1
这与在MVC架构中拥有一个控制器类有何不同? - Alexandr

0

能否再解释一下?我觉得这完全不正确。所以我猜我可能漏掉了什么 :-) - Josef Sábl
1
“Value Object don't do anything” - 这是一个非常强烈的说法 :). 验证、格式化、转换、DSL扩展、特定数据操作等等。以joda.Money类为例,它需要很多功能来成为一个好的和实用的值对象。 - Stepan Mozyra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接