sobota, 15 pa藕dziernika 2022

Metoda Prywatna vs. Value Object

馃敀 Metoda Prywatna

Na samym pocz膮tku musimy odpowiedzie膰 sobie na pytanie dlaczego tworzymy metody prywatne:

  • potrzebujemy wsp贸艂dzieli膰 kod w conajmniej dw贸ch innych metodach danej klasy,
  • chcemy zredukowa膰 z艂o偶ono艣膰 i ukry膰 pewny sp贸jny logicznie kawa艂ek kodu,

Niew膮tpliwie s膮  to dobre powody, ale stosowanie metody prywatnej nie jest najlepszym sposobem na uwsp贸lnianie kodu czy redukowania jego z艂o偶ono艣ci.  

 

馃挕 Narodziny Konceptu Domenowego

Mamy klas臋 ShippingService z metod膮 publiczn膮 getCost zwracaj膮c膮 cen臋 wysy艂ki. W samym ciele tej metody zaczyna rosn膮膰 ilo艣膰 linii kodu weryfikuj膮cego czy dostawa powinna by膰 darmowa czy nie. Logika nie jest banalna i na podstawie nowych wytycznych biznesu koncept darmowej wysy艂ki jest dopiero implementowany w kodzie.

final class ShippingService 
{
	public function getCost(...): Money 
	{
		// call private method
	}

	private function isFree(...): bool 
	{
		// using class dependencies
	}
}

Nie wchodz膮c w szczeg贸艂y implementacji, skupmy si臋 na samym fakcie powstania nowej metody prywatnej ShippingService::isFree - czyli zredukwaniu z艂o偶ono艣cie metody g艂贸wnej ShippingService::getCost. Metoda prywatna enkapsuluje warunki podejmuj膮ce decyzj臋 czy wysy艂ka jest darmowa. Wy艂oni艂 si臋 tutaj nowy koncept domenowy i niestety jest on zamodelowany za pomoca metody prywatnej.

Problem pojawia si臋 gdy inny serwis r贸wnie偶 b臋dzie musia艂 operowa膰 na koncepcie darmowej wysy艂ki. W tym wypadku potrzebny by艂by refaktor - upublicznienie metody b膮d藕 wydzielenie jej do nowego serwisu nie wydaje si臋 te偶 dobrym rozwi膮zaniem. Wi臋c je偶eli pozostawimy to w obecnej formie musimy liczy膰 si臋 z nast臋puj膮cymi konsekwencjami:     

❌ niemo偶liwe jest ponowne wykorzystanie metody w innym obszarze,

❌ istnieje ryzyko duplikacji logiki - 艣wiadomej (przez lenistwo programisty) / nie艣wiadomej (trudniej odnale藕膰 logik臋 w metodzie prywatnej ni偶 w osobnej klasie).

❌ modelowanie koncept贸w domenowych za pomoc膮 metod serwisowych ogranicza nasze mo偶liwo艣ci co do rozwoju koncept贸w kt贸re odzwierciedlaj膮. 

Koncept domenowy jest ukryty

 

⚠️ Metoda jako wyra偶anie Konceptu Domenowego

Przechowywanie koncept贸w domenowych w metodach jest bardzo ograniczaj膮ce w ich potencjalnym dalszym rozwoju. Istnieje bardzo du偶a szansa, 偶e sam koncept domenowy z czasem b臋dzie si臋 rozwija艂 nabieraj膮c pe艂niejszego kszta艂tu. 

Je偶eli obecnie oczekujemy tylko odpowiedzi na to czy dla danej kwoty wysy艂ka jest darmowa to w przysz艂o艣ci mo偶emy potrzebowa膰 np. samego progu cenowego darmowej wysy艂ki. Wymaga艂oby to od nas utworzenia kolejnej wyspecjalizowanej metody. 

Co wi臋cej przy nieznajomo艣ci projektu mo偶emy mie膰 problemy z ustaleniem czy taki byt w og贸le istnieje w projekcie - z perspektywy katalog贸w jest on niewidoczny. 

Dodatkowo cementujemy logik臋 biznesow膮 wraz ze sposobem pozyskiwania danych (pobieranie danych z repozytorium) co mo偶e prowadzi膰 do ich parametryzacji b膮d藕 wydzielenia cz臋艣ci logiki do kolejnych metod prywatnych.

 

馃З Value Object

Nie jest to wpis o Value Object'cie samym w sobie dlatego tylko wypisz臋 jego przewagi wzgl臋dem stosowania metod serwisowych:

  • jest uniezale偶niony od kontekstu wywo艂ania,
  • nazwa klasy mo偶e nada膰 mu bardziej abstrakcyjny charakter (metoda shippingDays na Value Object ShippingTime::days),  
  • bardzo 艂atwy w testowaniu,
  • jawna i niezale偶na jednostka przechowuj膮ca wiedz臋 domenow膮,
  • widoczny z poziomu katalog贸w,  
  • bardzo 艂atwy do ponownego wykorzystania w innym obszarze. 

 

♻️ Refaktoryzacja do Value Object

Pierwszym etapem refaktoryzacji do Value Object'u mo偶e by膰 transformacja do prywatnej metody statycznej. W tym wypadku wszystkie parametry wej艣ciowe sta艂yby si臋 w dalszym toku przekszta艂ce艅 parametrami konstruktora Value Object'u.

Przenosz膮c odpowiedzialno艣ci do Value Object'u i powi膮zanej z nim Fabryki redukujemy z艂o偶ono艣c samego Serwisu w kt贸rym logika ta si臋 wcze艣niej znajdowa艂a. Zale偶no艣ci przechodz膮 z Serwisu do Fabryki i to w艂a艣nie ona od teraz jest wstrzykiwana do klasy Serwisowej. 

Przekszta艂cenie metody prywatnej na Value Object


Brak komentarzy:

Prze艣lij komentarz