Oop 在基于GUI的应用程序中处理不变性
我有一个基于GUI的应用程序(Kotlin),它由左侧的Oop 在基于GUI的应用程序中处理不变性,oop,immutability,observer-pattern,Oop,Immutability,Observer Pattern,我有一个基于GUI的应用程序(Kotlin),它由左侧的注释列表(显示注释标题)和右侧的选定注释的编辑屏幕组成 当用户在编辑屏幕中修改标题时,列表项必须显示新标题 在一个多变的世界里,我会这样做: interface Note { fun title(): String fun content(): String fun setTitle(newTitle: String) fun setContent(newTitle: String) fun addL
注释列表(显示注释标题)和右侧的选定注释的编辑屏幕组成
当用户在编辑屏幕中修改标题时,列表项必须显示新标题
在一个多变的世界里,我会这样做:
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
方法中,会通知侦听器
两个“屏幕”都有相同的注释实例,因此会传播更改
然而,对于不变性:
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上显示不可变的节点对象
现在,您必须在保持节点类不变的优点和在节点类周围添加可变包装器的缺点之间取得平衡。但这是你的决定;取决于您的上下文。谢谢您的回答。这样,监听器
就被添加到可变的注释容器
,而不是添加到注释
,不是吗?我就是这么做的。