From 16c5169c8653d6d2c68655be27f9ff9525334932 Mon Sep 17 00:00:00 2001 From: alemoles Date: Tue, 18 Oct 2022 00:24:12 -0300 Subject: [PATCH] BAEL-5768 - Coupling in Java (#11) (#12881) * BAEL-5768 - Coupling in Java (#11) * BAEL-5768 - Coupling in Java --- patterns-modules/coupling/pom.xml | 14 +++++++ .../java/com/baeldung/loose/CSVExport.java | 14 +++++++ .../com/baeldung/loose/ExportMetadata.java | 8 ++++ .../com/baeldung/loose/FetchMetadata.java | 7 ++++ .../java/com/baeldung/loose/JSONFetch.java | 12 ++++++ .../com/baeldung/loose/MetadataCollector.java | 26 +++++++++++++ .../java/com/baeldung/loose/PDFExport.java | 14 +++++++ .../java/com/baeldung/loose/XMLFetch.java | 13 +++++++ .../java/com/baeldung/tight/CSVExport.java | 14 +++++++ .../java/com/baeldung/tight/JSONFetch.java | 12 ++++++ .../com/baeldung/tight/MetadataCollector.java | 35 +++++++++++++++++ .../java/com/baeldung/tight/PDFExport.java | 13 +++++++ .../java/com/baeldung/tight/XMLFetch.java | 12 ++++++ .../loose/LooselyCouplingUnitTest.java | 38 +++++++++++++++++++ .../tight/TightlyCouplingUnitTest.java | 22 +++++++++++ patterns-modules/pom.xml | 1 + 16 files changed, 255 insertions(+) create mode 100644 patterns-modules/coupling/pom.xml create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/loose/CSVExport.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/loose/ExportMetadata.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/loose/FetchMetadata.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/loose/JSONFetch.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/loose/MetadataCollector.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/loose/PDFExport.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/loose/XMLFetch.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/tight/CSVExport.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/tight/JSONFetch.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/tight/MetadataCollector.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/tight/PDFExport.java create mode 100644 patterns-modules/coupling/src/main/java/com/baeldung/tight/XMLFetch.java create mode 100644 patterns-modules/coupling/src/test/java/com/baeldung/loose/LooselyCouplingUnitTest.java create mode 100644 patterns-modules/coupling/src/test/java/com/baeldung/tight/TightlyCouplingUnitTest.java diff --git a/patterns-modules/coupling/pom.xml b/patterns-modules/coupling/pom.xml new file mode 100644 index 0000000000..9c1a630962 --- /dev/null +++ b/patterns-modules/coupling/pom.xml @@ -0,0 +1,14 @@ + + + + patterns-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + coupling + + \ No newline at end of file diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/CSVExport.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/CSVExport.java new file mode 100644 index 0000000000..28c06e1831 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/CSVExport.java @@ -0,0 +1,14 @@ +package com.baeldung.loose; + +import java.io.File; +import java.util.List; + +public class CSVExport implements ExportMetadata { + @Override + public File export(List metadata) { + System.out.println("Exporting data..."); + // Export Metadata + File outputCSV = null; + return outputCSV; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/ExportMetadata.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/ExportMetadata.java new file mode 100644 index 0000000000..9a21c679b8 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/ExportMetadata.java @@ -0,0 +1,8 @@ +package com.baeldung.loose; + +import java.io.File; +import java.util.List; + +public interface ExportMetadata { + File export(List metadata); +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/FetchMetadata.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/FetchMetadata.java new file mode 100644 index 0000000000..e9e39f4a65 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/FetchMetadata.java @@ -0,0 +1,7 @@ +package com.baeldung.loose; + +import java.util.List; + +public interface FetchMetadata { + List fetchMetadata(); +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/JSONFetch.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/JSONFetch.java new file mode 100644 index 0000000000..4ae178e4eb --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/JSONFetch.java @@ -0,0 +1,12 @@ +package com.baeldung.loose; + +import java.util.ArrayList; +import java.util.List; + +public class JSONFetch implements FetchMetadata{ + @Override + public List fetchMetadata() { + System.out.println("Fetching some json data"); + return new ArrayList<>(); + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/MetadataCollector.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/MetadataCollector.java new file mode 100644 index 0000000000..4a159fc6ad --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/MetadataCollector.java @@ -0,0 +1,26 @@ +package com.baeldung.loose; + +import java.util.List; + +public class MetadataCollector { + private final FetchMetadata fetchMetadata; + private final ExportMetadata exportMetadata; + + public MetadataCollector(FetchMetadata fetchMetadata, ExportMetadata exportMetadata) { + this.fetchMetadata = fetchMetadata; + this.exportMetadata = exportMetadata; + } + + public void collectMetadata() { + List metadata = fetchMetadata.fetchMetadata(); + exportMetadata.export(metadata); + } + + public FetchMetadata getFetchMetadata() { + return fetchMetadata; + } + + public ExportMetadata getExportMetadata() { + return exportMetadata; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/PDFExport.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/PDFExport.java new file mode 100644 index 0000000000..2ac3cfe536 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/PDFExport.java @@ -0,0 +1,14 @@ +package com.baeldung.loose; + +import java.io.File; +import java.util.List; + +public class PDFExport implements ExportMetadata { + @Override + public File export(List metadata) { + System.out.println("PDF Export"); + // Some logic + File outputPDF = null; + return outputPDF; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/XMLFetch.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/XMLFetch.java new file mode 100644 index 0000000000..173c5027e4 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/XMLFetch.java @@ -0,0 +1,13 @@ +package com.baeldung.loose; + +import java.util.ArrayList; +import java.util.List; + +public class XMLFetch implements FetchMetadata { + @Override + public List fetchMetadata() { + List metadata = new ArrayList<>(); + // Do some stuff + return metadata; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/CSVExport.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/CSVExport.java new file mode 100644 index 0000000000..1fe0625d08 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/CSVExport.java @@ -0,0 +1,14 @@ +package com.baeldung.tight; + +import java.io.File; +import java.util.List; + +public class CSVExport { + + public File export(List metadata) { + System.out.println("Exporting data..."); + // Export Metadata + File outputCSV = null; + return outputCSV; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/JSONFetch.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/JSONFetch.java new file mode 100644 index 0000000000..7db44dacf0 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/JSONFetch.java @@ -0,0 +1,12 @@ +package com.baeldung.tight; + +import java.util.ArrayList; +import java.util.List; + +public class JSONFetch { + public List fetchMetadata() { + List metadata = new ArrayList<>(); + // Do some stuff + return metadata; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/MetadataCollector.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/MetadataCollector.java new file mode 100644 index 0000000000..511da537c0 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/MetadataCollector.java @@ -0,0 +1,35 @@ +package com.baeldung.tight; + +import java.util.List; + +public class MetadataCollector { + private XMLFetch xmlFetch = new XMLFetch(); + private JSONFetch jsonFetch = new JSONFetch(); + private CSVExport csvExport = new CSVExport(); + private PDFExport pdfExport = new PDFExport(); + + public void collectMetadata() { + List metadata = xmlFetch.fetchMetadata(); + csvExport.export(metadata); + } + + public void collectMetadata(int inputType, int outputType) { + if (outputType == 1) { + List metadata = null; + if (inputType == 1) { + metadata = xmlFetch.fetchMetadata(); + } else { + metadata = jsonFetch.fetchMetadata(); + } + csvExport.export(metadata); + } else { + List metadata = null; + if (inputType == 1) { + metadata = xmlFetch.fetchMetadata(); + } else { + metadata = jsonFetch.fetchMetadata(); + } + pdfExport.export(metadata); + } + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/PDFExport.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/PDFExport.java new file mode 100644 index 0000000000..d2d0fd4eae --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/PDFExport.java @@ -0,0 +1,13 @@ +package com.baeldung.tight; + +import java.io.File; +import java.util.List; + +public class PDFExport { + public File export(List metadata) { + System.out.println("Exporting data..."); + // Export Metadata + File outputPDF = null; + return outputPDF; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/XMLFetch.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/XMLFetch.java new file mode 100644 index 0000000000..3bb8fa80b0 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/XMLFetch.java @@ -0,0 +1,12 @@ +package com.baeldung.tight; + +import java.util.ArrayList; +import java.util.List; + +public class XMLFetch { + public List fetchMetadata() { + List metadata = new ArrayList<>(); + // Do some stuff + return metadata; + } +} diff --git a/patterns-modules/coupling/src/test/java/com/baeldung/loose/LooselyCouplingUnitTest.java b/patterns-modules/coupling/src/test/java/com/baeldung/loose/LooselyCouplingUnitTest.java new file mode 100644 index 0000000000..a67d7c0211 --- /dev/null +++ b/patterns-modules/coupling/src/test/java/com/baeldung/loose/LooselyCouplingUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.loose; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class LooselyCouplingUnitTest { + + @Test + public void givenMetadataCollector_thenCollectMetadataXMLAndExportCSV() { + FetchMetadata metadata = new XMLFetch(); + ExportMetadata exportMetadata = new CSVExport(); + MetadataCollector collector = new MetadataCollector(metadata, exportMetadata); + collector.collectMetadata(); + assertTrue(collector.getExportMetadata() instanceof CSVExport); + assertTrue(collector.getFetchMetadata() instanceof XMLFetch); + } + + @Test + public void givenMetadataCollector_thenCollectMetadataUsingJSONAndExportPDF() { + FetchMetadata metadata = new JSONFetch(); + ExportMetadata exportMetadata = new PDFExport(); + MetadataCollector collector = new MetadataCollector(metadata, exportMetadata); + collector.collectMetadata(); + assertTrue(collector.getExportMetadata() instanceof PDFExport); + assertTrue(collector.getFetchMetadata() instanceof JSONFetch); + } + + @Test + public void givenMetadataCollector_thenCollectMetadataUsingXMLAndExportPDF() { + FetchMetadata metadata = new XMLFetch(); + ExportMetadata exportMetadata = new PDFExport(); + MetadataCollector collector = new MetadataCollector(metadata, exportMetadata); + collector.collectMetadata(); + assertTrue(collector.getExportMetadata() instanceof PDFExport); + assertTrue(collector.getFetchMetadata() instanceof XMLFetch); + } +} \ No newline at end of file diff --git a/patterns-modules/coupling/src/test/java/com/baeldung/tight/TightlyCouplingUnitTest.java b/patterns-modules/coupling/src/test/java/com/baeldung/tight/TightlyCouplingUnitTest.java new file mode 100644 index 0000000000..886da0a386 --- /dev/null +++ b/patterns-modules/coupling/src/test/java/com/baeldung/tight/TightlyCouplingUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.tight; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; + +import org.junit.jupiter.api.Test; + +class TightlyCouplingUnitTest { + + @Test + public void givenMetadataCollector_thenCollectMetadata() { + MetadataCollector collector = mock(MetadataCollector.class); + doNothing().when(collector) + .collectMetadata(); + } + + @Test + public void givenMetadataCollectorWithDifferentInput_thenCollectMetadata() { + MetadataCollector collector = new MetadataCollector(); + collector.collectMetadata(1, 1); + } +} \ No newline at end of file diff --git a/patterns-modules/pom.xml b/patterns-modules/pom.xml index 87292dd7eb..4c020734bf 100644 --- a/patterns-modules/pom.xml +++ b/patterns-modules/pom.xml @@ -29,6 +29,7 @@ solid clean-architecture enterprise-patterns + coupling