我正在构建一个 CLI 国际象棋项目(我的第一个非学校项目)。我的 GameLogic 包中有一个 Board 类,其中包含一个 2D 数组,其中包含代表棋盘的 Piece 对象。我还有一个 ConsoleVisual 类,它使用 StringBuilder 将板呈现到控制台。我想将我的游戏逻辑构建在一个包中,以便正确封装所有内容,并尽可能少地公开访问游戏的内部运作。
我的问题是,在包外发送一个板对象来帮助 ConsoleVisual 类是阻力最小的途径。当然,我可以只传递一个字符串表示,但我最终想要一个 GUI,并且字符串将不再切割它。很难避免将数据传递到包之外。
我无法确定将此对象发送到包外是否是不好的约定。当决定将对象发送到您想要封装的包之外时,我的决策过程应该是什么样的?
封装旨在避免泄露类内部实现的细节。此策略使班级可以自由地更改该实现,而不会破坏应用程序的其他部分。
我们的目标是防止经常困扰软件的脆弱性,即程序员进行“仅一个微小的更改”后应用程序就会失败。封装加上自动化测试,让我们程序员有信心可以重建应用程序的某些部分,而不会导致整个应用程序像纸牌屋一样倒塌。
我的 GameLogic 包中的 Board 类,其中包含带有 Piece 对象的 2D 数组
想象一下,您确实将 Board 类或其组件数组传递给用户界面。然后,稍后,您决定用不同的数据结构替换该二维数组。嘭!现在您的应用程序崩溃或无法编译,因为 UI 代码正在尝试访问不再存在的数组。
为了避免这种脆弱性,应用程序的主板逻辑部分可以设计一种描述主板状态的数据结构,以一种不会不必要地泄露内部细节的方式传达当前状况。
例如,您可以使用 Unicode 的国际象棋字符 以 标准国际象棋符号 定义简单的以逗号分隔的基于文本的棋盘描述:
♖a1,♔a5,…
现在您可以自由地重写您的 Board 类,只要它继续发出相同的文本描述即可。