I will give a longer reply later, but two quick questions:

1) How do you make your tree read-only ? Ex.: A method builds a tree and
returns it as read-only. There must be no way other than using reflection to
circumvent that.

2) How do you handle enumerator versionning ? If I
modify the structure of the tree, enumerators of that tree must be
invalidated. Even better is if an enumerator on a subtree gets
invalidated, another enumerator on a different and independant subtree
will stay
valid as the change is outside of its
scope. The only solution I saw for that last part is that each node
keep a version and changes are propagated up the hierarchy. The cost
of that appears to be quite prohibitive
so I did not bother to try
it and in my implementation, versionning is done at the tree level
only (ie root node).


Sébastien

On 7/27/07, Barry Kelly <[EMAIL PROTECTED]> wrote:
>
> Sébastien Lorion <[EMAIL PROTECTED]> wrote:
>
> > public interface IReadOnlyTree
> > public interface ITree
> > public interface ITreeNode
>
> I understand what you're aiming at, though I have to say that my
> positive experiences with functional styles of programming and my
> negative experiences of the XML DOM have turned me off this kind of
> approach. I think interfaces aren't suited to this. You can't just have
> any old class implement an ITreeNode interface and expect it to live in
> the tree, because to actually implement the interface, it needs to know
> about the concrete implementation of ITree & friends. Thus, you're
> typically forced to go down the tree node factory route, with all its
> associated non-functional-ness and XML DOM horribleness.
>
> By non-functional-ness, I mean: one of the nicest things about trees is
> that they're recursive and eminently suitable to functional-style
> programming. Writing a tree pattern matcher, tree rewriter, etc. is a
> joy when nodes are simple and recursive. Having to go through a
> factory/owner to create nodes, and having to pass that factory/owner
> around, makes writing traversal and rewrite routines a little too heavy
> and Java-y (in the bad, "enterprise" way) for my personal taste.
>
> I'd consider using containment / aggregation, rather than interfaces, to
> get what you're after.
>
> > In the case where the relationships are stored centrally, the nodes are
> much
> > more lightweight in term of code as most operations gets delegated to
> the
> > tree and there is no need to have internal methods.
>
> If the relationships are stored centrally, it seems to me that there's
> no need for your nodes to implement any interface at all - they can
> simply be System.Object. That would appear to me to be a better
> approach; you could then use a proxy class (I'd choose a concrete sealed
> one rather than an interface) to work with the nodes.
>
> Above all, I'd try to avoid generalizing too early. I've come to think
> that interfaces being used pervasively, very early in a design, is a
> sign of too much generalization too soon.
>
> > In the tree-as-a-node approach you describe,
> >
> > I am curious about where exactly you store the relationships between the
> nodes.
> > I get the general idea and it is something I have explored, but
> > I would like to have more details on your implementation.
>
> The nodes store the relationships; typically as either a (possibly
> sparse, i.e. created on demand) List<> of children, or as a FirstChild
> and NextSibling tuple just like a Lisp cons cell.
>
> Here's an idea (using public fields for exposition):
>
> // In library:
> public class TreeNode<TNode> // maybe ': XxxNode' for extra polymorphism
>     where TNode: TreeNode<TNode>
> {
>     public TNode FirstChild, NextSibling; // or other implementation
>     // as you desire
>
>     // other stuff for algorithms can be added here without
>     // versioning problems interfaces have
> }
> // maybe have different base classes for different implementations
>
> // In user code:
> public class BaseNode : TreeNode<BaseNode>
> {
>     // common functionality etc.
> }
>
> public class MySpecificNode : BaseNode
> {
>     // ...
> }
>
> -- Barry
>
> --
> http://barrkel.blogspot.com/
>
> ===================================
> This list is hosted by DevelopMentor(r)  http://www.develop.com
>
> View archives and manage your subscription(s) at
> http://discuss.develop.com
>



-- 
Sébastien
www.sebastienlorion.com

Reply via email to