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

我有一个基于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上元素的本质是:它们允许更改 。 用户不知道(或关心)底层对象是否是不可变的。 他想改变这个标题。

    因此,您有两种选择:

    • 放弃你的节点是不可变的
    • 引入一个用户界面使用的抽象层

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

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