sonyxp Δημοσ. 27 Ιουλίου 2013 Δημοσ. 27 Ιουλίου 2013 Είμαι αρκετά μπερδεμένος Ας πούμε ότι έχουμε μια κλάση "Options" και θέλουμε να σεταρουμε διάφορες ρυθμίσεις για το παιχνίδι μας (Volume, Camera Distance) Θα πρέπει όμως να υπάρξουν κάποια όρια Volume 0 εως 100 Camera Distance 2 εως 20 Θα έχουμε λοιπόν 2 συναρτήσεις setVolume(int val); setCameraDistance(float val); όλα καλά μέχρι εδώ, τώρα μπαίνω στο θέμα. Που θα μπουν τα Limits? Στις συναρτήσεις αυτές ή θα πρέπει να φροντίσουμε να τις καλέσουμε σωστά? 1η Εκδοχή using System; using System.Collections; public class GameOptions { private static float volume = 0.5f; // 50% public static void SetVolume(float val) { volume = val; } } using UnityEngine; using System.Collections; public class DrawOptions : MonoBehaviour { void Update() { if (Input.GetKeyDown(KeyCode.UpArrow)) { if (GameOptions.getVolume() < 1.0f) GameOptions.setVolume(GameOptions.getVolume() + 0.1f); else print("You reached maximum volume"); } } } 2η Εκδοχή using System; using System.Collections; public class GameOptions { private static float volume = 0.5f; // 50% public static void SetVolume(float val) { volume = val; if (volume < 0.0f) volume = 0.0f; if (volume > 1.0f) volume = 1.0f; } } ΥΓ: Ξέρω για τα Setters & Getters ΥΓ2: Αν οι έλεγχοι γίνουν στις συναρτήσεις μέσα τότε δεν έχεις τον φόβο μήπως και ξεχάσεις, επίσης δεν χρειάζεται να μεριμνάς συνέχεια (κάθε φορά που θα το καλείς θα πρέπει να βάλεις και του ελέγχους, thats bad!)
Timonkaipumpa Δημοσ. 27 Ιουλίου 2013 Δημοσ. 27 Ιουλίου 2013 Κοίτα.. Εάν θέλεις checking, κάπου θα πρέπει να το κάνεις. Εάν ξέρεις ότι στη δομή που έχεις κάποιες συγκεκριμένες φορές, και μόνο αυτές, υπάρχει περίπτωση η τιμή σου να είναι εκτός ορίων τότε περιόρισε τον έλεγχο εκεί. Βέβαια, αυτό σε περίπτωση που ένα if (ή if, then, else "δομή") παραπάνω είναι σημαντικό time constraint για την εφαρμογή σου. Έτσι, εφόσον πρέπει να γίνει checking δες που θα το κάνεις. Εν γένει είναι καλό να γίνεται εκεί που γίνεται και η ανάθεση, μιας και δεν είναι attribute των άλλων να ξέρουν τι και πως σχετικά με τα limits αλλά της κλάσης που έχει τις "τιμές". Άρα, εάν αυτό που φτιάχνεις και έχει θέμα με τις τιμές πρόκειται να χρησιμοποιηθεί και αλλού, εγώ θα πρότεινα να μην πηγαίνει η τιμή volume πάνω από το μέγιστο με truncate από τον setter. Επίσης, εάν η τιμή ήταν μεγαλύτερη του ορίου τότε η μέθοδος που θα καλείς για να κάνεις set την τιμή να διαχειρίζεται την μετάδοση του περιορισμού προς τα εκεί που θες. Εάν είναι τελείως specific για αυτό που φτιάχνεις τότε δεν είναι ανάγκη να κάνεις έλεγχο μιας και μπορείς να περιορίζεις την τιμή από το interface που θα δέχεσαι είσοδο.
albNik Δημοσ. 27 Ιουλίου 2013 Δημοσ. 27 Ιουλίου 2013 Η microsoft στο .ΝΕΤ συνηθως βαζει τον έλεγχο όπως στην 2η εκδοχή αλλα πεταει ArgumentException αν ειναι εκτος ορίων (δεν βαζει σιωπηλά άλλη τιμη). Δλδ πρεπει να φροντιζεις πως την καλεις (1η εκδοχη). Μπορεις να φτιαξεις μια GameOptions.IncreaseVolume() που να πεταει exception αν ξερεπασει τα όρια. Γενικα τα exceptions ειναι χρησιμα και πρεπει να τα συνηθίσεις.
sonyxp Δημοσ. 27 Ιουλίου 2013 Μέλος Δημοσ. 27 Ιουλίου 2013 Η microsoft στο .ΝΕΤ συνηθως βαζει τον έλεγχο όπως στην 2η εκδοχή αλλα πεταει ArgumentException αν ειναι εκτος ορίων (δεν βαζει σιωπηλά άλλη τιμη). Δλδ πρεπει να φροντιζεις πως την καλεις (1η εκδοχη). Μπορεις να φτιαξεις μια GameOptions.IncreaseVolume() που να πεταει exception αν ξερεπασει τα όρια. Γενικα τα exceptions ειναι χρησιμα και πρεπει να τα συνηθίσεις. Δηλαδή μου λες αυτό? using System; using System.Collections; public class GameOptions { private static float volume = 0.5f; // 50% public static void SetVolume(float val) { if (val < 0.0f || val > 1.0f) throw new System.ArgumentException("<SetVolume>: Allowd values 0.0f to 1.0f"); else volume = val; } } using UnityEngine; using System.Collections; public class DrawOptions : MonoBehaviour { void Update() { if (Input.GetKeyDown(KeyCode.UpArrow)) { GameOptions.SetVolume(GameOptions.GetVolume() + 0.1f); } } } Θα το κοιτάξω το θέμα με τα Exception, το βρίσκω σωστό. Μια ερώτηση πάνω σε αυτό, το παιχνίδι θα συνεχίσει ? γιατί νομίζω ότι σταματάει στα Exception όλο το πρόγραμμα. Tested, Το πρόγραμμα συνεχίζει σωστά! πολύ καλή ιδέα (δεν την είχα σκεφτεί) Θανκς
albNik Δημοσ. 27 Ιουλίου 2013 Δημοσ. 27 Ιουλίου 2013 GameOptions.SetVolume(GameOptions.GetVolume() + 0.1f);Αυτο μου φαίνεται too much. Τουλαχιστον καντο property και γραψε GameOptions.Volume+=0.1f;Στην set; τωρα που το σκεφτομαι δεν θα πεταγα exceptionFloat Volume { get{return v;} set{ if(value >= 0&&value <= 1) v=value;}} Tested, Το πρόγραμμα συνεχίζει σωστά! πολύ καλή ιδέα (δεν την είχα σκεφτεί) Θανκς Τα πιθανα exceptions θέλουν χειρισμο catch
ParhsG Δημοσ. 27 Ιουλίου 2013 Δημοσ. 27 Ιουλίου 2013 Εγω το θεωρω αχρηστο exception για volume. Δηλαδη πρεπει να εισαι καθυστερημενος να βαλεις πανω απο 100 και να βαλεις απλα δε θα πρεπει να σε αφηνει το UI.Εκτος αν δε θες να περασουν μουφα ντατα η για το χ,y λογο
sonyxp Δημοσ. 27 Ιουλίου 2013 Μέλος Δημοσ. 27 Ιουλίου 2013 Εγω το θεωρω αχρηστο exception για volume. Δηλαδη πρεπει να εισαι καθυστερημενος να βαλεις πανω απο 100 και να βαλεις απλα δε θα πρεπει να σε αφηνει το UI.Εκτος αν δε θες να περασουν μουφα ντατα η για το χ,y λογο ήρεμα λίγο με τους χαρακτηρισμούς... Ξέρεις... μερικές φορές δεν το βλέπεις από 1 εως 100 (%) αλλά ως 0.1 εως 1 (*100) Ναι οκ θα έχω έναν Slider που θα έχει τιμές από 0.01 εως 1.0 (1% εως 100%) , προστατεύεται από αυτό αλλά αν γίνει κάτι? (δεν ξέρω τι, απλά είμαι της άποψης ότι πρέπει να λειτουργώ προληπτικά) Θα μου πείτε, μα και να βάλει Volume 100000 θα ακούσεις εσύ πάνω από 100%? ΟΧΙ!!! Τα πιθανα exceptions θέλουν χειρισμο catch Μπορείς ένα παράδειγμα παρακαλώ? πως θα μπορούσα να κάνω τον έλεγχο αν είναι μεταξύ ενός διαστήματος ;;
albNik Δημοσ. 27 Ιουλίου 2013 Δημοσ. 27 Ιουλίου 2013 Παραδειγμα try { Game.SetVolume(150); } catch(ArgumentException ex) { MessageBox.Show(ex.Message); } catch(Exception ex) //opoiοdipote allo exception { MessageBox.Show(ex.Message); } Για το volume ισως δεν ειναι τοσο σημαντικό το exception. Εγω φροντιζω στο GUI να μην μπορει ο χρηστης να βαζει λαθος τιμες (π.χ NumericUpDown.MaxValue/MinValue) Αλλα επειδη αυτα θα αποθηκευτουν στο registry, ini , xml ή σε καποιο txt αρχειο θες μια προστασία απο το χρηστη που θα παει να αλλαξει αυτες τις τιμες.
iziamos Δημοσ. 28 Ιουλίου 2013 Δημοσ. 28 Ιουλίου 2013 Πάντως τον έλεγχο που θες να κάνεις τον κάνει το Unity3D ούτως ή άλλως.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα