diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/BasicBillingPlan.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/BasicBillingPlan.java new file mode 100644 index 00000000..6a5d0341 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/BasicBillingPlan.java @@ -0,0 +1,4 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +public class BasicBillingPlan extends BillingPlan { +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/BillingPlan.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/BillingPlan.java new file mode 100644 index 00000000..d4651641 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/BillingPlan.java @@ -0,0 +1,4 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +public class BillingPlan { +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/Customer.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/Customer.java new file mode 100644 index 00000000..e0c08184 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/Customer.java @@ -0,0 +1,44 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +public class Customer { + + private String name; + + private BillingPlan billingPlan; + + private PaymentHistory paymentHistory; + + public Customer(String name, BillingPlan billingPlan, PaymentHistory paymentHistory) { + this.name = name; + this.billingPlan = billingPlan; + this.paymentHistory = paymentHistory; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BillingPlan getBillingPlan() { + return billingPlan; + } + + public void setBillingPlan(BillingPlan billingPlan) { + this.billingPlan = billingPlan; + } + + public PaymentHistory getPaymentHistory() { + return paymentHistory; + } + + public void setPaymentHistory(PaymentHistory paymentHistory) { + this.paymentHistory = paymentHistory; + } + + public boolean isUnknown() { + return false; + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/CustomerService.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/CustomerService.java new file mode 100644 index 00000000..84e3e65a --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/CustomerService.java @@ -0,0 +1,17 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +public class CustomerService { + + public String customerName(Site site) { + return site.getCustomer().getName(); + } + + public BillingPlan billingPlan(Site site) { + return site.getCustomer().getBillingPlan(); + } + + public int weeksDelinquent(Site site) { + return site.getCustomer().getPaymentHistory().getWeeksDelinquentInLastYear(); + } + +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/NullPaymentHistory.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/NullPaymentHistory.java new file mode 100644 index 00000000..ca0bb9ce --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/NullPaymentHistory.java @@ -0,0 +1,7 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +public class NullPaymentHistory extends PaymentHistory { + public NullPaymentHistory() { + super(0); + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/PaymentHistory.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/PaymentHistory.java new file mode 100644 index 00000000..636802d4 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/PaymentHistory.java @@ -0,0 +1,14 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +public class PaymentHistory { + + private int weeksDelinquentInLastYear; + + public PaymentHistory(int weeksDelinquentInLastYear) { + this.weeksDelinquentInLastYear = weeksDelinquentInLastYear; + } + + public int getWeeksDelinquentInLastYear() { + return this.weeksDelinquentInLastYear; + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/Site.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/Site.java new file mode 100644 index 00000000..adda8f1b --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/Site.java @@ -0,0 +1,14 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +public class Site { + + private Customer customer; + + public Site(Customer customer) { + this.customer = customer.getName().equals("unknown") ? new UnknownCustomer() : customer; + } + + public Customer getCustomer() { + return customer; + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/UnknownCustomer.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/UnknownCustomer.java new file mode 100644 index 00000000..9245b87a --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/UnknownCustomer.java @@ -0,0 +1,18 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +public class UnknownCustomer extends Customer { + + public UnknownCustomer() { + super("unknown", new BasicBillingPlan(), new NullPaymentHistory()); + } + + @Override + public boolean isUnknown() { + return true; + } + + @Override + public String getName() { + return "occupant"; + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/BasicBillingPlan.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/BasicBillingPlan.java new file mode 100644 index 00000000..786f1ead --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/BasicBillingPlan.java @@ -0,0 +1,4 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case._before; + +public class BasicBillingPlan extends BillingPlan { +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/BillingPlan.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/BillingPlan.java new file mode 100644 index 00000000..3c2873ed --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/BillingPlan.java @@ -0,0 +1,4 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case._before; + +public class BillingPlan { +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/Customer.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/Customer.java new file mode 100644 index 00000000..1308df1e --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/Customer.java @@ -0,0 +1,40 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case._before; + +public class Customer { + + private String name; + + private BillingPlan billingPlan; + + private PaymentHistory paymentHistory; + + public Customer(String name, BillingPlan billingPlan, PaymentHistory paymentHistory) { + this.name = name; + this.billingPlan = billingPlan; + this.paymentHistory = paymentHistory; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BillingPlan getBillingPlan() { + return billingPlan; + } + + public void setBillingPlan(BillingPlan billingPlan) { + this.billingPlan = billingPlan; + } + + public PaymentHistory getPaymentHistory() { + return paymentHistory; + } + + public void setPaymentHistory(PaymentHistory paymentHistory) { + this.paymentHistory = paymentHistory; + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/CustomerService.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/CustomerService.java new file mode 100644 index 00000000..58690c33 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/CustomerService.java @@ -0,0 +1,28 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case._before; + +public class CustomerService { + + public String customerName(Site site) { + Customer customer = site.getCustomer(); + + String customerName; + if (customer.getName().equals("unknown")) { + customerName = "occupant"; + } else { + customerName = customer.getName(); + } + + return customerName; + } + + public BillingPlan billingPlan(Site site) { + Customer customer = site.getCustomer(); + return customer.getName().equals("unknown") ? new BasicBillingPlan() : customer.getBillingPlan(); + } + + public int weeksDelinquent(Site site) { + Customer customer = site.getCustomer(); + return customer.getName().equals("unknown") ? 0 : customer.getPaymentHistory().getWeeksDelinquentInLastYear(); + } + +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/PaymentHistory.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/PaymentHistory.java new file mode 100644 index 00000000..7df0608e --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/PaymentHistory.java @@ -0,0 +1,14 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case._before; + +public class PaymentHistory { + + private int weeksDelinquentInLastYear; + + public PaymentHistory(int weeksDelinquentInLastYear) { + this.weeksDelinquentInLastYear = weeksDelinquentInLastYear; + } + + public int getWeeksDelinquentInLastYear() { + return this.weeksDelinquentInLastYear; + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/Site.java b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/Site.java new file mode 100644 index 00000000..f6da0d9b --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/_before/Site.java @@ -0,0 +1,14 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case._before; + +public class Site { + + private Customer customer; + + public Site(Customer customer) { + this.customer = customer; + } + + public Customer getCustomer() { + return customer; + } +} diff --git a/refactoring/src/test/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/CustomerServiceTest.java b/refactoring/src/test/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/CustomerServiceTest.java new file mode 100644 index 00000000..85147ae1 --- /dev/null +++ b/refactoring/src/test/java/com/example/refactoring/_16_temporary_field/_36_introduce_special_case/CustomerServiceTest.java @@ -0,0 +1,39 @@ +package com.example.refactoring._16_temporary_field._36_introduce_special_case; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CustomerServiceTest { + + CustomerService customerService = new CustomerService(); + Customer unknown = new Customer("unknown", null, null); + + BillingPlan billingPlan = new BillingPlan(); + Customer kim = new Customer("kim", billingPlan, new PaymentHistory(1)); + + @Test + void customerName() { + String unknownCustomerName = customerService.customerName(new Site(unknown)); + assertEquals("occupant", unknownCustomerName); + + String customer = customerService.customerName(new Site(kim)); + assertEquals("kim", customer); + } + + @Test + void billingPlan() { + assertTrue((customerService.billingPlan(new Site(unknown)) instanceof BasicBillingPlan)); + + assertEquals(billingPlan, customerService.billingPlan(new Site(kim))); + } + + @Test + void weeksDelingquent() { + assertEquals(1, customerService.weeksDelinquent(new Site(kim))); + + assertEquals(0, customerService.weeksDelinquent(new Site(unknown))); + } + + +} \ No newline at end of file