Τρεις μικρές εφαρμογές, τρεις διαφορετικές "ιστορίες" — ένα άλογο που τρέχει σε αγώνα, ένας φοιτητής που γράφεται σε μάθημα, μια μηχανή που φτιάχνει καφέ. Το κοινό νήμα: όλα μοντελοποιούνται ως αντικείμενα με δικές τους ιδιότητες και συμπεριφορές, γραμμένα σε C++.
Αυτό το repository είναι η πρακτική εφαρμογή του μαθήματος Αντικειμενοστραφούς Προγραμματισμού — όχι θεωρία, αλλά τρία μικρά "κόσμοι" που φτιάχτηκαν από την αρχή με κλάσεις.
Ένας αγώνας ιπποδρομιών με στοιχηματισμό. Ο χρήστης βάζει στοίχημα σε ένα άλογο, ο αγώνας "τρέχει" (με κάποιο στοιχείο τυχαιότητας), και στο τέλος υπολογίζονται κέρδη ή ζημιές.
classDiagram
class Horse {
-string name
-int speed
-float odds
+run()
}
class Race {
-Horse[] horses
+start()
+getWinner() Horse
}
class Player {
-float balance
-Bet currentBet
+placeBet(Horse, amount)
+collectWinnings()
}
class Bet {
-Horse selectedHorse
-float amount
}
Race "1" --> "*" Horse
Player --> Bet
Bet --> Horse
Το διάγραμμα παραπάνω είναι μια λογική πρόταση δομής — αν οι δικές σου κλάσεις λέγονται διαφορετικά ή έχουν άλλες σχέσεις, πες μου και το προσαρμόζω ακριβώς στον κώδικά σου.
Τι δείχνει για OOP: encapsulation του υπολοίπου του παίκτη (balance δεν αλλάζει απευθείας απ' έξω), και μια σχέση σύνθεσης ανάμεσα σε Race και Horse.
Σύστημα εγγραφής φοιτητών σε μαθήματα ενός πανεπιστημιακού προγράμματος. Ένας φοιτητής επιλέγει μαθήματα, το σύστημα ελέγχει διαθεσιμότητα/προαπαιτούμενα, και κρατάει τη λίστα εγγραφών.
classDiagram
class Student {
-string name
-string studentId
-Course[] enrolledCourses
+enroll(Course)
+dropCourse(Course)
}
class Course {
-string title
-int capacity
-int enrolledCount
+hasAvailableSpot() bool
}
Student "*" --> "*" Course : enrolls in
Τι δείχνει για OOP: σχέση many-to-many ανάμεσα σε Student και Course — το κλασικό παράδειγμα association που ξεπερνά την απλή κληρονομικότητα.
Προσομοίωση μηχανής καφέ που διαχειρίζεται συναλλαγές: ο χρήστης επιλέγει προϊόν, βάζει χρήματα, η μηχανή ελέγχει αν αρκούν, δίνει ρέστα και ενημερώνει το απόθεμα.
classDiagram
class CoffeeMachine {
-Product[] menu
-float cashInserted
-int stock
+selectProduct(id)
+insertMoney(amount)
+dispense()
}
class Product {
-string name
-float price
}
CoffeeMachine "1" --> "*" Product
Τι δείχνει για OOP: η κατάσταση της μηχανής (cashInserted, stock) μένει "κρυμμένη" μέσα στην κλάση — ο έξω κόσμος μιλάει μαζί της μόνο μέσω μεθόδων, ποτέ πειράζοντας απευθείας τις μεταβλητές της.
Δεν είναι τυχαίο ότι διαλέχτηκαν τρία πολύ διαφορετικά σενάρια:
- Το Horserace εξασκεί τυχαιότητα + σχέσεις 1-προς-πολλά
- Το Course Registration εξασκεί σχέσεις πολλά-προς-πολλά
- Το Coffee Machine εξασκεί διαχείριση εσωτερικής κατάστασης (state) και encapsulation
Μαζί, καλύπτουν τα περισσότερα από τα βασικά OOP patterns που συναντάει κανείς σε ένα πρώτο μάθημα C++.
git clone https://github.com/Dimitriskatsanos42/OOP.git
cd OOPΚάθε φάκελος τρέχει ανεξάρτητα:
cd Horserace
g++ *.cpp -o horserace
./horseracecd "Course registration"
g++ *.cpp -o course_registration
./course_registrationcd "Cofee machine"
g++ *.cpp -o coffee_machine
./coffee_machine(Αν τα αρχεία .cpp έχουν διαφορετικά ονόματια entry point, προσάρμοσε ανάλογα την εντολή compile.)
Γράφτηκε σε C++, στο πλαίσιο μαθήματος Αντικειμενοστραφούς Προγραμματισμού. Ο στόχος δεν ήταν να φτιαχτούν "τέλεια" προγράμματα, αλλά να εξασκηθούν οι βασικές έννοιες: κλάσεις, encapsulation, σχέσεις μεταξύ αντικειμένων, και λίγη λογική simulation πάνω σε καθημερινά σενάρια (στοίχημα, εγγραφή σε μάθημα, αγορά καφέ).