Hi,

I think we need to introduce another mechanism to declare property and
association.
Let's look at dddsample and try to implement Cargo model.

If I want to retain exactly the same Cargo interface:
<code>
public interface Cargo
{
  Location origin();

  Location destination();

  void changeDestination( @NotNull Location newDestination );

    ...
}
</code>

To make Cargo persistable, I need to create a mixin type.
<code>
public interface CargoState
{
  // Unfortunately the name has to be done this way, because our
entity will implement both CargoState and Cargo
  Association<Location> originAssociation();
  Association<Location> destinationAssociation();
}
</code>

And the entity
<code>
@Mixins( CargoEntity.CargoMixin.class )
public interface CargoEntity extends Cargo, CargoState, EntityComposite
{
  class CargoMixin implements CargoEntity
  {
    public final Location origin()
    {
      return orginAssociation.get();
    }

    Location destination()
    {
      return destinationAssociation.get();
    }

    public void changeDestination( @NotNull Location newDestination )
    {
      return destinationAssociation.set( newDestination );
    }
  }
}
</code>

If I have to do this very same thing for every model. I might as well
forget about my productivity.
Adding/Removing property and association is definitely painfull.

But, if we support this
<code>
public interface Cargo
{
  @Association
  Location origin();

  @Association
  Location destination();

  void changeDestination( @NotNull Location newDestination );

    ...
}
</code>

We can reduce the entity implementation to
<code>
@Mixins( CargoEntity.CargoMixin.class )
public interface CargoEntity extends Cargo, EntityComposite
{
  class CargoMixin implements CargoEntity
  {
    @AssociationField private Association<Location> destination;

    public void changeDestination( @NotNull Location newDestination )
    {
      return destination.set( newDestination );
    }
  }
}
</code>
I would not need to care implementing Cargo#origin() and Cargo#association().
Because I already put a @Association annotation.

If I want to implement concern/side effect on the setters or getters
of these association,
this becomes very trivial to do.

How about creational?

EntityBuilder<Cargo> builder = ...;
Cargo cargoTemplate = builder.template();
builder.initialize( cargoTemplate.origin() ).set( origin );
builder.initialize( cargoTemplate.destination() ).set( destination );

Query would be done in similar manner.

wdyt?

Regards,
Edward Yakop

_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev

Reply via email to