gpt4 book ai didi

oop - 处理基于 GUI 的应用程序中的不变性

转载 作者:行者123 更新时间:2023-12-04 14:03:50 25 4
gpt4 key购买 nike

我有一个基于 GUI 的应用程序 (Kotlin),它由左侧的 Note 列表(它显示笔记的标题)和选定的 Note 组成右侧的版本屏幕。

当用户在编辑界面修改标题时,列表项必须显示新的标题。

在一个多变的世界里,我会做这样的事情:

interface Note {
fun title(): String
fun content(): String
fun setTitle(newTitle: String)
fun setContent(newTitle: String)
fun addListener(l: Listener)
}

class NoteListItem(n: Note) : Listener {

init {
n.addListener(this)
}

override fun onChange() { //from Listener
repaint();
}

fun repaint() {
//code
}

}

class NoteEditionScreen(n: Note) {

fun onTitleTextChanged(newTitle: String) {
n.setTitle(newTitle)
}

//...

}

Note.setTitle 方法中,监听器会收到通知。

两个“屏幕”都有相同的 Note 实例,因此会传播更改。

但是,对于不变性:

interface Note {
fun title()
fun content()
fun title(newTitle: String) : Note
fun content(newContent: String) : Note
}

Note.title(String) 方法返回 Note新实例,而不是更改状态。

在那种情况下,我如何“通知”NoteListItem 标题已更改?

最佳答案

显然,这两个概念在这里不能很好地结合在一起。

UI 元素的本质是:它们允许更改。用户不知道(或不关心)底层对象是否不可变。他想更改该标题。

因此,您有两种选择:

  • 放弃你的节点是不可变的
  • 引入您的 UI 使用的抽象层

换句话说:您可以添加一个可变的 NodeContainer,用于在您的 UI 上显示不可变的节点对象。

现在您必须在保持 Node 类不可变的优势与在 Node 类周围添加可变包装器的劣势之间取得平衡。但那是你的决定;取决于您的上下文。

关于oop - 处理基于 GUI 的应用程序中的不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43111128/

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