Na świecie programowania, najbardziej standardowe kody to te, które mają najmniejszą duplikację kodu. Są jednak chwile, kiedy musimy wielokrotnie pisać ten sam kod, aby zrobić prawie to samo z niewielkimi zmianami. W tej sytuacji musimy szukać rozwiązań, które zminimalizują te powtórzenia. Aby walczyć z tymi powtórzeniami, używamy abstrakcyjnych klas i metod.
Rozważmy linię produkcyjną fabryki pączków. Pączki gotuje się w ten sam sposób. Następnie odpowiedni sos do polewania o różnych kolorach i smakach, takich jak kolorowa śmietanka, czekolada, kolorowe tabletki i. Wylewa się na nie. W zależności od rodzaju sosu, jaki się na nie polewa, pakuje się je. Widać, że wszystkie pączki, niezależnie od smaku czy kształtu, mają tę samą metodę przyrządzania. Błędem jest tworzenie osobnej linii produkcyjnej dla każdego koloru pączka. Czy to ma sens? Inną metodą jest współdzielenie linii produkcyjnej aż do etapu gotowania. Pączki są następnie sortowane oddzielnie na koniec etapu nalewania sosu i pakowane na koniec. Poniższy kod przedstawia osobną linię do produkcji pączków czekoladowych w klasie ChocolateDonut:
klasa ChocolateDonut { funkcja publiczna make () { zwróć $ this -> makeDough () -> mouldDonut () -> fryDonut () -> addChocolate () -> packChocolateDonut (); } chroniona funkcja makeDough () { print “najpierw zrób ciasto na pączki.” ; zwróć $ to; } chroniona funkcja MoldDonut () { print “następnie uformuj pączek tak, aby miał kształt koła.” ; zwróć $ to; } chroniona funkcja fryDonut () { print “ostrożnie usmaż pączka.” ; zwróć $ to; } chroniona funkcja addChocolate () { print “Dodaj wystarczającą ilość czekolady do pączka!” ; zwróć $ to; } chroniony pakiet funkcjiChocolateDonut () { print “Zapakuj pączka w brązowym opakowaniu!” ; zwróć $ to; } } $ ChocolateDonut = nowy ChocolateDonut (); $ czekoladaDonut -> zrób ();
Te same kroki powtarza się, aby przygotować pączki z sosem truskawkowym:
klasa StrawberryDonut { funkcja publiczna make () { zwróć $ this -> makeDough () -> mouldDonut () -> fryDonut () -> addStrawberrySauce () -> packStrawberryDonut (); } chroniona funkcja makeDough () { print “najpierw zrób ciasto na pączki.” ; zwróć $ to; } chroniona funkcja MoldDonut () { print “następnie uformuj pączek tak, aby miał kształt koła.” ; zwróć $ to; } chroniona funkcja fryDonut () { print “ostrożnie usmaż pączka.” ; zwróć $ to; } chroniona funkcja addStrawberrySauce () { print “Dodaj wystarczającą ilość truskawek do pączka!” ; zwróć $ to; } chroniony pakiet funkcjiStrawberryDonut () { print “Zapakuj pączka w różowym opakowaniu!” ; zwróć $ to; } } $ strawberryDonut = nowy StrawberryDonut (); $ truskawkowyDonut -> zrób ();
Ale powiedzieliśmy, że nie ma potrzeby powtarzania kodów przygotowania pączków. Ponieważ proces przygotowania pączków, poza częścią dekoracyjną, jest konwencjonalny i powtarzalny. Zamieniamy więc zduplikowane fragmenty kodu w umowę, korzystając z streszczenia:
klasa abstrakcyjna DonutTemplate { funkcja publiczna make () { return $ this -> makeDough () -> mouldDonut () -> fryDonut () -> addDressing () -> packDonut (); } chroniona funkcja makeDough () { print “najpierw zrób ciasto na pączki.” ; zwróć $ to; } chroniona funkcja mouldDonut () { print “następnie uformuj pączek tak, aby miał kształt koła.” ; zwróć $ to; } chroniona funkcja fryDonut () { print “ostrożnie usmaż pączka.” ; zwróć $ to; } chroniona funkcja abstrakcyjna addDressing() ; chroniony pakiet funkcji abstrakcyjnychDonut () ; } class ChocolateDonut Extends DonutTemplate { chroniona funkcja addDressing () { print “Dodaj wystarczającą ilość czekolady do pączka!” ; zwróć $ to; } chroniona funkcja packDonut () { print “Zapakuj pączka w brązowym opakowaniu!” ; zwróć $ to; } } class StrawberryDonut Extends DonutTemplate { funkcja chroniona addDressing () { print “Dodaj odpowiednią ilość sosu truskawkowego do pączka!” ; zwróć $ to; } chroniona funkcja packDonut () { print “Zapakuj pączka w różowym opakowaniu!” ; zwróć $ to; } } $ chocoDonut = nowy ChocolateDonut (); $ chocoDonut -> zrób ();
Jak widać w kodzie, an abstrakcyjny class to klasa zawierająca co najmniej jedną metodę abstrakcyjną. Metody abstrakcyjne nie mają implementacji i jedynie zmuszają klasy potomne do implementacji tych metod. W powyższym kodzie, używając słowa kluczowego Extends, zmusiliśmy klasę potomną do podążania za abstrakcyjną klasą nadrzędną. Jeżeli klasa ChocolateDonut nie zaimplementuje metody adresowania, program napotka błąd.
Wykonanie nowych pączków z dowolnym sosem dekoracyjnym wystarczy, aby zaimplementować nową klasę pączków, klasę abstrakcyjną o nazwie DonutTemplate.
Wniosek
W tym artykule sprawdziliśmy streszczenie i sposób jego wykorzystania. Jak widać, użycie tej metody zmniejsza liczbę linii kodu i czyni go legalnym i niezawodnym. W pracy zespołowej tworzenie kontraktów pomaga liderowi zespołu otrzymać zintegrowane kody. Jednym z głównych zastosowań streszczenia jest sytuacja, gdy chcesz zmusić swój zespół programistów do stworzenia kilku metod i wolisz, aby ich metody były zgodne ze zdefiniowanymi przez Ciebie strukturami. Kolejną ważną kwestią jest to, że klasa może implementować wiele interfejsów, ale dziedziczyć tylko z jednej klasy abstrakcyjnej. Ponieważ interfejs to tylko zbiór abstrakcyjnych metod, aby dowiedzieć się więcej na temat interfejsu, możesz przeczytać nasz artykuł na temat interfejsu i jego zastosowania.
Bezpłatne pobieranie motywów WordPressPobierz motywy WordPressPobierz bezpłatne motywy WordPress PremiumPobieranie premium motywów WordPressdarmowy kurs Udemy do pobraniapobierz oprogramowanie XiaomiPobieranie premium motywów WordPresskurs udemy do pobrania za darmo