【问题标题】:C++: passing structs vs providing assessor functionsC++:传递结构与提供评估函数
【发布时间】:2015-01-12 18:46:44
【问题描述】:

我有以下 (POD) 结构来表示前端所需的数据。

struct data {
    std::string foo;
    std::string bar;
    int baz;
};

我有两个选择:

class backend_option_one {
    //...
public:
    std::list<data> get_data() const;
    void set_data(std::list<data> data_list);
    void update_frontend() // asynchronous changes from the backend
};

v.s.

class backend_option_two {
    //...
public:
    std::string get_foo() const;
    std::string get_bar() const;
    int get_baz() const;
    void set_foo(std::string& old_foo, std::string& new);
    void set_bar(std::string& old_foo, std::string& value);
    void set_baz(std::string& old_foo, int& value);
    void add(std::string& new_foo);
    void update_frontend(); // asynchronous changes from the backend
};

就:可重用性面向未来良好的编码实践而言,这是更理想的选择,是否有一种方法比另一种更好的情况?

【问题讨论】:

  • 你在和什么交流?
  • 这两个选项似乎并不等价,第一个返回data 的列表,而第二个似乎只能处理一个data 记录。第二个选项是否缺少一些选择器?
  • 你要处理什么样的并发?您是否期望其他视图在您使用它时更改数据?您认为需要锁定数据元素吗?
  • @Fozi 是的,他们不见了。在这种情况下, foo 是唯一值,用于标识记录。我会把它添加进去。
  • @Fozi 是的,有并发事件可以改变视图。我已经关注了 MVC,所以这不是这里的问题。

标签: c++ user-interface frontend backend


【解决方案1】:

通常的解决方案是Model View Controller pattern,您的后端是模型,您的 GUI 是视图和控制器。

后端通常提供获取和设置数据(全部或部分数据)的方法并实现subscription pattern,其中视图订阅数据更改通知。此数据更改通知通常包括有关更改内容(索引)甚至所有更改数据的提示。

GUI的显示部分是视图,它订阅模型以获取更改通知并请求并显示需要显示的数据。

模式的控制器部分由按钮或菜单或用户能够用来处理视图中的数据的其他东西完成。当用户更改数据时,您更改模型上的数据,所有视图都会收到通知和更新。

有一个常见的快捷方式,当前视图已经显示了更改的数据并且不需要更新:在这种情况下,更新通知通常包含进行更改的对象的指针(或其他一些 ID),以便视图的更新处理程序可以忽略更改,如果它自己做了。这还要求模型上的设置器具有(可选)参数,用于标识进行更改的对象。

至于模型应该提供多少数据(根据聊天反馈):

模型为初始读取的所有数据以及按需提供单个数据元素提供 getter 是有意义的。在这种情况下,更改通知可以提供更改的元素,这是更有效和可扩展的解决方案。

如果整个列表可以更改,那么您还可以为接受整个列表作为替换的模型提供一个设置器。然后模型可以向视图发送多个单元素更改通知,或者视图可以有第二个更改处理程序,通过完全重新初始化来处理“整个列表已更改”的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多