gpt4 book ai didi

java - 该设计在多大程度上违反了封装性

转载 作者:行者123 更新时间:2023-12-02 09:39:54 25 4
gpt4 key购买 nike

我正在用 Java 设计一个图形对象。作为设计师,我怀疑这种设计违反了封装,但我想从其他人那里得到一些见解。

在下面,我们有两个接口(interface) Graph 和 Vertex。

图实现负责管理图中的顶点,包括创建、删除、确保施加的约束等。通用参数代表T类型,即存储在一个顶点,以及 W8,它是存储在边中的权重类型:

public interface Graph<T, W>
{
/** Creates and adds a vertex with the value given to this graph */
Vertex<T> createVertex(T value);

/** Performs some arbitrary modification to the vertex given */
void modify(Vertex<T> vertex, ....);

// some other methods...
}

Vertex接口(interface)用于获取和修改顶点的属性,并保存引用;它的实现是由图的实现决定的——客户端不知道其内部实现的任何信息。它可能看起来像这样:

public interface Vertex<T>
{
int getValue();

/** Performs some arbitrary modification to this vertex - same as
* as in modify method in graph */
void modify(...);

// some other methods
}

我使用顶点接口(interface)的原因是客户端可以简单地保留对相关顶点的引用并将该引用传递给图形。我还可以有一个像这样的图形界面:

public interface Graph<T, W>
{
/** Creates and adds a vertex with the value given to this graph */
void createVertex(T value);

/** Performs some arbitrary modification to the vertex given */
void modify(T vertex);

// some other methods...
}

在此图形界面中,“修改”方法始终必须搜索顶点;这将是非常不切实际的,特别是当我们想要经常修改相同的顶点时 - 相反,客户端可以像第一种方法一样保留一个引用 channel 。

我的问题是,我对封装要求非常严格,这是否违反了封装原则?

就我个人而言,我认为这不会违反封装,因为客户端不知道图对象或顶点在内部执行什么操作。然而,我们确实泄漏了图以某种方式使用顶点的信息(尽管确切内部结构没有暴露),而其他库则没有这样做。示例可能是作为图子集的数据结构,例如树和 LinkedList:核心 Java 库中的 LinkedList 实现不会让应用程序注意到使用了某些 Node 接口(interface);我在其他各种库中看到的树实现也没有公开它们的节点。

那么在严格的面向对象术语下,这种设计是否违反了封装性?我也欢迎对现有面向对象库(也在 Java 范围之外)的其他引用,或讨论此主题的文章。

最佳答案

我认为这类似于暴露 Map.Entry 的 Map 接口(interface)。图的概念以顶点的概念为前提——缺一不可。因此,揭露两者是完全合法的。

另一方面,您在此处公开(或可能限制)至少一些实现细节。你的

void modify(T vertex);

Graph假设顶点可通过其内容进行寻址。情况可能并非总是如此。我认为这对T的限制太大了。

我想说,为了确保封装,对图本身的唯一询问操作应该是 Set<Vertex<T>> getVertices 。其余的应该在顶点上。

创建操作应返回它创建的实体:

Vertex<T> createVertex(T value)

然后您可以添加 Graph.createEdge(Vertex<T> v1, Vertex<T> v2)removeEdge(Vertex<T> v1, Vertex<T> v2) .

关于java - 该设计在多大程度上违反了封装性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31949763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com