具有副作用的不同功能或单个可分配属性?

时间:2017-07-27 10:49:18

标签: c++ c++14 api-design gui-toolkit

我正在设计/编写一个小的UI工具包(为了自我改善的目的,还有什么?)我不确定哪种API在以下意义上会更好:

  1. 最低WTF?水平。
  2. 最灵活。
  3. 最简洁,最具描述性的
  4. 最适合使用标准C ++。
  5. 一些重要的元素:

    • window类代表好,一个窗口,可以显示,隐藏,最小化,最大化,全屏最大化和关闭。
    • 我有一个proxy_property类,可以分配任意的get和set函数,例如反映应该通过某些外部API调用获取或设置的当前值。
    • 我还有一个property类可以连接到(即观察到),当它被分配一个新的/不同的值时,会将这个新值发送给它的观察者。

    我不确定处理窗口状态的最佳方法是什么:

    1. 私有成员变量,只能通过hide()isVisible()等成员函数访问,Qt样式。
    2. 只读属性(需要一些额外的实现,因为我目前没有这个功能),由hide()show()等支持,并相应更新。
    3. 可以为proxy_property分配新状态,从而在分配新值时调用hide()show()等或其组合。
    4. 乍一看,由于原因3,我更喜欢3号,但鉴于其他条件,我不确定这种设计能保持多久。可以说我没有看到我的3号在任何地方都使用过,而且我害怕过多地依赖我的proxy_property概念,因为它可能会产生比它的价值更多的开销(另一方面,这是UI代码)我们正在讨论,但仍然存在开销。

      为清楚起见:

      enum class window_state { windowed, hidden, minimized, maximized, fullscreen_maximized };
      class window
      {
      public:
        proxy_property<window_state> state;
        //....
      };
      

      所以可以做到

      some_window.state = window_state::minimized;
      

      实际上做一些更传统的事情,例如

      some_window.minimize();
      

      最终结果当然在功能上是相同的。它只是完全不同的API。

1 个答案:

答案 0 :(得分:0)

我认为你应该小心区分你可以设置的属性(例如,你可以观察到的属性visibility(例如isVisible),因为在很多情况下可观察属性依赖不只是设置。

一个控件,例如isVisible,如果它有visibility == true并且它是容器isVisible

没有理由让控件的visibility设置可观察,事实上它可能会导致错误。

出于这个原因,我更喜欢visibility的setter和getter,以及isVisible的可听属性。