So, earlier I asked this question about infinite-depth objects and arrived at using the Composite pattern to model that a freezer contains a rack contains a box and so on and so forth.

There's now been an ask to add the ability to move a container (and its contents) from one hierarchy to another. So, i may start with a situation like this:

Freezer A
+-Rack 1
+--Box A
+---Sample A

Freezer B
+-Rack 2
+--Box B

What I'd like to do is move Box A (and thereby Sample A) from Freezer A Rack 1 to Freezer B Rack 2. There's a few rules to this:

  1. A container can't be moved lower down a hierarchy. IE, I can't put Box A into Box B.
  2. I cannot move a container into an appropriate container that is at capacity. (this is solved, pretty simple).
  3. I can't move a container up the hierarchy. A box can't be on the same level as a rack or a freezer.

How do I represent the x can contain y of these containers, and enforce it when moving between two containers?

  • @DocBrown I apologize, I happened to screw that up. I'll edit the question to reflect the correct name of the pattern. – Adam Wells Dec 28 '17 at 19:48
  • Ok. But where is your actual problem? Give each container a depth attribute (related to its depth in the hierarchy) and a capacity attribute, and then make sure any operation which modifies the containment structure obeys the constraints, which are trivial to check with those attributes. – Doc Brown Dec 28 '17 at 19:52
  • Are Freezer, Rack, and Box different classes? If so it's pretty trivial to restrict what it's direct children can be. For example a Freezer can only have Racks, and Racks can have any of X, Y, and Z. By white-listing children you can enforce rule 1 and 3. – Berin Loritsch Dec 28 '17 at 21:47
  • @BerinLoritsch They are all the same class. – Adam Wells Dec 28 '17 at 22:02
  • @AdamWells how do you identify the type of a node? In other words, how do I know that the node I'm looking at is a Freezer as opposed to a Box? – Berin Loritsch Dec 28 '17 at 22:21

Rules 1 and 3 can be folded together as one rule: moves cannot change the level.

This can be solved by enforcing this rule in the code that would do the move. This code would have to understand how to traverse the structure. Just check that the source is at the same depth as the destination.

So long as that code is the only code that can do a move your business rule is enforced.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.