首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OODesign:调用插入算法的数据结构

OODesign:调用插入算法的数据结构
EN

Software Engineering用户
提问于 2015-07-09 14:48:19
回答 4查看 325关注 0票数 3

我有一个数据结构,它有一个add函数。当用户实例化一个新的数据结构对象时,她可以指定一个算法,该算法将在每次调用add函数时执行,并根据数据结构中先前的值更改新插入的值。该算法需要访问数据结构中的所有数据。

因此,数据结构需要存储一个算法对象(因为每次执行add时都会调用这个对象)。另一方面,算法需要访问数据结构,因此需要存储数据结构对象。

我认为A类有B类的实例,B类有A类的实例的情况通常是不可取的。

有没有人知道如何解决这个问题?

EN

回答 4

Software Engineering用户

发布于 2015-07-09 17:05:26

数据结构应该包含到算法的链接,因为它只有一个算法。对吗?(据我所知所需)

但是,同样的算法,例如,“正常化到平均值”,可以适用于数据结构的许多不同实例。因此,它不应该包含/存储数据结构的实例。相反,它的方法应该将数据结构作为附加参数。例如:

代码语言:javascript
复制
calculate(newValue, existingDataStructure);

然后,数据结构的add()方法调用

代码语言:javascript
复制
tweakedValue = this.algorithm.calculate(newValue, this);
this.add(tweakedValue);
票数 3
EN

Software Engineering用户

发布于 2015-07-09 14:57:35

如果您有这样的循环依赖项,这会提示以下两个问题之一:

  • 这两个对象实际上应该是一个对象。
  • 这两个对象实际上应该是三个对象(将相互关联的部分提取到第三个对象中)。

你所拥有的,是非常不寻常的。在数据结构中添加元素是数据结构的主要职责之一,将其外包给客户,尤其是需要对数据结构的私有内部进行特权访问的方式,似乎是错误的。

这与SortedSet非常不同,它同时需要一个Ordering和一个Equality算法,但是这两个算法都不需要知道关于Set的任何信息,它只需要知道如何比较两个元素。或者一个HashMap,它需要一个能够散列单个元素的Hash算法。这是由算法参数化的数据结构的典型情况。

票数 1
EN

Software Engineering用户

发布于 2015-07-09 19:56:30

我有一个数据结构,它有一个add函数。当用户实例化一个新的数据结构对象时,她可以指定一个算法,该算法将在每次调用add函数时执行,并根据数据结构中先前的值更改新插入的值。该算法需要访问数据结构中的所有数据。

这不是一个好主意,而且也没有什么意义。

如果我没听错,你想要创建一个包含一些元素e1,e2,e3,.的对象。在给定的时间点,您希望对元素进行到目前为止的转换。稍后,您希望对整个集合进行另一次转换。

没有必要在两者之间进行转换,因为无论集合存储值是普通的还是转换的,都没有区别。在给定的时间点上,您需要读取或更改转换后的值:这是对整个合集(到目前为止)进行转换的正确点。

如果这是您想要的,这将是访客模式的完美用例:如果您手头有Python,或者不介意使用安装,下面是如何设置访问者模式的一个很好的示例。

代码语言:javascript
复制
#!/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

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/289235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档