3

一点背景:

我目前正在完成我的 OOP 课程中的一项任务,其中包括围绕各种设计模式设计和实现电话簿管理器。

在我的项目中,所有动作都围绕着 3 个类发生:

  • PhoneBook;
  • Contact (存储在电话簿中的类型);
  • ContactField (存储在 中的字段Contact)。

ContactManager必须提供一种以 2 种模式迭代其联系人的方法:未过滤和基于谓词过滤;Contact必须提供一种迭代其字段的方法。

我最初决定如何实施:

我遇到的所有设计模式书籍都推荐对接口进行编码,所以我的第一个想法是从上述每个类中提取一个接口,然后让它们实现它。

现在我还必须创建某种多态迭代器以使事情顺利进行,因此我调整了Java 迭代器接口来编写前向迭代器。

问题:

  • 这种设计的主要挫折是我失去了与 stl 的互操作性<algorithm>以及基于范围的 for 循环提供的语法糖。

  • 我遇到的另一个问题是Iterator<T>::remove()功能。如果我想要一个可以改变它迭代的序列(删除元素)的迭代器,那么一切都很好,但是如果我不想要这种行为,我不确定该怎么做。

    我看到在 Java 中可以抛出UnsupportedOperationException 这不是那么糟糕,因为(如果我错了,请纠正我)如果未处理异常,则应用程序将终止并显示堆栈跟踪。在 C++ 中,您并没有真正拥有这种奢侈(除非您运行附加的调试器,我认为),老实说,我宁愿在编译时捕获此类错误。


解决这种混乱的最简单方法(我看到)是避免在可迭代类型上使用接口,以适应我自己的 stl 兼容迭代器。这会增加耦合,但是我不确定从长远来看它是否真的会产生任何影响(当然不是这个项目很快就会变成丢弃的代码)。我的猜测是不会的,我也想在继续我的设计之前听听长辈的意见。

4

1 回答 1

1

我可能会采取稍微不同的方法。

首先,对联系人的迭代非常简单,因为它是一种单一类型的迭代,您只需提供允许对基础字段进行迭代的方法beginend

对于 a 上的迭代,PhoneBook仍然只提供一个普通的beginand end,然后提供一个for_each_if函数,用于仅迭代感兴趣的联系人,而不是尝试提供一个跳过不感兴趣元素的超级自定义迭代器。

于 2013-05-13T19:52:37.393 回答