我正在创建一个模型,其中一个元素可以包含其他元素。我目前正在编写模型的接口,我不确定这两个选项中哪一个是最好的:
interface Container {
List<Element> getElements(); // returns an unmodifiable list.
void addElement(Element e);
void removeElement(Element e);
}interface Container {
List<Element> getElements(); // returns an unmodifiable list.
void setElements(List<Element> elements);
}每种选择的利弊是什么?此外,在这些情况下是否存在“接受”的命名约定,比如使用children而不是elements?
发布于 2013-03-24 21:52:21
这实际上是一个“谁来管理名单”的问题。
在选项1中,您为容器提供元素,并让它负责管理它们:订单、可能拒绝某些元素等等。
对于选项2,容器是一个哑容器。它从其他人那里得到列表,对于它的内容和顺序没有发言权。
选项1将允许您(如果删除getElements())将容器的内容(或部分内容)隐藏在代码中的其他工作流中。它甚至可以通过在容器代码中提供线程安全处理来允许某种类型的多线程(尽管这听起来太过了)。
至于命名--对我来说,“元素”的意思是“我不在乎里面有什么”--所以通用容器会保存元素。“子女”意味着一种依赖关系:要处理父母,必须处理其所有的子女(树式)。
发布于 2013-03-24 21:39:15
我一般倾向于备选案文3:
interface Container {
MutableList<Element> getElements();
}这是大多数在.NET框架中编写的API所使用的模式。它使API尽可能简单--特别是在.NET中,这里有属性getter,就像在myContainer.Elements.Add(new Element())中一样。
https://softwareengineering.stackexchange.com/questions/191790
复制相似问题