我希望为我的用例找到一些指向“最佳实践”的指针
我试图回答的问题(本质上)是:
Is it considered poor practice when there is a class
Wrapper
which is a wrapper for another classWrapped
that there could be two distinctWrapper
objects which wrap the same instance of aWrapped
object?
我的想法是,我使用包装器类来更改(实际上是简化)对象的接口,但包装的对象是数据的真正所有者。因此,我不希望包装器类混淆或误导用户对底层对象的理解
在我的用例上下文中描述这个问题可能是最容易的
我正在编写一个应用程序(Python),它将处理用户提供的大纲文件,并执行一些增值功能来丰富其中包含的数据
大纲是大纲应用程序(如Mac上的OmniOutliner)、思维导图应用程序(如MindManager)用于新闻联合和许多其他用途的层次结构
大纲文件存储为OPML(大纲处理标记语言),这是一种XML语言(http://dev.opml.org/)。OPML文件在结构的顶部包含一些元素(<opml>
、<head>
和<body>
),但是所有数据都包含在带有属性的<outline>
元素的层次结构中
Python中没有可用的OPML解析器库(据我所知),因此在我为我的应用程序开发功能时,我打算使我的OPML解析模块独立,以便将其制作成一个包供一般使用。因此,我渴望使它符合被认为是良好的一般做法,特别是要确保它是Pythonic
我正在使用xml.etree(ElementTree,Element)
https://docs.python.org/3.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element
…以处理XML文件
在xmltree中,Element
类用于存储通用XML元素,并存储其标记名、各种其他字段和子节点
对于我的实现,我写了:
Outline
一个称为OutlineNode
的包装器(适配器设计模式)类,它包装Element
类(它存储在私有属性_node
)以表示大纲中的每个<outline>
元素
OutlineNode
为用户提供了一个简单的界面来访问<outline>
元素中的信息,但隐藏了Element
类提供的附加功能,该类被设计为通用XML节点表示
例如,每个<outline>
元素可以包括一个“text”属性和一个“_note”属性,用户可以通过OutlineNode
对象的属性使用该属性
一个OutlineNode
的孩子也是OutlineNodes
例如,当用户请求OutlineNode
对象的子对象时,我的代码:
Element
节点Element
中内置的功能获取其子级OutlineNode
对象中的子对象李>这种方法在功能上非常有效,但有几个问题困扰着我:
第一个问题是,每次我请求节点的子节点时,动态创建OutlineNodes
并不是一种非常有效的方法(可以说),但它很简单,效果很好。我没有注意到任何性能问题,几乎可以肯定这对我来说不会是一个大问题,因为我的应用程序通常只解析一次文件。如果我想编写一个通用的OPML处理库,这可能不太好,这让我很恼火
第二个是,如果用户访问一个节点的子节点两次,而它们将存储相同的底层Element
节点,那么包装它们的OutlineNode
对象将被动态创建,因此将是不同的物理对象
我已经覆盖了OutlineNode
中的__eq__()
,所以有两个OutlineNode
在下面包装相同的内容躺着的Element
是相等的,但这两个OutlineNode
将不是相同的对象
因此,我可以编写如下代码:
child_1 = parent_node[0] # Accesses the first child of an OutlineNode object
child_2 = parent_node[0] # Accesses the same child for a second time
assert(child_1._node is child_2._node)
assert(child_1 == child_2)
assert(child_1 is child_2)
以及:
Element
对象(_node
)是同一个对象李>OutlineNode
对象的{u节点属性都是相同的对象,则我已重写__eq__
以返回True李>child_1
和child_2
的每个赋值创建了一个新的OutlineNode
对象所以我有三个问题:
Element
创建OutlineNode
实例并始终向用户提供相同的实例时,我是否应该实现某种跟踪机制?这将使我的代码变得非常复杂,目前代码非常简单李>欢迎提出意见和建议
目前没有回答
相关问题 更多 >
编程相关推荐