Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

 

Φτιάχνω ένα μικρό παιχνιδάκι σε C (compiled ως c++ για να χω λιγα features της C++)

 

Πιστεύω η 100% εξαφάνιση των globals ειναι αδύνατη(χωρίς static τουλάχιστον) καθώς θέλουμε να κρατάμε κάποιο state μεταξύ των update calls του παιχνιδιού.

 

Μέχρι τώρα είχα τις global μεταβλητές μου στο κεντρικό αρχείο με τον game code, και περνούσα παραμέτρους δείκτες προς αυτές στις διάφορες συναρτήσεις.

 

Καλά ως εδώ. Όμως αυτό τελευταία αρχίζει να με ενοχλέι γιατί εχουμε συναρτήσεις με πολλες παραμέτρους που γενικά είναι ψιλοάσχετες με αυτές παράδειγμα

 

SpawnGuy(probability, time, backbuffer, memory, sprites);

//vs :

SpawnGuy(probability, time);
Με το extern από ότι βρήκα μπορώ να εχω ορατότητα των globals μου και αλλού.

 

Αυτά που μπορώ να κάνω λοιπόν είναι ετα εξής :

 

1) Η "προτινόμενη" λύση ειναι ενα header file με όλα τα extern δηλωμένα, και μετα include οπου θέλω.

Αυτό δεν μου αρέσει γιατί ενισχύει πιστευω ένα προβλημα των globals - τις κρύβει ακόμα περισσότερο.

 

2) Να γράφω σε κάθε αρχείο τα extern που χρησιμοποιώ ωστε να φαίνεται τι globals χρησιμοποιούνται τουλάχιστον λίγο καλύτερα.

Από ότι είδα μπορώ να γράψω και "extern auto memory" για παράδειγμα οποτε το κάνει κάπως ευκολότερο.

 

3) Να συνεχίσω να περνάω παραμέτρους + ομαδοποιηση σε struct για μειωση παραμέτρων.

 

4) Κάποιος άλλους μαγικός τρόπος που δεν ξέρω.

 

 

Τι είναι καλύτερο σε αυτήν την περίπτωση;

Πώς οργανώνεται καλύτερα με βάση την εμπειρία σας;

 

Ευχαριστώ.

  • Moderators
Δημοσ.

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

 

Πάντως νομίζω πρέπει να ξεκαθαρίσεις αν θες να γράψεις C ή C++ και εάν θες να έχεις globals ή όχι.

Δημοσ.

Αφού έχεις globals γιατί τις περνάς ως παραμέτρους;

Για τον απλούστατο λόγο ότι δεν ήξερα το extern από την αρχή.

 

Δεν με πειράζει η ύπαρξη ή οχι globals απλα έχω μπερδευτεί ως το τι ειναι καλύτερη λύση.

Δημοσ.

Όμως αυτό τελευταία αρχίζει να με ενοχλέι γιατί εχουμε συναρτήσεις με πολλες παραμέτρους που γενικά είναι ψιλοάσχετες με αυτές 

 

Μυρίζει λίγο non-design αυτό.

 

Γιατί χρειάζεται μια συνάρτηση πολλές και άσχετες μεταξύ τους παραμέτρους; Ρητορική ερώτηση βασικά, δε χρειάζεται. Νομίζω ότι πρώτα απ' όλα πρέπει να κάνεις ένα καλύτερο design. Δεν έχει τόσο σημασία αν θα έχεις globals χύμα ή σε structs ή αν θα το γράψεις όλο σε αυστηρή C++. Το θέμα είναι ότι μια συνάρτηση όπως την περιγράφεις είναι σίγουρο ότι is trying to do too much. Για τι μέγεθος συναρτήσεων μιλάμε ας πούμε;

 

Μήπως η SpawnGuy θα μπορούσε να σπάσει σε κομμάτια, καθένα από τα οποία θα κάνει μία μόνο δουλειά και δε θα χρειάζεται όλες αυτές τις παραμέτρους; Αν ονομάσουμε αυτά τα κομμάτια Χ Υ Ζ τότε θα μπορούσες εν τέλει να κρατήσεις τη SpawnGuy που θα καλεί κατα βάση τις X Y Z τη μία μετά την άλλη. Και σπάζοντας τον κώδικα σε λογικά αυτοτελή κομμάτια θα αρχίσει ως δια μαγείας να φαίνεται και μια κατεύθυνση για το πού πρέπει να πας με τις μεταβλητές.

 

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

 

Το να τις κρύψει όμως τις globals βαθειά μέσα εκεί που χρησιμοποιούνται είναι από τα χειρότερα πράγματα που μπορεί να κάνει... γιατί μετά οποιοδήποτε refactoring θα πληρώνεται με αίμα 18χρονων παρθένων.

 

Much better να έχει σχεδόν όλο τον κώδικά του σε συναρτήσεις που παίρνουν παραμέτρους, και ας κρατήσει μερικές που απλά τσιμπάνε globals και τις προωθούν στις άλλες.

Δημοσ.

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

 

Δεν με νοιάζει τόσο να κάνω τέλειο αυτόν τον κώδικα όσο να καταλάβω καλύτερα για τον επόμενο που θα γράψω.

 

 

@defacer Όταν λέω άσχετες παραμέτρους (δεν το έθεσα πολυ σωστά) εννοώ άσχετες όχι για την συνάρτηση αλλα "φαινομενικά" άσχετες για αυτόν που την καλεί.

 

Η SpawnGuy για παράδειγμα απλά φτιάχνει ένα entity και το βάζει στην memory.

 

Αλλά πρέπει να ξέρει το backbuffer για να το κάνει σωστά positioning ή το ίδιο το memory struct για να το εισάγει εκεί.

 

Για να είμαι ειλικρινής ο κύριος λόγος που τα έχασα λίγο και ρωτησα εδώ είναι γιατί είχα στο μυαλό μου το "globals is evil".

 

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

Δημοσ.

Η SpawnGuy για παράδειγμα απλά φτιάχνει ένα entity και το βάζει στην memory.

 

Αλλά πρέπει να ξέρει το backbuffer για να το κάνει σωστά positioning ή το ίδιο το memory struct για να το εισάγει εκεί.

 

Έχεις ήδη πει 3 (ή 4?) πράγματα που κάνει η SpawnGuy. Separation of concerns:

 

The value of separation of concerns is simplifying development and maintenance of computer programs. When concerns are well-separated, individual sections can be reused, as well as developed and updated independently. Of special value is the ability to later improve or modify one section of code without having to know the details of other sections, and without having to make corresponding changes to those sections.

 

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

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...