window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster już istnieje') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() MIEĆ CZY BYĆ? - The Codest
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

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
Rozwiązania dla przedsiębiorstw i scaleupów

Kompletny przewodnik po narzędziach i technikach audytu IT

Audyty IT zapewniają bezpieczne, wydajne i zgodne z przepisami systemy. Dowiedz się więcej o ich znaczeniu, czytając cały artykuł.

The Codest
Jakub Jakubowicz CTO & Współzałożyciel

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