...
Code Block |
---|
public class Customer { // target @Value @Accessors(fluent = true) public class PlaceOrderParameters { // to assist supporting methods @Parameter() @MemberOrder(1) Product product; @Parameter() @MemberOrder(2) int quantity; } public static class PlacerOrderEvent extends ActionDomainEvent<Customer> {} @Action(domainEvent = PlaceOrderEvent.class) // event publishing public Customer placeOrder(PlaceOrderParameters params) { ... } // execution public boolean hidePlaceOrder() { ... } // supporting methods use PlaceOrderParameters public String disablePlaceOrder() { ... } public String disable1PlaceOrder(PlaceOrderParameters params) { ... } public Collection<Product> choices0PlaceOrder() { ... } public Product default0PlaceOrder() { ... } public int default1PlaceOrder() { ... } public String validate1PlaceOrder(PlaceOrderParameters params) { ... } public String validatePlaceOrder(PlaceOrderParameters params) { ... } } |
...
- this removes the duplication between the
placeOrder(...)
parameter list and the list of members inPlaceOrderParameters
class. - the
@Parameter
and@MemberOrder
syntax would be required by the framework to identify PlaceOrderParameters as a container of parameters (as opposed to a reference object or custom value type)
As a mixin, this becomes:
Code Block |
---|
@Action public class Customer_placeOrder { private final Customer target; // target public Customer_placeOrder(Customer target) { ... } @Value @Accessors(fluent = true) public static class PlaceOrderParameters { // to assist supporting methods Product product;@Parameter() @MemberOrder(1) Product product; @Parameter() @MemberOrder(2) int quantity; } public static class PlaceOrderEvent extends ActionDomainEvent<Customer> {} @Action(domainEvent = PlaceOrderEvent.class) // event publishing public Customer act(PlaceOrderParameters params) { ... } // execution public boolean hideAct() { ... } // supporting methods public String disableAct() { ... } public String disable1Act(PlaceOrderParameters params) { ... } public Collection<Product> choices0Act() { ... } public Product default0Act() { ... } public int default1Act() { ... } public String validate1Act(PlaceOrderParameters params) { ... } public String validateAct(PlaceOrderParameters params) { ... } } |
...
The previous syntax only passes in parameters to some of the supporting methods. For consistency, we could imagine it being passed in always:.With the parameters object passed in everywhere, I could see myself starting to move functionality onto that object. So as an idiom, we might see the following sort of code (in a mixin)
Just focusing on the mixin syntax, this would become:
Code Block |
---|
@Action public class Customer_placeOrder { private final Customer target; // target public Customer_placeOrder(Customer target) { ... } @Value @Accessors(fluent = true) public static class PlaceOrderParameters { // to assist supporting methods @Parameter() @MemberOrder(1) Product product; @Parameter() @MemberOrder(2) int quantity; } public static class PlaceOrderEvent extends ActionDomainEvent<Customer> {} @Action(domainEvent = PlaceOrderEvent.class) // event publishing public Customer act(PlaceOrderParameters params) { ... } // execution public boolean hideAct(PlaceOrderParameters params) { ... } // supporting methods public String disableAct(PlaceOrderParameters params) { ... } public String disable1Act(PlaceOrderParameters params) { ... } public Collection<Product> choices0Act(PlaceOrderParameters params) { ... } public Product default0Act(PlaceOrderParameters params) { ... } public int default1Act(PlaceOrderParameters params) { ... } public String validate1Act(PlaceOrderParameters params) { ... } public String validateAct(PlaceOrderParameters params) { ... } } |
Discussion
With the parameters object passed in everywhere, I could see myself starting to move functionality onto that object. So as an idiom, we might see the following sort of code (in a mixin):
Code Block |
---|
@Action public class Customer_placeOrder { private final Customer target; public Customer_placeOrder(Customer target) { ... } @Value @Accessors(fluent = true) public static class PlaceOrderParameters { public static class PlaceOrderParameters { @Parameter() @MemberOrder(1) Product product; Product product;@Parameter() @MemberOrder(2) int quantity; } public static class PlaceOrderEvent extends ActionDomainEvent<Customer> {} @Action(domainEvent = PlaceOrderEvent.class) public Customer act(PlaceOrderParameters params) { return params.act(this); } public boolean hideAct(PlaceOrderParameters params) { return params.hide(this); } public String disableAct(PlaceOrderParameters params) { return params.disable(this); } public String disable1Act(PlaceOrderParameters params) { return params.disable1(this); } public Collection<Product> choices0Act(PlaceOrderParameters params) { return params.choices0(this); } public Product default0Act(PlaceOrderParameters params) { return params.default0(this); } public int default1Act(PlaceOrderParameters params) { return params.default1(this); } public String validate1Act(PlaceOrderParameters params) { ...return params.validate1(this); } public String validateAct(PlaceOrderParameters params) { ...params.validate(this); } } |
which would then beef up the parameters object:
Mixins and Parameters combined (proposed)
...