Aktywne Wpisy
EpicElion +21
Warto napisać do ex co słychać?
Atypical +7
Waszym zdaniem warto kupić Audi TT MK1 225km w quattro z LPG, cała w oryginalnym lakierze na gwincie z poliuretanem, wydechem z kwasówki za około 32k?
Nie jest to wsiurowóz z przelotem bez kata, tylko zadbany praktycznie seryjny egzemplarz. Wygląda identycznie jak na tym zdjęciu
#samochody #motoryzacja #mechanikasamochodowa #audi #quattro #volkswagen
Nie jest to wsiurowóz z przelotem bez kata, tylko zadbany praktycznie seryjny egzemplarz. Wygląda identycznie jak na tym zdjęciu
#samochody #motoryzacja #mechanikasamochodowa #audi #quattro #volkswagen
Przypuśćmy, że mamy klasę abstrakcyjną
Shape
. Mamy też kilka klas konkretnych, tj.
Circle
,
Triangle
, wszystkie dziedziczą po
Shape
i implementują metodę
draw
. Do tej pory wszystko jest zajebiście, OCP jest zachowana, super. Potrzebuję jednak metody, powiedzmy o takiej sygnaturze:
Shape getProperShape(Whatever someArgument)
która na podstawie odpowiedniej wartości argumentu zwróci mi obiekt odpowiedniej klasy dziedziczącej po Shape. A więc przykładowo jeśli dostanie argument o takiej wartości to zwróci mi
Circle
, jak o innej to
Triangle
itd.
Teraz tak, dodanie takiej metody statycznej do klasy
Shape
już będzie pogwałceniem tej reguły - bo jak dojdzie nowy kształt, powiedzmy
Square
, to ta metoda będzie wymagać zmiany, aby obsługiwała tę nową klasę.
Jak to rozwiązać? Stworzyć osobną klasę np.
ShapeFactory
? Ale to w sumie dalej będzie gwałcenie tej zasady, tylko że na innej klasie.
#programowanie #cleancode #oop
Komentarz usunięty przez autora Wpisu
Shape
, powiedzmy tenże właśnie
Square
, to będzie:
- kod klasy
Square
- kod klasy
SquareProvider
-
Shape.providers.add(new SquareProvider())
coś takiego? I wtedy metoda
getProperShape
byłaby
for (ShapeProvider provider: Shape.providers) {
Shape result = provider.create(someArgument);
if(result != null) {
return result;
}
}
zgadza się?
@Marmite: Tak, druga opcja to nie sprawdzać czy null, tylko dać dwie metody:
ShapeProvider.supports(args)
i
ShapeProvider.create(args)
– wtedy możesz iterować i użyć tego co zwróci
true
przy
supports()
. Oczywiście każdy
SquareShapeProvider
, etc implementuje
ShapeProviderInterface
.
Zanim dane/obiekty zostaną zserializowane np do JSONa, muszą zostać „spłaszczone” („znormalizowane”) do prostych danych. Każdy normalizator implementuje NormalizerInterface z dwiema metodami:
normalize()
i
supportsNormalization()
.
Serializer przyjmuje normalizatorów w konstruktorze, a kiedy ma coś zserializować, to iteruje po normalizatorach i korzysta z tego, który twierdzi, że potrafi obsłużyć przekazane dane.
Tym samym Serializer nie ma ścisłych powiązań z danymi, na których ma działać