The Codest
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Branże
    • Fintech i bankowość
    • E-commerce
    • Adtech
    • Healthtech
    • Produkcja
    • Logistyka
    • Motoryzacja
    • IOT
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
Strzałka w tył WSTECZ
2016-09-10
Software Development

MIEĆ CZY BYĆ?

Katarzyna Jaruga

Podczas nauki programowania obiektowego, po opanowaniu podstaw obiektów, pól i metod, większość czasu spędza się na dziedziczeniu. Dziedziczenie oznacza, że przejmujemy część implementacji od klasy bazowej. Wystarczy utworzyć podklasę klasy bazowej, aby odziedziczyć każde nieprywatne pole i metodę.

Samochód i samolot są pojazdami, więc oczywiste jest, że obie te klasy powinny zostać rozszerzone ze wspólnej klasy bazowej o nazwie Vehicle. Jest to typowy przykład akademicki, ale decydując się na powiązanie tych klas relacją dziedziczenia, powinniśmy być świadomi pewnych konsekwencji.

Rys. 1 Implementacja relacji dziedziczenia.

W tym przypadku klasy są ze sobą ściśle powiązane - oznacza to, że zmiany w zachowaniu każdej klasy można osiągnąć poprzez wprowadzenie zmian w klasie bazowej kod. Może to być zarówno zaletą, jak i wadą - zależy to od tego, jakiego rodzaju zachowania oczekujemy. Jeśli dziedziczenie zostanie zastosowane w niewłaściwym momencie, proces dodawania nowej funkcji może napotkać pewne trudności w implementacji, ponieważ nie będzie ona pasować do utworzonego modelu klasy. Będziemy musieli wybierać między duplikowaniem kodu a reorganizacją naszego modelu - a to może być naprawdę czasochłonny proces. Kod wykonujący relację dziedziczenia możemy nazwać "otwartym-zamkniętym" - oznacza to, że jest on otwarty na rozszerzenia, ale zamknięty na modyfikacje. Zakładając, że w klasie Vehicle istnieje ogólna, zdefiniowana obsługa silnika każdego pojazdu, w momencie, w którym chcielibyśmy dodać do naszej hierarchii klas model pojazdu bez silnika (np. roweru), musielibyśmy dokonać poważnych zmian w naszych klasach.

klasa Pojazd
  def start_engine
  end

  def stop_engine
  end
end

class Samolot < Pojazd
  def move
    start_engine
    ...
    stop_engine
  koniec
end

Skład

Jeśli interesuje nas tylko część zachowania istniejącej klasy, dobrą alternatywą dla dziedziczenia jest użycie kompozycji. Zamiast tworzyć podklasy, które dziedziczą każde zachowanie (te, których potrzebujemy i te, których w ogóle nie potrzebujemy), możemy wyizolować potrzebne nam funkcje i wyposażyć nasze obiekty w referencje do nich. W ten sposób porzucamy myślenie, że obiekt jest rodzaj obiekt bazowy, na rzecz stwierdzenia, że zawiera tylko niektóre z jego właściwości.

Rys. 2 Korzystanie z kompozycji

Zgodnie z tym podejściem możemy odizolować kod odpowiedzialny za działanie silnika do autonomicznej klasy o nazwie Engine i umieścić odniesienia do niej tylko w klasach reprezentujących pojazdy z silnikami. Odizolowanie funkcji za pomocą kompozycji uprości strukturę klasy Vehicle i wzmocni hermetyzację poszczególnych klas. Teraz jedynym sposobem, w jaki pojazdy mogą mieć wpływ na silnik, jest użycie jego publicznego interfejsu, ponieważ nie będą już miały informacji o jego implementacji. Co więcej, pozwoli to na użycie różnych typów silników w różnych pojazdach, a nawet umożliwi ich wymianę podczas działania programu. Oczywiście wykorzystanie kompozycji nie jest pozbawione wad - tworzymy luźno powiązany zestaw klas, który można łatwo rozszerzać i który jest otwarty na modyfikacje. Jednocześnie jednak każda klasa jest powiązana z wieloma innymi i musi posiadać informacje o ich interfejsach.

klasa Pojazd
koniec

class Silnik
  def start
  koniec

  def stop
  koniec
koniec

class Samolot < Pojazd
  def initialize
    @engine = Engine.new
  end

  def move
    @engine.start
    @engine.stop
  end

  def change_engine(new_engine)
    @engine = new_engine
  end
end

Wybór

Oba opisane podejścia mają wady i zalety, jak więc wybrać pomiędzy nimi? Dziedziczenie jest specjalizacją, więc najlepiej stosować je tylko do problemów, w których występują relacje typu "is-a" - mamy więc do czynienia z prawdziwą hierarchią typów. Ponieważ dziedziczenie ściśle wiąże ze sobą klasy, w pierwszej kolejności powinniśmy zawsze rozważyć, czy użyć kompozycji, czy nie. Kompozycja powinna być stosowana w przypadku problemów, w których istnieją relacje typu "has-a" - czyli klasa ma wiele części, ale jest czymś więcej niż zbiorem klas. Samolot składa się z części, ale sam w sobie jest czymś więcej - posiada dodatkowe zdolności, takie jak lot. Idąc dalej tym przykładem, poszczególne części mogą występować w różnych specjalistycznych wariantach i wtedy jest to dobry moment na wykorzystanie dziedziczenia.

Dziedziczenie jak i kompozycja to tylko narzędzia, które programiści mają do dyspozycji, więc wybór odpowiedniego narzędzia do konkretnego problemu wymaga doświadczenia. Zatem ćwiczmy i uczmy się na błędach 🙂

Powiązane artykuły

Abstrakcyjna ilustracja malejącego wykresu słupkowego z rosnącą strzałką i złotą monetą symbolizującą efektywność kosztową lub oszczędności. Logo The Codest pojawia się w lewym górnym rogu wraz ze sloganem "In Code We Trust" na jasnoszarym tle.
Software Development

Jak skalować zespół programistów bez utraty jakości produktu?

Skalujesz swój zespół programistów? Dowiedz się, jak się rozwijać bez poświęcania jakości produktu. W tym przewodniku omówiono oznaki, że nadszedł czas na skalowanie, strukturę zespołu, zatrudnianie, przywództwo i narzędzia - a także sposób, w jaki The Codest może...

THEECODEST
Software Development

Tworzenie przyszłościowych aplikacji internetowych: spostrzeżenia zespołu ekspertów The Codest

Odkryj, w jaki sposób The Codest wyróżnia się w tworzeniu skalowalnych, interaktywnych aplikacji internetowych przy użyciu najnowocześniejszych technologii, zapewniając płynne doświadczenia użytkowników na wszystkich platformach. Dowiedz się, w jaki sposób nasza wiedza napędza transformację cyfrową i biznes...

THEECODEST
Software Development

10 najlepszych firm tworzących oprogramowanie na Łotwie

Dowiedz się więcej o najlepszych łotewskich firmach programistycznych i ich innowacyjnych rozwiązaniach w naszym najnowszym artykule. Odkryj, w jaki sposób ci liderzy technologiczni mogą pomóc w rozwoju Twojej firmy.

thecodest
Rozwiązania dla przedsiębiorstw i scaleupów

Podstawy tworzenia oprogramowania Java: Przewodnik po skutecznym outsourcingu

Zapoznaj się z tym niezbędnym przewodnikiem na temat skutecznego tworzenia oprogramowania Java outsourcing, aby zwiększyć wydajność, uzyskać dostęp do wiedzy specjalistycznej i osiągnąć sukces projektu z The Codest.

thecodest
Software Development

Kompletny przewodnik po outsourcingu w Polsce

Wzrost liczby outsourcing w Polsce jest napędzany przez postęp gospodarczy, edukacyjny i technologiczny, sprzyjający rozwojowi IT i przyjazny klimat dla biznesu.

TheCodest

Subskrybuj naszą bazę wiedzy i bądź na bieżąco!

    O nas

    The Codest - Międzynarodowa firma programistyczna z centrami technologicznymi w Polsce.

    Wielka Brytania - siedziba główna

    • Office 303B, 182-184 High Street North E6 2JA
      Londyn, Anglia

    Polska - lokalne centra technologiczne

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polska

      The Codest

    • Strona główna
    • O nas
    • Nasze Usługi
    • Case Studies
    • Nasze Know How
    • Kariera
    • Słownik

      Nasze Usługi

    • Konsultacje IT
    • Software Development
    • Backend Development
    • Frontend Development
    • Zespoły IT
    • Backend Dev
    • Inżynierowie rozwiązań chmurowych
    • Inżynierowie danych
    • Inne
    • Inżynierowie QA

      Raporty

    • Fakty i mity na temat współpracy z zewnętrznym partnerem programistycznym
    • Z USA do Europy: Dlaczego amerykańskie startupy decydują się na relokację do Europy?
    • Porównanie centrów rozwoju Tech Offshore: Tech Offshore Europa (Polska), ASEAN (Filipiny), Eurazja (Turcja)
    • Jakie są największe wyzwania CTO i CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Warunki korzystania z witryny

    Copyright © 2025 by The Codest. Wszelkie prawa zastrzeżone.

    pl_PLPolish
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek pl_PLPolish