为了帮助应用程序从XML结构中操作和工作以生成其他信息,我创建了一个与XML结构密切相关的类结构。
因此,XML是:
<document>
<group attr1="thing">
<title>Some group of things</title>
<information>
<content />
</information>
<detail attr2="flame">
<title>Some detail</title>
<content />
</detail>
<subgroup attr1="invisible">
<title>A subgroup</title>
<information>
<content />
</information>
<detail attr2="mister">
<content />
</detail>
</subgroup>
...
</group>
<group>
<title>...</title>
<information>
<content />
</information>
<reference ref="elsewhere" />
...
</group>
...
</document><reference>元素是从不同组/子组中匹配的<detail>中提取出来的特例。
我已经为节点确定了一个标准接口:
interface iNode {
getTitle();
getAttr();
getInformation();
getNodes();
}然后在以下四个类中实现,并在解析文档时使用工厂确定要使用哪个类来表示特定的XML DOM节点:
class NodeGroup implements iNode {
getTitle() : return <title>
getAttr() : return @attr1
getInformation() : return <information>
getNodes() : return <detail> | <subgroup> | <reference>
}
class NodeSubGroup implements iNode {
getTitle() : return <title>
getAttr() : return @attr1
getInformation() : return <information>
getNodes() : return <detail> | <subgroup> | <reference>
}
class NodeDetail implements iNode {
getTitle() : return <title>
getAttr() : return @attr2
getInformation() : return child::*[not <title>]
getNodes() : return none
}
class NodeReference implements iNode {
getTitle() : return (NodeDetail:getTitle())
getAttr() : return (NodeDetail:getAttr())
getInformation() : return (NodeDetail:getInformation())
getNodes() : return none
}现在,很明显,NodeGroup和NodeSubGroup有相同的实现-所以我想我可以创建一个带有公共实现的超类。甚至NodeDetail也可以扩展这个超类,因为它以相同的方式实现了getTitle() (并覆盖了其他三个方法)。
完成了这些之后,我现在有了5个类和3个实现(因为NodeGroup和NodeSubGroup只是现在不覆盖任何东西的瘦子类)。
我的问题是--我是把它分成3个类,让工厂实例化<group>和<subgroup>的超类,还是保留所有5个类,使超类变得抽象,从而在类和XML节点类型之间存在明确的一对一关系?
抱歉--为了避免在实现方面陷入困境,我可能对这里的类示例进行了过度简化。我试图关注是否应该为5种节点类型设置5个类--特别是当两个节点类型表现出与任何需要使用它们的行为相同的时候。使用交互这个词(虽然在我的应用程序中很有意义)也是一个糟糕的选择。
这些类中的每一个都指示XML解析器如何从对象表示的节点的文档中获取我想要的相关信息。其中一些类还操作解析器检索的信息。
发布于 2016-03-03 18:32:35
https://softwareengineering.stackexchange.com/questions/311556
复制相似问题