From 50986fa15b312d95e86717259bafca7aeaddf1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 5 Nov 2019 20:07:50 +0200 Subject: [PATCH] #590 arrange Layers into packages and add explanation --- layers/README.md | 80 ++++++++++++++++++- layers/etc/layers.ucls | 28 +++---- .../com/iluwatar/layers/{ => app}/App.java | 15 +++- .../iluwatar/layers/{ => dao}/CakeDao.java | 3 +- .../layers/{ => dao}/CakeLayerDao.java | 3 +- .../layers/{ => dao}/CakeToppingDao.java | 3 +- .../iluwatar/layers/{ => dto}/CakeInfo.java | 2 +- .../layers/{ => dto}/CakeLayerInfo.java | 2 +- .../layers/{ => dto}/CakeToppingInfo.java | 2 +- .../iluwatar/layers/{ => entity}/Cake.java | 4 +- .../layers/{ => entity}/CakeLayer.java | 6 +- .../layers/{ => entity}/CakeTopping.java | 6 +- .../{ => exception}/CakeBakingException.java | 2 +- .../{ => service}/CakeBakingService.java | 6 +- .../{ => service}/CakeBakingServiceImpl.java | 12 ++- .../layers/{ => view}/CakeViewImpl.java | 3 +- .../com/iluwatar/layers/{ => view}/View.java | 2 +- .../iluwatar/layers/{ => app}/AppTest.java | 3 +- .../layers/{ => entity}/CakeTest.java | 5 +- .../CakeBakingExceptionTest.java | 3 +- .../CakeBakingServiceImplTest.java | 7 +- .../layers/{ => view}/CakeViewImplTest.java | 7 +- 22 files changed, 164 insertions(+), 40 deletions(-) rename layers/src/main/java/com/iluwatar/layers/{ => app}/App.java (88%) rename layers/src/main/java/com/iluwatar/layers/{ => dao}/CakeDao.java (94%) rename layers/src/main/java/com/iluwatar/layers/{ => dao}/CakeLayerDao.java (94%) rename layers/src/main/java/com/iluwatar/layers/{ => dao}/CakeToppingDao.java (94%) rename layers/src/main/java/com/iluwatar/layers/{ => dto}/CakeInfo.java (98%) rename layers/src/main/java/com/iluwatar/layers/{ => dto}/CakeLayerInfo.java (98%) rename layers/src/main/java/com/iluwatar/layers/{ => dto}/CakeToppingInfo.java (98%) rename layers/src/main/java/com/iluwatar/layers/{ => entity}/Cake.java (96%) rename layers/src/main/java/com/iluwatar/layers/{ => entity}/CakeLayer.java (94%) rename layers/src/main/java/com/iluwatar/layers/{ => entity}/CakeTopping.java (95%) rename layers/src/main/java/com/iluwatar/layers/{ => exception}/CakeBakingException.java (97%) rename layers/src/main/java/com/iluwatar/layers/{ => service}/CakeBakingService.java (88%) rename layers/src/main/java/com/iluwatar/layers/{ => service}/CakeBakingServiceImpl.java (93%) rename layers/src/main/java/com/iluwatar/layers/{ => view}/CakeViewImpl.java (94%) rename layers/src/main/java/com/iluwatar/layers/{ => view}/View.java (97%) rename layers/src/test/java/com/iluwatar/layers/{ => app}/AppTest.java (95%) rename layers/src/test/java/com/iluwatar/layers/{ => entity}/CakeTest.java (95%) rename layers/src/test/java/com/iluwatar/layers/{ => exception}/CakeBakingExceptionTest.java (95%) rename layers/src/test/java/com/iluwatar/layers/{ => service}/CakeBakingServiceImplTest.java (95%) rename layers/src/test/java/com/iluwatar/layers/{ => view}/CakeViewImplTest.java (92%) diff --git a/layers/README.md b/layers/README.md index 49b74c175..3214a9e61 100644 --- a/layers/README.md +++ b/layers/README.md @@ -12,7 +12,7 @@ tags: --- ## Intent -Layers is an architectural style where software responsibilities are +Layers is an architectural pattern where software responsibilities are divided among the different layers of the application. ![alt text](./etc/layers.png "Layers") @@ -24,6 +24,84 @@ Use the Layers architecture when * you want to prevent a change from propagating throughout the application * you want to make your application more maintainable and testable +## Explanation + +Real world example + +> Consider a web site displaying decorated cakes for weddings and such. Instead of the web page directly reaching into the database, it relies on a service to deliver this information. The service then queries the data layer to assimilate the needed information. + +In Plain Words + +> With Layers architectural pattern different concerns reside on separate layers. View layer is interested only in rendering, service layer assembles the requested data from various sources, and data layer gets the bits from the data storage. + +Wikipedia says + +> In software engineering, multitier architecture (often referred to as n-tier architecture) or multilayered architecture is a client–server architecture in which presentation, application processing, and data management functions are physically separated. + +**Programmatic Example** + +On the data layer, we keep our cake building blocks. Cakes consist of layers and topping. + +```java +@Entity +public class Cake { + + @Id + @GeneratedValue + private Long id; + + @OneToOne(cascade = CascadeType.REMOVE) + private CakeTopping topping; + + @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER) + private Set layers; +} +``` + +The service layer offers CakeBakingService for easy access to different aspects of cakes. + +```java +public interface CakeBakingService { + + void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException; + + List getAllCakes(); + + void saveNewTopping(CakeToppingInfo toppingInfo); + + List getAvailableToppings(); + + void saveNewLayer(CakeLayerInfo layerInfo); + + List getAvailableLayers(); +} +``` + +On the top we have our view responsible of rendering the cakes. + +```java +public interface View { + + void render(); + +} + +public class CakeViewImpl implements View { + + private static final Logger LOGGER = LoggerFactory.getLogger(CakeViewImpl.class); + + private CakeBakingService cakeBakingService; + + public CakeViewImpl(CakeBakingService cakeBakingService) { + this.cakeBakingService = cakeBakingService; + } + + public void render() { + cakeBakingService.getAllCakes().forEach(cake -> LOGGER.info(cake.toString())); + } +} +``` + ## Credits * [Pattern Oriented Software Architecture Vol I-V](http://www.amazon.com/Pattern-Oriented-Software-Architecture-Volume-Patterns/dp/0471958697) diff --git a/layers/etc/layers.ucls b/layers/etc/layers.ucls index 060b391c0..a3cac547a 100644 --- a/layers/etc/layers.ucls +++ b/layers/etc/layers.ucls @@ -1,7 +1,7 @@ - - - - - - - - - - - - - - layers) { + public void setLayers(Set layers) { this.layers = layers; } diff --git a/layers/src/main/java/com/iluwatar/layers/CakeLayer.java b/layers/src/main/java/com/iluwatar/layers/entity/CakeLayer.java similarity index 94% rename from layers/src/main/java/com/iluwatar/layers/CakeLayer.java rename to layers/src/main/java/com/iluwatar/layers/entity/CakeLayer.java index 3f09c8d77..3e3ab8a0e 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeLayer.java +++ b/layers/src/main/java/com/iluwatar/layers/entity/CakeLayer.java @@ -21,7 +21,7 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; @@ -66,7 +66,7 @@ public class CakeLayer { return name; } - public final void setName(String name) { + public void setName(String name) { this.name = name; } @@ -74,7 +74,7 @@ public class CakeLayer { return calories; } - public final void setCalories(int calories) { + public void setCalories(int calories) { this.calories = calories; } diff --git a/layers/src/main/java/com/iluwatar/layers/CakeTopping.java b/layers/src/main/java/com/iluwatar/layers/entity/CakeTopping.java similarity index 95% rename from layers/src/main/java/com/iluwatar/layers/CakeTopping.java rename to layers/src/main/java/com/iluwatar/layers/entity/CakeTopping.java index b4b057dd0..ae5277499 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeTopping.java +++ b/layers/src/main/java/com/iluwatar/layers/entity/CakeTopping.java @@ -21,7 +21,7 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; @@ -66,11 +66,11 @@ public class CakeTopping { return name; } - public final void setName(String name) { + public void setName(String name) { this.name = name; } - public final int getCalories() { + public int getCalories() { return calories; } diff --git a/layers/src/main/java/com/iluwatar/layers/CakeBakingException.java b/layers/src/main/java/com/iluwatar/layers/exception/CakeBakingException.java similarity index 97% rename from layers/src/main/java/com/iluwatar/layers/CakeBakingException.java rename to layers/src/main/java/com/iluwatar/layers/exception/CakeBakingException.java index 32ff30701..a027fee98 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeBakingException.java +++ b/layers/src/main/java/com/iluwatar/layers/exception/CakeBakingException.java @@ -21,7 +21,7 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.exception; /** * Custom exception used in cake baking. diff --git a/layers/src/main/java/com/iluwatar/layers/CakeBakingService.java b/layers/src/main/java/com/iluwatar/layers/service/CakeBakingService.java similarity index 88% rename from layers/src/main/java/com/iluwatar/layers/CakeBakingService.java rename to layers/src/main/java/com/iluwatar/layers/service/CakeBakingService.java index 31eaef83b..1ccfa5cf8 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeBakingService.java +++ b/layers/src/main/java/com/iluwatar/layers/service/CakeBakingService.java @@ -21,8 +21,12 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.service; +import com.iluwatar.layers.dto.CakeInfo; +import com.iluwatar.layers.dto.CakeLayerInfo; +import com.iluwatar.layers.dto.CakeToppingInfo; +import com.iluwatar.layers.exception.CakeBakingException; import java.util.List; /** diff --git a/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java b/layers/src/main/java/com/iluwatar/layers/service/CakeBakingServiceImpl.java similarity index 93% rename from layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java rename to layers/src/main/java/com/iluwatar/layers/service/CakeBakingServiceImpl.java index ac4c11c06..403816421 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java +++ b/layers/src/main/java/com/iluwatar/layers/service/CakeBakingServiceImpl.java @@ -21,8 +21,18 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.service; +import com.iluwatar.layers.dto.CakeInfo; +import com.iluwatar.layers.dto.CakeLayerInfo; +import com.iluwatar.layers.dto.CakeToppingInfo; +import com.iluwatar.layers.dao.CakeDao; +import com.iluwatar.layers.dao.CakeLayerDao; +import com.iluwatar.layers.dao.CakeToppingDao; +import com.iluwatar.layers.entity.Cake; +import com.iluwatar.layers.entity.CakeLayer; +import com.iluwatar.layers.entity.CakeTopping; +import com.iluwatar.layers.exception.CakeBakingException; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; diff --git a/layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java b/layers/src/main/java/com/iluwatar/layers/view/CakeViewImpl.java similarity index 94% rename from layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java rename to layers/src/main/java/com/iluwatar/layers/view/CakeViewImpl.java index 934096673..5fcaac776 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java +++ b/layers/src/main/java/com/iluwatar/layers/view/CakeViewImpl.java @@ -21,8 +21,9 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.view; +import com.iluwatar.layers.service.CakeBakingService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/layers/src/main/java/com/iluwatar/layers/View.java b/layers/src/main/java/com/iluwatar/layers/view/View.java similarity index 97% rename from layers/src/main/java/com/iluwatar/layers/View.java rename to layers/src/main/java/com/iluwatar/layers/view/View.java index 14ab91f03..0002b23f6 100644 --- a/layers/src/main/java/com/iluwatar/layers/View.java +++ b/layers/src/main/java/com/iluwatar/layers/view/View.java @@ -21,7 +21,7 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.view; /** * View interface. diff --git a/layers/src/test/java/com/iluwatar/layers/AppTest.java b/layers/src/test/java/com/iluwatar/layers/app/AppTest.java similarity index 95% rename from layers/src/test/java/com/iluwatar/layers/AppTest.java rename to layers/src/test/java/com/iluwatar/layers/app/AppTest.java index b95e899d7..10d224a8e 100644 --- a/layers/src/test/java/com/iluwatar/layers/AppTest.java +++ b/layers/src/test/java/com/iluwatar/layers/app/AppTest.java @@ -21,8 +21,9 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.app; +import com.iluwatar.layers.app.App; import org.junit.jupiter.api.Test; /** diff --git a/layers/src/test/java/com/iluwatar/layers/CakeTest.java b/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java similarity index 95% rename from layers/src/test/java/com/iluwatar/layers/CakeTest.java rename to layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java index 81bb6d1de..3c0051bbc 100644 --- a/layers/src/test/java/com/iluwatar/layers/CakeTest.java +++ b/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java @@ -21,8 +21,11 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.entity; +import com.iluwatar.layers.entity.Cake; +import com.iluwatar.layers.entity.CakeLayer; +import com.iluwatar.layers.entity.CakeTopping; import org.junit.jupiter.api.Test; import java.util.HashSet; diff --git a/layers/src/test/java/com/iluwatar/layers/CakeBakingExceptionTest.java b/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java similarity index 95% rename from layers/src/test/java/com/iluwatar/layers/CakeBakingExceptionTest.java rename to layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java index 4535be678..8c96b7d8e 100644 --- a/layers/src/test/java/com/iluwatar/layers/CakeBakingExceptionTest.java +++ b/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java @@ -21,8 +21,9 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.exception; +import com.iluwatar.layers.exception.CakeBakingException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/layers/src/test/java/com/iluwatar/layers/CakeBakingServiceImplTest.java b/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java similarity index 95% rename from layers/src/test/java/com/iluwatar/layers/CakeBakingServiceImplTest.java rename to layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java index 21f362329..41c8b1753 100644 --- a/layers/src/test/java/com/iluwatar/layers/CakeBakingServiceImplTest.java +++ b/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java @@ -21,8 +21,13 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.service; +import com.iluwatar.layers.dto.CakeInfo; +import com.iluwatar.layers.dto.CakeLayerInfo; +import com.iluwatar.layers.dto.CakeToppingInfo; +import com.iluwatar.layers.exception.CakeBakingException; +import com.iluwatar.layers.service.CakeBakingServiceImpl; import org.junit.jupiter.api.Test; import java.util.Collections; diff --git a/layers/src/test/java/com/iluwatar/layers/CakeViewImplTest.java b/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java similarity index 92% rename from layers/src/test/java/com/iluwatar/layers/CakeViewImplTest.java rename to layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java index ec19b115c..c396208b7 100644 --- a/layers/src/test/java/com/iluwatar/layers/CakeViewImplTest.java +++ b/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java @@ -21,11 +21,16 @@ * THE SOFTWARE. */ -package com.iluwatar.layers; +package com.iluwatar.layers.view; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; +import com.iluwatar.layers.dto.CakeInfo; +import com.iluwatar.layers.dto.CakeLayerInfo; +import com.iluwatar.layers.dto.CakeToppingInfo; +import com.iluwatar.layers.service.CakeBakingService; +import com.iluwatar.layers.view.CakeViewImpl; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;