OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από nirvana » 18 Φεβ 2013 12:21

Nai, legete singleton i texniki.

Gia auto sto parapanw paradeigma pou edwsa eipa oti den einai o swstos tropos.
Pio logiki ylopoiisi tha itan:

Κώδικας: Επιλογή όλων

$query = MySql_Query::create()->select('id')->from('table')->where('id = ' . MySql_Query::escape($id)); 

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από jpk » 18 Φεβ 2013 12:22

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

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

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από mrpc » 18 Φεβ 2013 13:38

Για ποιον λόγο να είναι static οι functions της βάσης; Σε τι θα σε εξυπηρετήσει αυτό; Χάνεις όλη την ευελιξία. Για να σου δώσω ένα πρακτικό παράδειγμα, σκέψου να θες να συνδεθείς σε δύο βάσεις ταυτόχρονα (π.χ. για να κάνεις data migration). Ξέρεις σε αυτή την περίπτωση πόσο σε διευκολύνει το να είναι αντικείμενο η βάση;

vevhlos
Δημοσιεύσεις: 55
Εγγραφή: 01 Μαρ 2008 15:35

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από vevhlos » 19 Φεβ 2013 10:12

mrpc έγραψε:Για ποιον λόγο να είναι static οι functions της βάσης; Σε τι θα σε εξυπηρετήσει αυτό; Χάνεις όλη την ευελιξία. Για να σου δώσω ένα πρακτικό παράδειγμα, σκέψου να θες να συνδεθείς σε δύο βάσεις ταυτόχρονα (π.χ. για να κάνεις data migration). Ξέρεις σε αυτή την περίπτωση πόσο σε διευκολύνει το να είναι αντικείμενο η βάση;
Πάλι με object θα δουλεύεις. Το static του singleton σου επιστρέφει απλά το object. Και με την παραλλαγή του singleton που δέχεται πολλά instances (multiton) διαλέγεις μέσω του static method, το object που ζητάς. Το οποίο multiton νομίζω καλύπτει το σενάριο που έθεσες (2 db instances):

Κώδικας: Επιλογή όλων

DB::instance('prod')->method();
DB::instance('secondary')->other_method();
Καραβολεύει σε κάποιες περιπτώσεις, κατά την γνώμη μου. Το singleton ειδικά σε classes που είναι λογικό να έχουν μόνο ένα instance (πχ Session::instance()) per request.

Εννοείται πως τα design patterns δεν είναι πανάκεια, αλλά εργαλεία για να λύνουν (τυποποιημένα) συγκεκριμένο είδος προβλημάτων.

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από mrpc » 19 Φεβ 2013 14:39

Vevhlos συμφωνούμε, και εγώ κάπως έτσι δουλεύω. Και το σχόλιο μου δεν είναι αντίθετο με αυτό, μιλάω για objects, εσύ μιλάς για το factory που τα παράγει/επιστρέφει.
Το σχόλιο μου πήγαινε σε αυτό:
Επίσης έχω δει πολλά, για να μην πω σχεδόν όλα, παραδείγματα όπου developers φτιάχνουν μία class Database όπου εκεί γίνεται η σύνδεση με τη β.δ. κυρίως, εκτελούνται queries κλπ κλπ, και δημιουργούν ένα instance από τη Database. Στην ίδια λογική δεν θα 'πρεπε κανονικά και αυτή να είναι static ??
Ίσως δεν κατάλαβα σωστά την ερώτηση, αλλά απάντησα στο γιατί πρέπει οι methods της βάσης να μην είναι static.

vevhlos
Δημοσιεύσεις: 55
Εγγραφή: 01 Μαρ 2008 15:35

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από vevhlos » 19 Φεβ 2013 14:46

@mrpc Sorry, νόμιζα πως αναφερόσουν στις singleton που ανέφερε ο @nirvana.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από jpk » 20 Φεβ 2013 14:58

Δεν θα επεκταθώ καθώς δεν είναι το θέμα της ερώτησης και είναι ένα θέμα καθαρά αρχιτεκτονικής προσέγγισης αλλά ακούστε συνοπτικά μια άλλη άποψη.

Σε τι «βολεύει» πραγματικά να παραχθεί - instantiate ένα DB αντικείμενο μέσα από στατική συμπεριφορά ; Στο μόνο που εγώ αντιλαμβάνομαι ότι θα «βόλευε» θα ήταν αν έγραφα μπερδεμένο κώδικά OOP με functional για να μην πω και με procedural. Εκεί ναι , καταλαβαίνω τι εξυπηρετεί.

Από εκεί και πέρα γράφοντας OOP PHP το μόνο που θα καταφέρεις από το να παράγεις τα db σου αντικείμενα από μια static function είναι να παρακάμπτεις την λογική ροή μιας εφαρμογής. (Όπως γνωρίζετε μπορείς μια χαρά να γράψεις καθαρά OOP σε PHP , αρκεί και μόνο να instantiate μια κλάση για παράδειγμα , εκτός OOP).

Δεν θα επιχειρηματολογήσω περισσότερο , αλλά αν γράφετε OOP σκεφτείτε για λίγο , αν δεν είχατε στατικές συμπεριφορές για να instantiate τα DB αντικείμενα , σε τι λύσεις θα σας οδηγούσε αυτό ; Μήπως τελικά κάποιες από αυτές οι λύσεις βοηθούν στην καθαρότητα του κώδικα , των διαχωρισμό των επιπέδων και την καλύτερη αποτύπωση της λογικής ροής σε ένα ανικειμενοστρεφές πλαίσιο ;

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από mrpc » 20 Φεβ 2013 15:12

Τα στατικά factory methods βοηθάνε πολύ στο να μην δημιουργείς πολλές φορές το ίδιο αντικείμενο. Δημιουργείς ότι χρειάζεσαι, το κρατάς σε static var, και όταν το ξαναχρειαστείς το επαναφέρεις γρήγορα, δεν το δημιουργείς ένα νέο. Πέρα από το ότι μπορεί να σε βολεύει για διάφορους λόγους αρχιτεκτονικής (αυτό είναι τελείως υποκειμενικό), π.χ. το ότι χρειάζεται να περάσεις τα αρχικά settings και να κάνεις το connection στη βάση μόνο μια φορά, κερδίζεις (ελάχιστα βέβαια) και σε μνήμη.

Από εκεί και πέρα, η άποψη μου είναι ότι στον προγραμματισμό δεν υπάρχει ποτέ απόλυτα σωστό και απόλυτα λάθος. Τα πάντα εξαρτώνται από τις ιδιαιτερότητες και τις ανάγκες του project, αλλά πέρα από αυτό είναι μια "συμφωνία" μεταξύ των developers, όπως π.χ. το coding style κ.λ.π. Κάθε design pattern έχει πλεονεκτήματα και μειονεκτήματα (αν υπήρχε κάποιο απόλυτα σωστό, θα ήταν το μόνο που θα υπήρχε), οπότε ότι μας βολεύει και βολεύει και όλη την ομάδα.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από jpk » 20 Φεβ 2013 15:26

mprc θα συμφωνήσω μαζί σου ότι δεν μπορεί καμία αρχιτεκτονική προσέγγιση να θεωρηθεί πανάκια, αν ήταν έτσι πολύ σωστά λες θα είχαμε κλείσει το RnD και θα ήταν μόνο D. Παρόλα αυτά δεν καταλαβαίνω το «Τα στατικά factory methods βοηθάνε πολύ στο να μην δημιουργείς πολλές φορές το ίδιο αντικείμενο» , γιατί χρειάζεσαι στον αντικειμενοστρεφή προγραμματισμό να παράγεται το αντικείμενο σου –μόνο- μια φορά μέσα από στατικές συμπεριφορές; Δεν μπορεί μια χαρά και από την λογική των επιπέδων της εφαρμογής να παράγεται μόνο ένα db αντικείμενο για κάθε διαφορετική βάση ; Οι αρχιτεκτονικές προσεγγίσεις έχουν κάτι κοινό με τα frameworks , το τι θα επιλέξεις έχει να κάνει με το τι προγραμματιστής είσαι , ποια είναι η προγραμματιστική σου κουλτούρα (background) και τελευταίο αλλά σημαντικότερο με το τι προγραμματιστής θέλεις να γίνεις. Φυσικά δεν υπάρχει άσπρο – μαύρο , από μια άποψη καλύτερα , γιατί κάνει το επάγγελμά μας ενδιαφέρον και υποκείμενο σε ιστορικές μεταβολές.

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από mrpc » 20 Φεβ 2013 15:39

Κοίτα, είναι λίγο και τι βολεύει τον καθένα.
Άλλες λύσεις για να πετύχεις το ίδιο είναι το να κάνεις ένα global object, το οποίο ουσιαστικά ξεφεύγει από τη λογική του oop, και το να χρησιμοποιήσεις λογική Dependency Injection.
Προσωπικά το Dependency Injection δεν με βολεύει καθόλου, αν και θεωρητικά είναι πιο σωστό. Το βρίσκω πολύ φλύαρο και όχι τόσο καθαρό, τουλάχιστον για τα δικά μου γούστα.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από gvre » 20 Φεβ 2013 15:39

Στο μόνο που "βολεύει" είναι ότι μπορείς από οπουδήποτε να αποκτήσεις απλά και γρήγορα πρόσβαση στη βάση μέσω του ίδιου connection, γράφοντας απλά πχ DB::instance();
Γενικά, αυτός ο τρόπος δημιουργεί εξαρτήσεις της μιας κλάσης από κάποιες άλλες, κάτι το οποίο δεν είναι και ό,τι καλύτερο ειδικά όταν θέλεις οι κλάσεις σου να είναι testable. Προσωπικά προτιμώ το connection με τη βάση, καθώς και άλλα πράγματα, να γίνεται inject σε όποια κλάση το χρειάζεται, χρησιμοποιώντας interface type hinting όπου είναι δυνατό.

Επίσης, επειδή από τα static methods δε μπορείς να προσπελάσεις non-static methods και μεταβλητές καταλήγεις κάποια στιγμή σε κλάσεις γεμάτες από statics.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες