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

标签 scala functional-programming scalaz

如果有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/

相关文章:

scala - 按ID滑动选择行

functional-programming - 实现组合器演算

r - 为什么我不能在 R 中使用 ifelse 分配函数?

Scalaz 验证 NEL mkString

scala - 如何使用隐式转换将List [A]转换为List [B]

scala - 为具有类型成员的类型解析 `Manifest`

java - 为Scala和Java测试提供Gradle单独的测试类路径依赖项

scala - 无法将环境变量传递给 intellij 中的 sbt 任务

list - F# 类型 obj 但我想要 'a

scala - 用于在我的 Scalaz 析取中联合不相关的失败案例的类型类