Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在基于GUI的应用程序中处理不变性_Oop_Immutability_Observer Pattern - Fatal编程技术网

Oop 在基于GUI的应用程序中处理不变性

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

我有一个基于GUI的应用程序(Kotlin),它由左侧的
注释列表(显示注释标题)和右侧的选定
注释的编辑屏幕组成

当用户在编辑屏幕中修改标题时,列表项必须显示新标题

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

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上显示不可变的节点对象


现在,您必须在保持节点类不变的优点和在节点类周围添加可变包装器的缺点之间取得平衡。但这是你的决定;取决于您的上下文。

谢谢您的回答。这样,
监听器
就被添加到可变的
注释容器
,而不是添加到
注释
,不是吗?我就是这么做的。