什么时候让 Java 对象在根包之外可见是不好的约定?

问题描述 投票:0回答:1

我正在构建一个 CLI 国际象棋项目(我的第一个非学校项目)。我的 GameLogic 包中有一个 Board 类,其中包含一个 2D 数组,其中包含代表棋盘的 Piece 对象。我还有一个 ConsoleVisual 类,它使用 StringBuilder 将板呈现到控制台。我想将我的游戏逻辑构建在一个包中,以便正确封装所有内容,并尽可能少地公开访问游戏的内部运作。

我的问题是,在包外发送一个板对象来帮助 ConsoleVisual 类是阻力最小的途径。当然,我可以只传递一个字符串表示,但我最终想要一个 GUI,并且字符串将不再切割它。很难避免将数据传递到包之外。

我无法确定将此对象发送到包外是否是不好的约定。当决定将对象发送到您想要封装的包之外时,我的决策过程应该是什么样的?

java intellij-idea encapsulation
1个回答
0
投票

封装旨在避免泄露类内部实现的细节。此策略使班级可以自由地更改该实现,而不会破坏应用程序的其他部分。

我们的目标是防止经常困扰软件的脆弱性,即程序员进行“仅一个微小的更改”后应用程序就会失败。封装加上自动化测试,让我们程序员有信心可以重建应用程序的某些部分,而不会导致整个应用程序像纸牌屋一样倒塌。

我的 GameLogic 包中的 Board 类,其中包含带有 Piece 对象的 2D 数组

想象一下,您确实将 Board 类或其组件数组传递给用户界面。然后,稍后,您决定用不同的数据结构替换该二维数组。嘭!现在您的应用程序崩溃或无法编译,因为 UI 代码正在尝试访问不再存在的数组。

为了避免这种脆弱性,应用程序的主板逻辑部分可以设计一种描述主板状态的数据结构,以一种不会不必要地泄露内部细节的方式传达当前状况。

例如,您可以使用 Unicode 的国际象棋字符 标准国际象棋符号 定义简单的以逗号分隔的基于文本的棋盘描述:

♖a1,♔a5,…

现在您可以自由地重写您的 Board 类,只要它继续发出相同的文本描述即可。

© www.soinside.com 2019 - 2024. All rights reserved.