C++中物体改变识别的设计模式?

Design Pattern for object alteration recognition in C++?

本文关键字:设计模式 识别 改变 C++      更新时间:2023-10-16

我正在寻找一种机械/设计模式,它允许以某种方式设置对象,以便机械师注意到对象是否在某个存在点(例如构造(后被更改。理想情况下,对象也能够获得有关其更改的信息。

我正在想象一种智能指针和/或接口,它记录写入访问权限并将其传达给对象。

可能的用例: 内容已从文件中加载的对象,如果在销毁时发生更改,则应写入文件。

简单来说,您可以实现对象的所有资源库来单独计算写入访问次数。

class A
{
string filename;
unsigned int altered;
int m_a, m_b, M_c;
public:
A(string filename) : filename(filename), altered(0) { /* parse file */ }
~A() { if(altered) {/* write out to file */} } 
void setA(int a) {altered++; m_a = a}
void setB(int b) {altered++; m_b = b}
void setC(int c) {altered++; m_c = c}
};

我觉得这很难维护,也不是很优雅。此外,这种解决方案对于其他类型的对象也不是很便携。

我认为没有一个简单的通用解决方案,因为您需要做出许多决定。例如,在您的代码中,altered即使a==m_a.在某些情况下,这可能是正确的事情,但在其他情况下则不然。无论如何,这里有一些简单的东西,可以让您选择在成员被修改时要做什么:

#include <iostream>
using namespace std;
template <typename T> 
struct modification_tracking {
using clean_up_t = void(*)(const T&);
modification_tracking(const T& t,clean_up_t clean_up) : 
t(t), clean_up(clean_up) {}
~modification_tracking(){ if(modified) clean_up(t); }
void set(const T& v){
modified = t != v;
t = v;
}
private:
T t;
clean_up_t clean_up;
bool modified = false;
};
struct foo {
modification_tracking<int> member{ 1, [](const int& x){ std::cout << x << 'n';}};
};    
int main() {        
foo f1;
foo f2;
f1.member.set(3);
}

也许带有自定义删除器的智能指针可以以更好的方式执行相同甚至更多操作。如果对象是轻量级的,您甚至可以考虑存储原始对象并在超出范围时进行比较。或者计算哈希值。真的有太多的选择;)

我想不出任何模式可以以某种方式神奇地识别文件已更改; 除非您发现从文件中制作哈希然后比较哈希是可以接受的。在某些时候,您将不得不更改类的状态,以便它写入更改后的文件。这可以通过多种方式完成。

您可以实现的一件事是modify函数,它更改类的状态,并为用户提供更改类的可变版本的选项。

void modify(const std::function<void(Mutable_A&)>& modifier) // Implemented in A
{
modifier(/* the internal stucture */);
this->writeFile = []{/* write out to file */}; // Then called in destructor
}

然后从外部调用,如下所示

a.modify([](auto& a){
a.m_a = 2;
a.m_b = 3;
a.setA(2); // If set is prefered
});

这样就不必添加任意altered计数器。您还可以检查modifier回调是否实际更改,并且仅在更改某些内容时才分配writeFile。在这种情况下,set函数只能在Mutable_A中实现。至于如何称呼这种模式,我不知道。