逻辑如下:服务器准备通过HTTP响应发送的文件(如index.html或some.pdf)。基于后缀,我想在HTTP报头中设置内容类型。
现在的逻辑是,我有类文件类型,并有许多特定的文件类型子类对其进行扩展。但我仍然需要使用“开关”来识别后缀。类似于:
Filetype f = null;
if(suffix == "pdf"){
f = Filetype_pdf(source);
} else if (suffix == "html") {
f = Filetype_text(source);
}
但是我使用继承只是为了避免这些“如果”。对这个问题有什么建议吗?还是应该这样?谢谢。
发布于 2015-01-12 00:56:43
假设您有以下层次结构:
Filetype
HTMLType
PDFType
TxtType
现在假设这些类中的每一个都理解type
消息(而不是它们的实例,类)。然后,您可以在Filetype
中创建一个类方法,即classFor
,它接收一个参数extension
,并响应处理该extension
的Filetype
子类。classFor
的实现包括枚举所有子类,查找type
与extension
匹配的子类。
在Smalltalk中,这看起来就像
classFor: extension
^Filetype allSubclasses detect: [:cls | cls type = extension]
当然,在if
的实现中有一个detect
消息,但是您的代码没有看到它,并且很好地表达了必须满足的条件。
编辑:
如果这种方法的优点是,如果添加(或删除)支持新类型文件的其他子类,则检测适当子类的方法classFor
不会更改。这与switch
语句形成鲜明对比,该语句必须详尽地命名所有可能性。通过避免switch
,您的代码获得了继续使用较新版本的层次结构所需的通用性。
https://stackoverflow.com/questions/27893464
复制相似问题