Download - Groovy Architectural Flexibility
![Page 1: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/1.jpg)
Architectural Flexibility
using Groovy
![Page 3: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/3.jpg)
What kind
of
Code is Best?
![Page 4: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/4.jpg)
Object Oriented
or
Functional?
![Page 5: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/5.jpg)
Strongly Typed
or
Weakly Typed?
![Page 6: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/6.jpg)
To Meta
or
Not to Meta?
![Page 7: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/7.jpg)
Data
or
Type
![Page 8: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/8.jpg)
Why?
![Page 9: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/9.jpg)
●Non functional requirements
[tx/ sec, latency, deployment etc]
![Page 10: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/10.jpg)
●Non functional requirements
[tx/ sec, latency, deployment etc]
●Developer Comprehension
![Page 11: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/11.jpg)
●Non functional requirements
[tx/ sec, latency, deployment etc]
●Developer Comprehension
●Coding Style
![Page 12: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/12.jpg)
●Non functional requirements
[tx/ sec, latency, deployment etc]
●Developer Comprehension
●Coding Style
●Data Model(s)
![Page 13: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/13.jpg)
●Non functional requirements
[tx/ sec, latency, deployment etc]
●Developer Comprehension
●Coding Style
●Data Model(s)
●Others … [bias...?]
![Page 14: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/14.jpg)
Forces on Code
![Page 15: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/15.jpg)
What kind
of
Code is Best?
![Page 16: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/16.jpg)
WrongQuestion
![Page 17: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/17.jpg)
![Page 18: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/18.jpg)
Core Domain
Application PoliciesBusiness Rules
![Page 19: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/19.jpg)
Core Domain
Application PoliciesBusiness Rules
![Page 20: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/20.jpg)
Core Domain
Application PoliciesBusiness Rules
REST
![Page 21: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/21.jpg)
Core Domain
Application PoliciesBusiness Rules
REST
Events
![Page 22: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/22.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTProvided API
Events
![Page 23: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/23.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTProvided API
UserDSL
Events
![Page 24: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/24.jpg)
Context
![Page 25: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/25.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTProvided API
UserDSL
Events
![Page 26: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/26.jpg)
Core Domain
Application PoliciesBusiness Rules
![Page 27: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/27.jpg)
Core Domain
Application PoliciesBusiness Rules
![Page 28: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/28.jpg)
Core Domain
Application PoliciesBusiness Rules
Core Domain
![Page 29: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/29.jpg)
Core Domain
Application PoliciesBusiness Rules
Core Domain
Forces
![Page 30: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/30.jpg)
Core Domain
Application PoliciesBusiness Rules
Core Domain
Forces● Express Type
![Page 31: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/31.jpg)
Core Domain
Application PoliciesBusiness Rules
Core Domain
Forces● Express Type
● Understand Identity
![Page 32: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/32.jpg)
Core Domain
Application PoliciesBusiness Rules
Core Domain
Forces● Express Type
● Understand Identity
● Use Ubiquitous Language
![Page 33: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/33.jpg)
Core Domain
Application PoliciesBusiness Rules
Core Domain
Forces● Express Type
● Understand Identity
● Use Ubiquitous Language
● Relatively high code churn
![Page 34: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/34.jpg)
OrderMenu
Recipe
![Page 35: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/35.jpg)
OrderMenu
Recipe
orderId
recipeId
menuId
![Page 36: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/36.jpg)
class OrderService {
}
def process( def order ) { if (valid(order)) { dispatch(order) persist(order) return OrderResult.SENT } OrderResult.INVALID //or similar}
![Page 37: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/37.jpg)
class OrderService {
}
process( Order order ) { if (valid(order)) { dispatch(order) persist(order) return OrderResult.SENT } OrderResult.INVALID //or similar}
OrderResult
![Page 38: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/38.jpg)
class OrderService {
}
process( Order order ) { if (valid(order)) { dispatch(order) persist(order) return OrderResult.SENT } OrderResult.INVALID //or similar}
OrderResultvalidateAndDispatch
![Page 39: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/39.jpg)
Core Domain
Application PoliciesBusiness Rules
REST
Events
Provided API
UserDSL
![Page 40: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/40.jpg)
Events
![Page 41: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/41.jpg)
Events
![Page 42: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/42.jpg)
EventsEvent Processor
![Page 43: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/43.jpg)
EventsEvent Processor
Subscription
Subscription
Subscription
![Page 44: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/44.jpg)
EventsEvent Processor
Subscription
Subscription
Subscription
Event
![Page 45: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/45.jpg)
EventsEvent Processor
Subscription
Subscription
Subscription
![Page 46: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/46.jpg)
Events
Forces
Event Processor
![Page 47: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/47.jpg)
EventsEvent Processor
Forces● Performance
![Page 48: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/48.jpg)
EventsEvent Processor
Forces● Performance
● Technically focused, technical language
![Page 49: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/49.jpg)
EventsEvent Processor
Forces● Performance
● Technically focused, technical language
● No interest in type or identity
![Page 50: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/50.jpg)
EventsEvent Processor
Forces● Performance
● Technically focused, technical language
● No interest in type or identity
● Interest in functionality
![Page 51: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/51.jpg)
EventsEvent Processor
Forces● Performance
● Technically focused, technical language
● No interest in type or identity
● Interest in functionality
● Data/ algorithm oriented
![Page 52: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/52.jpg)
class EventProcessor {
List<Subscription> subscriptions
}
void process(Message message) { subscriptions.findAll { it.canHandle(message) }.each { it.dispatch(message) }}
![Page 53: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/53.jpg)
class EventProcessor {
List<Subscription> subscriptions
}
void process(Message message) { subscriptions.findAll { it.canHandle(message) }.each { it.dispatch(message) }}
![Page 54: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/54.jpg)
class EventProcessor {
List<Subscription> subscriptions
}
void process(Message message) { subscriptions.findAll { it.canHandle(message) }.each { it.dispatch(message) }}
200k messages : 450ms
![Page 55: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/55.jpg)
class EventProcessor {
List<Subscription> subscriptions
}
void process(Message message) { for(Subscription sub in subscriptions) { if(it.canHandle(message)) {
it.dispatch(message) } }}
80ms200k messages : 450ms
![Page 56: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/56.jpg)
class EventProcessor {
List<Subscription> subscriptions
}
@CompileStaticvoid process(Message message) { for(Subscription sub in subscriptions) { if(it.canHandle(message)) {
it.dispatch(message) } }}
30ms200k messages : 450ms 80ms
![Page 57: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/57.jpg)
Core Domain
Application PoliciesBusiness Rules
REST
Events
Provided API
UserDSL
![Page 58: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/58.jpg)
Core Domain
Application PoliciesBusiness Rules
REST
Events
Provided API
UserDSL
![Page 59: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/59.jpg)
Core Domain
Application PoliciesBusiness Rules
REST
![Page 60: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/60.jpg)
Core Domain
Application PoliciesBusiness Rules
REST
![Page 61: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/61.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTDomain Transformer
![Page 62: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/62.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTDomain Transformer
Forces
![Page 63: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/63.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTDomain Transformer
Forces● Interested only in integration
![Page 64: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/64.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTDomain Transformer
Forces● Interested only in integration
● Designed to remove type
![Page 65: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/65.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTDomain Transformer
Forces● Interested only in integration
● Designed to remove type
● Affinity with Data & Values
![Page 66: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/66.jpg)
Core Domain
Application PoliciesBusiness Rules
RESTDomain Transformer
Forces● Interested only in integration
● Designed to remove type
● Affinity with Data & Values
● Data Transformation
![Page 67: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/67.jpg)
class OrderTransformer {
}
def send(Message message) { RestMessage msg = New RestMessage()
msg.txt = message.text target.doProcessing(msg)}
![Page 68: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/68.jpg)
class OrderTransformer {
}
def send(Message message) { RestMessage msg = New RestMessage()
msg.txt = message.text target.doProcessing(msg)}
![Page 69: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/69.jpg)
class OrderTransformer {
}
def send(Message message) { RestMessage msg = New RestMessage()
msg.txt = message.text target.doProcessing(msg)}
![Page 70: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/70.jpg)
msg.txt = message.text target.doProcessing(msg)
![Page 71: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/71.jpg)
def msg=[txt:message.text] target.doProcessing(msg)
![Page 72: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/72.jpg)
def transformer = { target, message ->
def msg=[text:message.text] target.doProcessing(msg) }
![Page 73: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/73.jpg)
def transformer = { message, target ->
def msg=[txt:message.text] target.doProcessing(msg) }
transformer = transformer.curry(aTarget)transformer(text:”Hello GGX!”)
![Page 74: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/74.jpg)
Core Domain
Application PoliciesBusiness Rules
REST
Events
Provided API
UserDSL
![Page 75: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/75.jpg)
UserDSL
![Page 76: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/76.jpg)
UserDSL
Domain SpecificLanguage
![Page 77: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/77.jpg)
UserDSL
Domain SpecificLanguage
Forces
![Page 78: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/78.jpg)
UserDSL
Domain SpecificLanguage
Forces● User Comprehension
![Page 79: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/79.jpg)
UserDSL
Domain SpecificLanguage
Forces● User Comprehension
● Expressiveness
![Page 80: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/80.jpg)
UserDSL
Domain SpecificLanguage
Forces● User Comprehension
● Expressiveness
● Ease of Use versus Intuitive
![Page 81: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/81.jpg)
def orders = Order.findAllByUserName(“someone”)
![Page 82: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/82.jpg)
def orders = Order.findAllByUserNameAndOrderTax\BetweenOrOrderValueLessThanAndAddress1Like( “someone”, 5, 6, 15.20, “%Some Street%”)
![Page 83: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/83.jpg)
def orders = Order.findAllByUserNameAndOrderTax\BetweenOrOrderValueLessThanAndAddress1Like( “someone”, 5, 6, 15.20, “%Some Street%”)
def orders = Order.findAll { username == “someone” orderValue in [5 .. 6] address1 =~ “%Some Street%”}
![Page 84: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/84.jpg)
def orders = Order.findAllByUserNameAndOrderTax\BetweenOrOrderValueLessThanAndAddress1Like( “someone”, 5, 6, 15.20, “%Some Street%”)
def orders = Order.findAll { username == “someone” orderValue in [5 .. 6] address1 =~ “%Some Street%”}
![Page 85: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/85.jpg)
Core Domain
Application PoliciesBusiness Rules
Core Domain
Forces● Express Type
● Understand Identity
● Use Ubiquitous Language
● Relatively high code churn
![Page 86: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/86.jpg)
Core Domain
Application PoliciesBusiness Rules
Core Domain
Forces● Express Type
● Understand Identity
● Use Ubiquitous Language
● Relatively high code churn
![Page 87: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/87.jpg)
List<Order> findAuthorisedRecords(User user) {
List<Order> orders = Orders.list()
List<Order> selectedOrders = new ArrayList<>();
for(Order order: orders) { if(order.user == user) { SelectedOrders << order }}
return Collections.sort(selectedOrders)
}
![Page 88: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/88.jpg)
List<Order> findAuthorisedRecords(User user) {
List<Order> orders = Orders.list()
List<Order> selectedOrders = new ArrayList<>();
for(Order order: orders) { if(order.user == user) { SelectedOrders << order }}
return Collections.sort(selectedOrders)
}
![Page 89: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/89.jpg)
List<Order> findAuthorisedRecords(User user) {
List<Order> orders = Orders.list()
List<Order> selectedOrders = new ArrayList<>();
for(Order order: orders) { if(order.user == user) { selectedOrders << order }}
return Collections.sort(selectedOrders)
}
![Page 90: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/90.jpg)
List<Order> findAuthorisedRecords(User user) {
def orders = Orders.list()
def selectedOrders = []
for(def order: orders) { if(order.user == user) { selectedOrders << order }}
return Collections.sort(selectedOrders)
}
![Page 91: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/91.jpg)
List<Order> findAuthorisedRecords(User user) {
def orders = Orders.list()
def selectedOrders = orders.findAll { order.user == user}
return Collections.sort(selectedOrders)
}
![Page 92: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/92.jpg)
List<Order> findAuthorisedRecords(User user) {
def orders = Orders.list()
return orders.findAll { order.user == user}.sort { order.id}
}
![Page 93: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/93.jpg)
List<OrderDetails> findAuthorisedRecords(User user) {
def orders = Orders.list()
return orders.findAll { it.user == user}.sort { it.id}.collect { it as OrderDetails}
}
![Page 94: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/94.jpg)
Understand Context
![Page 95: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/95.jpg)
Understand Context
Identify Forces
![Page 96: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/96.jpg)
Understand Context
Identify Forces
Drive Code
![Page 97: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/97.jpg)
Understand Context
Identify Forces
Drive Code
![Page 98: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/98.jpg)
Reject Dogma
![Page 99: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/99.jpg)
Questions
@davidthecoder
![Page 100: Groovy Architectural Flexibility](https://reader034.vdocuments.net/reader034/viewer/2022052619/55610641d8b42a8c388b593a/html5/thumbnails/100.jpg)
Thank you!
@davidthecoder