zoukankan      html  css  js  c++  java
  • It Smells!不要让两个状态纠缠的类同时成为某个事件的观察者(一切都只是视图)

    什么叫状态纠缠?举个例子,有一个饮水机,水温达到100度的时候进入保温状态,而水温低于100度的时候开始加热。那么water就有两种状态:TemperatureBelow100和TemperatureOf100,而饮水机也有两种状态:Keeping和Heating,而饮水机的状态和water的状态是纠缠的,可以说water的状态改变,使得饮水机的状态改变,而饮水机状态的改变,又反过来会影响water的状态。

    什么叫不要让两个状态纠缠的类同时成为某个事件的观察者?举个例子,我们往water中加入冰块,这是一个事件,那么water的温度会从TemperatureOf100转为TemperatureBelow100,这个时候如果饮水机也知道这个事件的发生,并且自动的转入Heating状态,而不是等到water的状态发生改变,那么我们就说,这两个类同时成为了"加入冰块"这个事件的观察者,它们自然要独立的进行状态切换。

    这样会造成什么问题?有可能导致water和饮水机的状态不一致,而它们本该是状态纠缠的。举个例子,加入冰块后,如果水温并没有从100度下降(这是一个神奇的冰块),那么饮水机就错误的进入了heating状态。
    其实一句话可以说清楚这个问题,"一切都只是视图"——《程序猿修真之道》(大雾!)。只要使得饮水机的状态成为water的状态的视图就可以了,换句话,water是系统中的model,而饮水机是view和controller。

    我所困惑的是,用什么来判断,"一切都只是视图",可以运用到当前的代码中?上面的例子实在过于简单,我们可以很容易理解,在实际中的代码,可能就不那么浅显。

    举个和工作相关的例子,豌豆荚连接手机的时候,如果没有安装驱动,需要弹出驱动安装向导,指导用户一步步操作,等到adb发现这个设备了,那么它就认为驱动安装好了而关闭驱动安装向导。而主界面上也会显示手机的状态,等到adb发现这个设备了,那么它就应该去尝试连接安装手机客户端,连接手机。

    上面的讨论中,有两处提到了"等到adb发现这个设备了",那么我们就认为驱动安装向导和主界面应该是这个事件的两个观察者,但是驱动安装向导和主界面是状态纠缠的,主界面实际上就是手机连接状态的视图,手机插入而未安装驱动的状态,会使得驱动安装向导出现,而手机的adb设备被发现了,会使得驱动安装向导消失,所以,驱动安装向导只是手机这两个状态之间转换的视图,而驱动安装向导本身可以有自己的状态,但是手机进入"adb设备已发现"的这个状态时,驱动安装向导一定会跟随着进入"连接向导已完成"的状态。手机连接还有其他的几个状态,而驱动安装向导只是其中一段转换过程的视图。

    关于"一切都是视图",还有一个问题,举个例子,就是主界面上会显示驱动安装向导的状态(正在下载驱动,正在安装驱动,。。。),也会显示守护端安装向导的状态(正在安装守护端,。。。)。那么这个主界面到底是观察哪一个的状态?可以使得这个主界面观察mobile的状态,而当mobile进入"驱动未安装"的状态的时候,就show出一个view来观察驱动安装向导的状态;而当mobile进入"adb设备发现"的状态的时候,就将驱动安装向导的界面close掉,show出守护端安装的界面。

    但是我发现可以让主界面观察mobile的"当前工作状态",它可以是驱动安装向导,也可以是守护端安装向导。这个当前工作状态是mobile的状态的视图(它是mobile的一个变量,但是这个变量的状态不是用有限状态机描述的,当一个变量从一个引用切换到另一个引用的时候,我们就可以称之为该变量的一个状态切换),但是我让它更清晰的在模型这一层出现了,而不是在界面中,实际上,也是主界面的子view的切换(由驱动安装界面到守护端安装界面)来体现——可以工作的代码表达了一些东西,只是你甚至意识不到它的存在,你将使用重构来使得它现形。

  • 相关阅读:
    小程序
    wepy
    html5 +css3 点击后水波纹扩散效果 兼容移动端
    vue+element 切换正式和测试环境
    Nuxt
    vue相关安装命令
    【react】--------------配置react项目根路径-------------【劉】
    【Android】--------------高版本http请求错误-------------【劉】
    【react-native】--------------检测SIM卡是否安装-------------【劉】
    【javascript】--------------http-------------【劉】
  • 原文地址:https://www.cnblogs.com/zhengwenwei/p/2547015.html
Copyright © 2011-2022 走看看