C++:传递结构与提供评估函数

C++: passing structs vs providing assessor functions

我有以下 (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
};

在以下方面:可重用性面向未来良好的编码习惯 哪个是更理想的选择,是否存在一种方法优于另一种方法的情况?

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

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

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

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

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

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

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

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