我有一个数据结构,它有一个add函数。当用户实例化一个新的数据结构对象时,她可以指定一个算法,该算法将在每次调用add函数时执行,并根据数据结构中先前的值更改新插入的值。该算法需要访问数据结构中的所有数据。
因此,数据结构需要存储一个算法对象(因为每次执行add时都会调用这个对象)。另一方面,算法需要访问数据结构,因此需要存储数据结构对象。
我认为A类有B类的实例,B类有A类的实例的情况通常是不可取的。
有没有人知道如何解决这个问题?
发布于 2015-07-09 17:05:26
数据结构应该包含到算法的链接,因为它只有一个算法。对吗?(据我所知所需)
但是,同样的算法,例如,“正常化到平均值”,可以适用于数据结构的许多不同实例。因此,它不应该包含/存储数据结构的实例。相反,它的方法应该将数据结构作为附加参数。例如:
calculate(newValue, existingDataStructure);然后,数据结构的add()方法调用
tweakedValue = this.algorithm.calculate(newValue, this);
this.add(tweakedValue);发布于 2015-07-09 14:57:35
如果您有这样的循环依赖项,这会提示以下两个问题之一:
你所拥有的,是非常不寻常的。在数据结构中添加元素是数据结构的主要职责之一,将其外包给客户,尤其是需要对数据结构的私有内部进行特权访问的方式,似乎是错误的。
这与SortedSet非常不同,它同时需要一个Ordering和一个Equality算法,但是这两个算法都不需要知道关于Set的任何信息,它只需要知道如何比较两个元素。或者一个HashMap,它需要一个能够散列单个元素的Hash算法。这是由算法参数化的数据结构的典型情况。
发布于 2015-07-09 19:56:30
我有一个数据结构,它有一个add函数。当用户实例化一个新的数据结构对象时,她可以指定一个算法,该算法将在每次调用add函数时执行,并根据数据结构中先前的值更改新插入的值。该算法需要访问数据结构中的所有数据。
这不是一个好主意,而且也没有什么意义。
如果我没听错,你想要创建一个包含一些元素e1,e2,e3,.的对象。在给定的时间点,您希望对元素进行到目前为止的转换。稍后,您希望对整个集合进行另一次转换。
没有必要在两者之间进行转换,因为无论集合存储值是普通的还是转换的,都没有区别。在给定的时间点上,您需要读取或更改转换后的值:这是对整个合集(到目前为止)进行转换的正确点。
如果这是您想要的,这将是访客模式的完美用例:如果您手头有Python,或者不介意使用安装,下面是如何设置访问者模式的一个很好的示例。
#!/usr/bin/env python3
class Container:
def __init__(self, values):
self._values = values
def transform(self, transformator):
self._values = transformator.transform(self._values)
def accept(self, visitor):
visitor.visit(self)
class Visitor:
pass
class Transformator(Visitor):
pass
class DoublingVisitor(Transformator):
def visit(self, container):
container.transform(self)
def transform(self, values):
return list(map(lambda x: 2*x, values))
def main():
container = Container([1, 2, 3])
doublingVisitor = DoublingVisitor()
container.accept(doublingVisitor)
print(container._values)
if __name__ == '__main__':
main()总之,python代码很容易理解。关键是,您需要一个类,我称之为(没有更好的名称) Container,它accepts是一个访问者。另一方面,您需要一个从Visitor派生的对象,该对象将算法作为Transformator (这是您使用的术语)。Visitor需要一个方法visit,它有一个参数(它访问的对象)。这就是全部魔法。
访问时,访问者调用对象上的transform method进行访问,而后者则接收实现transform方法的Visitor / Transformator。就这样。
每次您想要对您的集合做一些事情时,您可以接受另一个Visitor。
https://softwareengineering.stackexchange.com/questions/289235
复制相似问题