...
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;
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) { ... }
} |
...
- we still have three classes here (mixin, parameters and domain event), but we have removed the duplication between the
act(...)
parameter list and the list of members ofPlaceOrderParameters
class
...
Parameters everywhere syntax (proposed)
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):
Code Block |
---|
@Action
public class Customer_placeOrder {
private final Customer target;
public Customer_placeOrder(Customer target) { ... }
@Value @Accessors(fluent = true)
public static class PlaceOrderParameters {
Product product;
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() { return params.hide(this); }
public String disableAct() { return params.disable(this); }
public String disable1Act(PlaceOrderParameters params) { return params.disable1(this); }
public Collection<Product> choices0Act() { return params.choices0(this); }
public Product default0Act() { return params.default0(this); }
public int default1Act() { return params }
public String validate1Act(PlaceOrderParameters params) { ... }
public String validateAct(PlaceOrderParameters params) { ... }
} |
Mixins and Parameters combined (proposed)
...