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 υπάρχει ήδη') } 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 }) }, } } })() ΝΑ ΈΧΕΙΣ Ή ΝΑ ΕΊΣΑΙ; - The Codest
The Codest
  • Σχετικά με εμάς
  • Υπηρεσίες
    • Ανάπτυξη λογισμικού
      • Ανάπτυξη Frontend
      • Backend Ανάπτυξη
    • Staff Augmentation
      • Frontend Developers
      • Backend Developers
      • Μηχανικοί δεδομένων
      • Μηχανικοί cloud
      • Μηχανικοί QA
      • Άλλα
    • Συμβουλευτική
      • Έλεγχος & Συμβουλευτική
  • Βιομηχανίες
    • Fintech & Τραπεζική
    • E-commerce
    • Adtech
    • Healthtech
    • Κατασκευή
    • Εφοδιαστική
    • Αυτοκίνητο
    • IOT
  • Αξία για
    • CEO
    • CTO
    • Διευθυντής παράδοσης
  • Η ομάδα μας
  • Case Studies
  • Μάθετε πώς
    • Blog
    • Συναντήσεις
    • Διαδικτυακά σεμινάρια
    • Πόροι
Καριέρα Ελάτε σε επαφή
  • Σχετικά με εμάς
  • Υπηρεσίες
    • Ανάπτυξη λογισμικού
      • Ανάπτυξη Frontend
      • Backend Ανάπτυξη
    • Staff Augmentation
      • Frontend Developers
      • Backend Developers
      • Μηχανικοί δεδομένων
      • Μηχανικοί cloud
      • Μηχανικοί QA
      • Άλλα
    • Συμβουλευτική
      • Έλεγχος & Συμβουλευτική
  • Αξία για
    • CEO
    • CTO
    • Διευθυντής παράδοσης
  • Η ομάδα μας
  • Case Studies
  • Μάθετε πώς
    • Blog
    • Συναντήσεις
    • Διαδικτυακά σεμινάρια
    • Πόροι
Καριέρα Ελάτε σε επαφή
Πίσω βέλος GO BACK
2016-09-10
Ανάπτυξη λογισμικού

ΝΑ ΈΧΕΙΣ Ή ΝΑ ΕΊΣΑΙ;

Katarzyna Jaruga

Κατά την εκμάθηση του αντικειμενοστραφούς προγραμματισμού και αφού κατακτήσει κανείς τα βασικά στοιχεία των αντικειμένων, των πεδίων και των μεθόδων, αφιερώνει τον περισσότερο χρόνο του στην κληρονομικότητα. Κληρονομικότητα σημαίνει ότι αποκτούμε κάποιο μέρος της υλοποίησης από μια βασική κλάση. Απλά πρέπει να δημιουργήσετε μια υποκλάση μιας βασικής κλάσης προκειμένου να κληρονομήσετε κάθε μη ιδιωτικό πεδίο και μέθοδο.

Ένα αυτοκίνητο και ένα αεροπλάνο είναι οχήματα, οπότε είναι προφανές ότι και οι δύο αυτές κλάσεις θα πρέπει να επεκταθούν από την κοινή βασική τους κλάση που ονομάζεται Vehicle. Αυτό είναι ένα τυπικό ακαδημαϊκό παράδειγμα, αλλά ενώ αποφασίζουμε για τη δέσμευση αυτών των κλάσεων με τη σχέση κληρονομικότητας, θα πρέπει να γνωρίζουμε ορισμένες συνέπειες.

Σχ. 1 Υλοποίηση της σχέσης κληρονομικότητας.

Σε αυτή την περίπτωση οι κλάσεις είναι στενά συνδεδεμένες μεταξύ τους - αυτό σημαίνει ότι οι αλλαγές στη συμπεριφορά κάθε κλάσης μπορούν να επιτευχθούν με αλλαγές στη βασική κλάση κωδικός. Αυτό μπορεί να είναι τόσο πλεονέκτημα όσο και μειονέκτημα - εξαρτάται από το είδος της συμπεριφοράς που περιμένουμε. Αν η κληρονομικότητα εφαρμοστεί σε λάθος χρόνο, η διαδικασία προσθήκης μιας νέας συνάρτησης μπορεί να αντιμετωπίσει κάποιες δυσκολίες στην υλοποίηση, επειδή δεν θα ταιριάζει στο μοντέλο κλάσης που έχει δημιουργηθεί. Θα πρέπει να επιλέξουμε μεταξύ της αντιγραφής του κώδικα και της αναδιοργάνωσης του μοντέλου μας - και αυτό μπορεί να είναι μια πραγματικά χρονοβόρα διαδικασία. Μπορούμε να ονομάσουμε τον κώδικα που εκτελεί τη σχέση κληρονομικότητας ως "ανοιχτό-κλειστό" -αυτό σημαίνει ότι είναι ανοιχτός για επεκτάσεις αλλά κλειστός για τροποποιήσεις. Υποθέτοντας ότι στην κλάση Vehicle υπάρχει μια γενική, καθορισμένη λειτουργία κινητήρα, κάθε οχήματος, τη στιγμή που θα θέλαμε να προσθέσουμε ένα μοντέλο οχήματος χωρίς κινητήρα (π.χ. ποδήλατο) στην ιεραρχία των κλάσεών μας, θα έπρεπε να κάνουμε κάποιες σοβαρές αλλαγές στις κλάσεις μας.

κλάση Όχημα
  def start_engine
  end

  def stop_engine
  end
end

class Plane < Vehicle
  def move
    start_engine
    ...
    stop_engine
  end
end

Σύνθεση

Αν μας ενδιαφέρει μόνο ένα μέρος της συμπεριφοράς της υπάρχουσας κλάσης, μια καλή εναλλακτική λύση για την κληρονομικότητα είναι η χρήση της σύνθεσης. Αντί να δημιουργούμε υποκλάσεις που κληρονομούν κάθε συμπεριφορά (αυτές που χρειαζόμαστε και αυτές που δεν χρειαζόμαστε καθόλου), μπορούμε να απομονώσουμε τις λειτουργίες που χρειαζόμαστε και να εξοπλίσουμε τα αντικείμενά μας με αναφορές σε αυτές. Με αυτόν τον τρόπο, εγκαταλείπουμε τη σκέψη ότι το αντικείμενο είναι ένα είδος ένα αντικείμενο βάσης, υπέρ του ισχυρισμού ότι περιέχει μόνο ορισμένα τμήματα των ιδιοτήτων του.

Σχ. 2 Χρήση της σύνθεσης

Ακολουθώντας αυτή την προσέγγιση μπορούμε να απομονώσουμε τον κώδικα που είναι υπεύθυνος για τη λειτουργία του κινητήρα στην αυτόνομη κλάση που ονομάζεται Engine και να τοποθετήσουμε αναφορά σε αυτήν μόνο στις κλάσεις που αναπαριστούν οχήματα με κινητήρες. Η απομόνωση των λειτουργιών με τη χρήση της σύνθεσης θα κάνει τη δομή της κλάσης Vehicle απλούστερη και θα ενισχύσει την ενθυλάκωση των επιμέρους κλάσεων. Τώρα, ο μόνος τρόπος με τον οποίο τα οχήματα μπορούν να επηρεάσουν τον κινητήρα είναι να χρησιμοποιήσουν τη δημόσια διεπαφή του, επειδή δεν θα έχουν πλέον πληροφορίες για την υλοποίησή του. Επιπλέον, θα επιτρέπει τη χρήση διαφορετικών τύπων κινητήρων σε διαφορετικά οχήματα, και μάλιστα θα επιτρέπει την ανταλλαγή τους κατά τη διάρκεια της εκτέλεσης του προγράμματος. Φυσικά, η χρήση της σύνθεσης δεν είναι άψογη - δημιουργούμε ένα χαλαρά συνδεδεμένο σύνολο κλάσεων, το οποίο μπορεί εύκολα να επεκταθεί και είναι ανοιχτό για τροποποιήσεις. Αλλά, ταυτόχρονα, κάθε κλάση συνδέεται με πολλές άλλες κλάσεις και πρέπει να έχει πληροφορίες σχετικά με τις διεπαφές τους.

κλάση Όχημα
end

κλάση Engine
  def start
  end

  def stop
  end
end

class Αεροπλάνο < Όχημα
  def initialize
    @engine = Engine.new
  end

  def move
    @engine.start
    @engine.stop
  end

  def change_engine(new_engine)
    @engine = new_engine
  end
end

Η επιλογή

Και οι δύο περιγραφόμενες προσεγγίσεις έχουν πλεονεκτήματα και μειονεκτήματα, οπότε πώς να επιλέξετε μεταξύ τους; Η κληρονομικότητα είναι μια εξειδίκευση, οπότε είναι καλύτερο να τις εφαρμόζετε μόνο για προβλήματα, στα οποία υπάρχουν σχέσεις τύπου "is-a" - έτσι έχουμε να κάνουμε με την πραγματική ιεραρχία των τύπων. Επειδή η κληρονομικότητα συνδέει στενά τις κλάσεις μεταξύ τους, πρώτα απ' όλα θα πρέπει πάντα να εξετάζουμε αν θα χρησιμοποιήσουμε σύνθεση ή όχι. Η σύνθεση πρέπει να εφαρμόζεται για προβλήματα στα οποία υπάρχουν σχέσεις τύπου "έχει-α" - έτσι η κλάση έχει πολλά μέρη αλλά είναι κάτι περισσότερο από ένα σύνολο κλάσεων. Ένα αεροπλάνο αποτελείται από μέρη αλλά από μόνο του είναι κάτι περισσότερο - έχει πρόσθετες ικανότητες, όπως π.χ. πτήση. Συνεχίζοντας με αυτό το παράδειγμα, τα επιμέρους μέρη μπορούν να εμφανιστούν σε διαφορετικές εξειδικευμένες παραλλαγές, και τότε είναι μια καλή στιγμή για να χρησιμοποιήσετε την κληρονομικότητα.

Η κληρονομικότητα καθώς και η σύνθεση είναι μόνο εργαλεία που έχουν στη διάθεσή τους οι προγραμματιστές, οπότε η επιλογή του κατάλληλου εργαλείου για ένα συγκεκριμένο πρόβλημα απαιτεί εμπειρία. Ας εξασκηθούμε λοιπόν και ας μάθουμε από τα λάθη μας 🙂

Σχετικά άρθρα

Ανάπτυξη λογισμικού

Κατασκευάστε μελλοντικά ασφαλείς εφαρμογές Web: γνώσεις από την ομάδα εμπειρογνωμόνων του The Codest

Ανακαλύψτε πώς η The Codest υπερέχει στη δημιουργία κλιμακούμενων, διαδραστικών εφαρμογών ιστού με τεχνολογίες αιχμής, παρέχοντας απρόσκοπτη εμπειρία χρήστη σε όλες τις πλατφόρμες. Μάθετε πώς η τεχνογνωσία μας οδηγεί στον ψηφιακό μετασχηματισμό και την επιχειρηματική...

THECODEST
Ανάπτυξη λογισμικού

Top 10 εταιρείες ανάπτυξης λογισμικού με έδρα τη Λετονία

Μάθετε για τις κορυφαίες εταιρείες ανάπτυξης λογισμικού της Λετονίας και τις καινοτόμες λύσεις τους στο τελευταίο μας άρθρο. Ανακαλύψτε πώς αυτοί οι τεχνολογικοί ηγέτες μπορούν να βοηθήσουν στην ανύψωση της επιχείρησής σας.

thecodest
Λύσεις Enterprise & Scaleups

Βασικά στοιχεία ανάπτυξης λογισμικού Java: Α Guide to Outsourcing Successfully (Οδηγός για την επιτυχή εξωτερική ανάθεση)

Εξερευνήστε αυτόν τον βασικό οδηγό για την επιτυχή ανάπτυξη λογισμικού outsourcing Java για να αυξήσετε την αποδοτικότητα, να αποκτήσετε πρόσβαση στην τεχνογνωσία και να οδηγήσετε την επιτυχία των έργων με The Codest.

thecodest
Ανάπτυξη λογισμικού

Ο απόλυτος οδηγός για το Outsourcing στην Πολωνία

Η έξαρση της outsourcing στην Πολωνία οφείλεται στις οικονομικές, εκπαιδευτικές και τεχνολογικές εξελίξεις, που ευνοούν την ανάπτυξη της πληροφορικής και το φιλικό προς τις επιχειρήσεις κλίμα.

TheCodest
Λύσεις Enterprise & Scaleups

Ο πλήρης οδηγός εργαλείων και τεχνικών ελέγχου πληροφορικής

Οι έλεγχοι ΤΠ διασφαλίζουν ασφαλή, αποτελεσματικά και συμβατά συστήματα. Μάθετε περισσότερα για τη σημασία τους διαβάζοντας ολόκληρο το άρθρο.

The Codest
Jakub Jakubowicz CTO & Συνιδρυτής

Εγγραφείτε στη βάση γνώσεών μας και μείνετε ενήμεροι για την τεχνογνωσία από τον τομέα της πληροφορικής.

    Σχετικά με εμάς

    The Codest - Διεθνής εταιρεία ανάπτυξης λογισμικού με κέντρα τεχνολογίας στην Πολωνία.

    Ηνωμένο Βασίλειο - Έδρα

    • Γραφείο 303B, 182-184 High Street North E6 2JA
      Λονδίνο, Αγγλία

    Πολωνία - Τοπικοί κόμβοι τεχνολογίας

    • Πάρκο γραφείων Fabryczna, Aleja
      Pokoju 18, 31-564 Κρακοβία
    • Πρεσβεία του εγκεφάλου, Konstruktorska
      11, 02-673 Βαρσοβία, Πολωνία

      The Codest

    • Αρχική σελίδα
    • Σχετικά με εμάς
    • Υπηρεσίες
    • Case Studies
    • Μάθετε πώς
    • Καριέρα
    • Λεξικό

      Υπηρεσίες

    • Συμβουλευτική
    • Ανάπτυξη λογισμικού
    • Backend Ανάπτυξη
    • Ανάπτυξη Frontend
    • Staff Augmentation
    • Backend Developers
    • Μηχανικοί cloud
    • Μηχανικοί δεδομένων
    • Άλλα
    • Μηχανικοί QA

      Πόροι

    • Γεγονότα και μύθοι σχετικά με τη συνεργασία με εξωτερικό συνεργάτη ανάπτυξης λογισμικού
    • Από τις ΗΠΑ στην Ευρώπη: Γιατί οι αμερικανικές νεοσύστατες επιχειρήσεις αποφασίζουν να μετεγκατασταθούν στην Ευρώπη
    • Σύγκριση υπεράκτιων κόμβων ανάπτυξης τεχνολογίας: Ευρώπη (Πολωνία), ASEAN (Φιλιππίνες), Ευρασία (Τουρκία)
    • Ποιες είναι οι κορυφαίες προκλήσεις των CTOs και των CIOs;
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Πνευματικά δικαιώματα © 2025 από The Codest. Όλα τα δικαιώματα διατηρούνται.

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