• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Po co nam te abstrakcje?

Object Storage Arubacloud
+2 głosów
757 wizyt
pytanie zadane 9 października 2016 w PHP przez HaKIM Szeryf (87,590 p.)
zamknięte 9 października 2016 przez HaKIM

Trochę się wahałem z zadaniem tego pytania, ale kij tam, najwyżej zostanę okrzyknięty idiotą. :p

Hej!

Przez ostatnie 2 dni zastanawiam się nad użytecznością klas abstrakcyjnych (w php, bo nie wiem jak sprawa ma się u innych).

Przejdźmy do kodu:

namespace Sharpness;

abstract class AbstractSharpness
{
    protected $sides;
    protected $radius;

    public function __construct($sides = 0, $radius = 0) // Ustawiłem na 0, aby nie implementować obsługi błędów, która w tym przykładzie nam się nie przyda.
    {
        $this->sides = $sides;
        $this->radius = $radius;
    }

    abstract function getSides();

    abstract function getRadius();
}

Aby było spójnie podam przykładową klasę która jest rozszerzalna o tą abstrakcyjną:

namespace Sharpness;

class Square extends AbstractSharpness
{
    public function getSides()
    {
        return $this->sides;
    }

    public function getRadius()
    {
        return $this->radius * $this->radius;
    }
}

Wywołujemy ten kod za pomocą:

$sharpness = new Sharpness\Square(2, 3);

print $sharpness->getSides(); // zwraca: 2
print $sharpness->getRadius(); // zwraca: 9

No, fajnie, tylko... Takowy kod jest mniej czytelny zrozumiały niżeli w przypadku zastosowania set i get:

$sharpness = new Sharpness\Square();
$sharpness->setSides(2);
print $sharpness->getSides(); // zwraca: 2
$sharpness->setRadius(3);
print $sharpness->getRadius(); // zwraca: 9

Ale w takim przypadku abstrakcja jest zbędna (Każdy przykład, jaki dotychczas widziałem, próbując załapać po co nam abstrakcja, dało się zamienić na takowy).

Oglądałem wczoraj jakieś spotkanie phpersów, tam był przykład czegoś podobnego, z wykorzystaniem seterów oraz jeden z __construct(); gość stwierdził(Ja tak zrozumiałem), że również jest za nimi(set'terami i get'terami), gdyż tego, jak to podsumował: „Nie da się spierdo***”.

No bo tak wiemy i widzimy co setujemy, a w takim __construct() to trza zajrzeć do klasy abstrakcyjnej aby się połapać.

Jak będziemy chcieli wymusić jakąś metodę, która ma się znajdować w „podklasie”, to przecież zastosujemy interface.

Będzie ktoś na tyle miły aby mi wytłumaczyć gdzie takowe abstrakcje będą użyteczne?

komentarz zamknięcia: Problem rozwiązany.
2
komentarz 9 października 2016 przez Patrycjerz Mędrzec (192,320 p.)

Kto pyta, nie wielbłądzi... khmm... nie błądzi wink

2 odpowiedzi

+2 głosów
odpowiedź 9 października 2016 przez efiku Szeryf (75,160 p.)
wybrane 9 października 2016 przez HaKIM
 
Najlepsza

https://webmastah.pl/jak-programowac-obiektowo-cz-1-wstep/

Różnice między klasami abstrakcyjnymi a interfejsami

  • W interfejsach wszystkie metody są abstrakcyjne, natomiast w klasie abstrakcyjnej można stworzyc metody posiadające ciało, jak i abstrakcyjne.
  • W php można dzidziczyć jedynie po jednej klasie, natomiat interfejsów, można implementować wiele. Ponadto interfejsy mogą dziedziczyc wiele interfejów
  • Klasa abstrakcyjna zazwyczaj jest mocno związana z klasami dziedziczącymi w sensie logicznym, czyli np. tworzymy klasę abstrakcyjną Planeta po której dziedziczą konkretne klasy planet (np Ziemia, Mars). Interfejs natomiast nie musi być już tak mocno związany z daną klasą, on określa jej cechy, np możesz stoworzyć interfejs Zniszczalny, który mówi że dany obiekt może zostać zniszczony. Taki interfejs możesz nadać zarówno klasą Planeta, Gwiazda, Budynek itp.

źródło: zasoby.open.agh.edu.pl

 

 

komentarz 9 października 2016 przez efiku Szeryf (75,160 p.)

Który to filmik, gdzie ktoś poleca niby settery? Chyba musiałeś coś źle zrozumieć. 

Bez setterów jest bezpieczniej, bo robisz taki jakby ValueObject gdzie tylko raz możesz coś do niego wrzucić. 

komentarz 9 października 2016 przez HaKIM Szeryf (87,590 p.)
edycja 9 października 2016 przez HaKIM

Zrozumiałem wszystko na odwrót.

https://youtu.be/LpnVG1JbHS0?t=13m22s

(Na swoje usprawiedliwienie mogę powiedzieć, że było strasznie późno i mózg odmawiał posłuszeństwa! :p)

Hmm... Czyli nici z setterów.

Przynajmniej phpstorm pokazuje zmienne jakie musimy wpakować do konstruktora. :)

No dobrze, rozumiem, czyli abstrakcje.

Anyway, w c++ widziałem ich większe korzyści ze względu na te wskaźniki.

Tylko tam to wygląda trochę jakby tworzyli obiekt z abstrakcji, a następnie z abstrakcji brali „podklasę” i wywoływali metodę.

Dziękuję za wyjaśnienie i podesłanie linku do artykułu.

Miłego dnia.

komentarz 9 października 2016 przez HaKIM Szeryf (87,590 p.)

Efiku, czyli ten kod powinien wyglądać tak:

namespace Sharpness;

interface InterfaceSharpness
{
    public function getSides();
    public function getRadius();
}
namespace Sharpness;

abstract class AbstractSharpness implements InterfaceSharpness
{
    protected $sides;
    protected $radius;

    public function __construct($sides = 0, $radius = 0)
    {
        $this->sides = $sides;
        $this->radius = $radius;
    }
}
namespace Sharpness;

class Square extends AbstractSharpness
{
    public function getSides()
    {
        return $this->sides;
    }

    public function getRadius()
    {
        return $this->radius * $this->radius;
    }
}
$sharpness = new Sharpness\Square(2, 3);
print $sharpness->getSides();
print $sharpness->getRadius();

Zgadza się?

komentarz 10 października 2016 przez Boshi VIP (100,240 p.)
Może być, zależy jeszcze na jakim poziomie abstakcji chcemy pisać kod, bo niektórzy robią operują na abstrakcjach abstrakcji dla małych problemów...
+2 głosów
odpowiedź 9 października 2016 przez Patrycjerz Mędrzec (192,320 p.)

Z tego, co wiem, abstrakcja programowania polega jedynie i wyłącznie na uwspólnieniu interfejsu dla różnych typów danych. Czy użyjesz do tego interfejsu, czy klasy abstrakcyjnej, efekt zawsze będzie ten sam, ale oczywiście klasa może mieć w sobie coś dodatkowego, zmniejszającego redundancję kodu w klasach potomnych.

Nie wiem, jak dla innych, ale dla mnie przytoczony przez ciebie przykładowy kod nie ma większego sensu, gdyż równie dobrze gettery mogłyby być w klasie abstrakcyjnej jako zwykłe metody.

Mówię to wszystko przez pryzmat języka C++, więc jeśli czegoś nie rozumiem, proszę mnie poprawić wink

komentarz 9 października 2016 przez HaKIM Szeryf (87,590 p.)

Nie wiem, jak dla innych, ale dla mnie przytoczony przez ciebie przykładowy kod nie ma większego sensu, gdyż równie dobrze gettery mogłyby być w klasie abstrakcyjnej jako zwykłe metody.

Tyle, że każdy przykład który próbuje objaśnić użyteczność abstrakcji kończy się na nieużyteczności.

Dlatego też napisałem:

Będzie ktoś na tyle miły aby mi wytłumaczyć gdzie takowe abstrakcje będą użyteczne?

Dzięki za odpowiedź. :) 

komentarz 9 października 2016 przez Patrycjerz Mędrzec (192,320 p.)

Człowiek lepiej rozumuje na przykładach, więc pokuszę się podać takowy.

Wyobraź sobie system operacyjny i połączenie komunikacyjne OS  sterownik sprzętu. Tzn. system wywołuje kod sterownika, aby on obsłużył podzespół wg danych otrzymanych przez OS. Oczywiście takie sterowniki nie pochodzą od jednego producenta, korzystają z różnych implementacji, a system musi znać od samego początku ich funkcje, aby ujednolicić je ze swoim API. Wynika więc z tego, że te wszystkie sterowniki powinny wspierać jeden ustandaryzowany interfejs, np. narysuj_grafike(), odtworz_dzwiek(), aby wszystko prosto i sprawnie działało.

Oczywiście powyższy przykład nie dotyczy kodu i nie mają tutaj zastosowania pojęcia klasy, interfejsu itp., ale ładnie pokazuje sens abstrakcji w oprogramowaniu - bez niej sporo kodu by się powtarzało, co powodowałoby zmniejszenie jego czytelności.

komentarz 9 października 2016 przez HaKIM Szeryf (87,590 p.)
Przed napisaniem tego tematu nie wiedziałem o paru rzeczach, które abstrakcja jest w stanie zdziałać.

Teraz bardziej rozumiem jak i ich użyteczność jak i oop.

Dzięki. :)

Podobne pytania

0 głosów
1 odpowiedź 130 wizyt
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 18 listopada 2020 w Java przez Szox Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 4,934 wizyt
pytanie zadane 13 września 2016 w Python przez Macek Kolo Mądrala (5,480 p.)

92,680 zapytań

141,583 odpowiedzi

320,068 komentarzy

62,041 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...