gpt4 book ai didi

Scala:UI 对象/渲染器的设计模式

转载 作者:行者123 更新时间:2023-12-02 20:09:43 26 4
gpt4 key购买 nike

如果有rendererobject 会是一个好的设计。

我已经做了几次尝试,但我的代码现在真的很难看。

假设我有一个类 room 和一个应该处理渲染它的类。

  • 谁应该调用 renderer.render(room) 还是应该这样?
  • 我应该有 world.renderRoom() 吗?
  • 或者我应该有 room.renderWith(renderer) 吗?

如何构建简单的单元测试,例如 renderer.render(room, userInteraction)

返回值应该是多少?

world.renderRoom().interact()....

如你所知,我不知道该怎么做哈哈。

我有几年编写软件的经验,但我正在试用 ScalaZ 并尝试更像函数式编程;这对我来说是新的。

谢谢

最佳答案

你似乎在问很多不同的事情,这使得除了非常笼统的方式外很难回答。

不要向数据对象添加呈现代码,因为这会破坏关注点分离。带有 draw 方法的 Shape 类的经典 OO 示例非常适合教学,但它以特定的方式连接有关形状(例如边数)的数据绘制它。相反,创建一个函数 render(s: Shape),它使用 Shape 中的数据以您想要的特定方式绘制(2D、3D 填充、坐标列表等) .).

使您的render 代码具有功能性,以便它返回渲染数据而不是调用渲染库作为副作用。渲染库需要正常运行并返回渲染结果,而不是直接绘制到屏幕上。

将渲染库传递给render 函数(作为隐式 参数)而不是使用全局对象。这允许您使用模拟渲染器测试渲染,并且无论如何都是一种更灵活的设计。但是对于不同的输出设备或样式,您可能仍然需要不同的render 函数。

将渲染与渲染组件的组合分开,以便您可以独立测试它们。

以功能方式构建整个图像,然后通过一个非功能性操作来显示新图像(通过替换当前图像)。

使用用户交互创建具有更新的房间的修改场景,然后重新渲染整个场景。

长话短说

val room = Room(width, length, height)
val room3D = render(room, render3D)
val house = compose(room3d, ..., compose3D)

screen.display(house)

关于Scala:UI 对象/渲染器的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53860615/

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