【发布时间】:2015-07-30 18:48:12
【问题描述】:
在我正在处理的代码中,我有一个名为 SuccessMessage 的类,其中包含字段 actorType(一个枚举)和有效负载。我不确定要制作什么类型的有效载荷。
如果我制作 Any 类型的有效负载,我必须做很多看起来很粗糙的 instanceOf 类型转换,以便稍后在我的代码中在更具体的实现中处理它。
如果我使用泛型并制作 T 类型的有效负载,我的其他类也必须包含 T 类型。例如,在我的一个名为 Commander 的高级特征中,我有一个名为 handleSuccess 的方法,它接收 SuccessMessage ,并且它必须能够接收泛型 T 的成功消息,迫使我的指挥官也属于泛型 T。
我不确定我是否必须在这两个较小的邪恶之间进行选择,或者是否有更好的方法来做到这一点。我必须包含一些生成有效负载的方法,因为成功消息需要不同类型的有效负载。
编辑: 泛型还有一个额外的问题。 Commander 必须能够处理多种不同类型的 SuccessMessage,因此如果在 handleSuccess 中使用 SuccessMessage[T],强制 Commander 成为 Commander[T],那么 Commander 将无法处理不同类型的成功消息(我想想,不是 100% 肯定)。
编辑 2: 这里有一点指挥官:
trait Commander {
def handleSuccess(message: SuccessMessage){
//based on SuccessMessage.ActorType, do different stuff
}
class SuccessMessage(val actorType: ActorType, val payload: Option[Any])
class SuccessMessage(val actorType: ActorType, val payload: Option[T])
编辑 3:这是对工作流程的描述,以更好地解释问题。
- Commander 向 Poller 发送消息
- 轮询器向指挥官发送 SuccessMessage(self, List[String])
- Commander 将 List[String] 发送到 Processor
- 处理器向指挥官发送 SuccessMessage(self, File)
- 指挥官向上传者发送文件
- 上传者向指挥官发送 SuccessMessage(self, Boolean)
- 等等。
因此,我们需要 SuccessMessage 采取不同的类型。
【问题讨论】:
-
如果您向我们展示一些代码来帮助您,那就更好了。但是,是的,如果类在整个项目中被广泛使用,那么用泛型改造现有类可能会产生巨大的设计负担......这就是为什么在开始编写之前最好拥有一个开发良好的领域对象模型的原因。跨度>
-
具体来说,
handleSuccess对成功消息的有效负载值做了什么? -
您的“更具体的实现”子类是继承自
SuccessMessage还是只是使用它的类? -
代码很多,所以不想全部粘贴。本质上,我使用的是 akka Actor 系统,因此指挥官创建不同的 Actor,向它发送消息以执行某项操作,然后 Actor 会将 SuccessMessages 返回给指挥官。这些 SuccessMessage 中的有效负载属于不同类型。
-
进行编辑以添加代码示例。