typedef struct _tree {
pTree left, right;
int data;
} Tree, *pTree;
Tree t;
t.left = t.right = NULL;
// Now take action
Since we want to ensure that we take action after every update, get / set routines could be introduced for each field. Yet, now I have the overhead of calling these routines on every access. And I still have to trust that all accesses will use the routines (though using another language like C++, I could make the fields private and force access to the routines).
My research is currently using C#, so I have further tools available to me, specifically accessors. Initially, they seemed to be yet another silly hoop to jump through while writing code. However, they provide a great tool for my present problem, where modifications to fields need to incur side effects. Now for a C# snippet:
private Node pLeft; // Internal storage
public Node left // Public accessor
{
get { return pLeft;}
set
{
if (pLeft == value) return; // discard redundant stores
pLeft = value;
pStack.Push(this); // side effect on update
{
get { return pLeft;}
set
{
if (pLeft == value) return; // discard redundant stores
pLeft = value;
pStack.Push(this); // side effect on update
}
}
So my data structure now has implicit side effects from updates (good for the research). And so any future development doesn't need explicit annotations. All in all, I was quite pleased with this change (except for spending the time debugging the differences between implicit and explicit detection).
No comments:
Post a Comment