【问题标题】:How to implement a list feature that limits options based on other selected options?如何实现基于其他选定选项限制选项的列表功能?
【发布时间】:2020-09-08 12:13:16
【问题描述】:

这是我面临的问题的一般设计问题。

我正在实现用户可以一次选择多个项目的 UI 项目列表。但是,某些选项在某种意义上进行了分组,即由于业务逻辑,一次只能选择其中一项。例如。如果列表包含项目 A、B、C,则需要一种方法来指定可以同时选择 A、B 或 C 的逻辑。

我考虑在类设计中实现一个变量,其中包含已分组的其他项目的列表,因此如果该列表中的任何项目已被选择,则无法选择。但是,这似乎是一件难以维护的事情,因为如果一个组中有 3 个项目,那么如果向该组中添加了一个额外的项目,则必须更新所有 3 个项目。

对于这个问题有什么更好的设计解决方案?

【问题讨论】:

  • 为什么不直接设置一个变量来保存枚举类型,例如int selected = A/B/C/Unchecked?然后每个元素都会在更新前检查它。根据我的 UI 编程经验,最好在“更新”回调中挂钩所有组件,而不是在框架中通知其他组件,例如 Android 上的“onDraw”或 Unity 中的“更新”。

标签: c++ oop design-patterns


【解决方案1】:

一种选择是将std::shared_ptr<unsigned> group_selection 作为每个可选对象中的成员。那么如果两个对象,比如ac 不能同时被选中,共享指针指向同一个对象。这样,选择a 并更新++*a.group_selection 将使您能够在选择c 之前检查*c.group_selection 是否为零。

例子:

#include <memory>

class Selectable {
  private:
    bool selected = false;
    std::shared_ptr<unsigned> group_selection;
  public:
    Selectable() : group_selection(std::make_shared<unsigned>(0)) {}
    ~Selectable() {
      unselect();
    }
    void add_to_group(Selectable const& of) {
      group_selection = of.group_selection;
    }
    bool can_select() const {
      return *group_selection == 0;
    }
    void select() {
      if (!selected)
        ++*group_selection;
      selected = true;
    }
    void unselect() {
      if (selected)
        --*group_selection;
      selected = false;
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2014-06-10
    • 2021-09-25
    • 1970-01-01
    • 2021-05-27
    • 2016-01-12
    相关资源
    最近更新 更多