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

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

Δημοσ.

Είμαι αρκετά μπερδεμένος

 

Ας πούμε ότι έχουμε μια κλάση "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!)

Δημοσ.

Κοίτα..

 

Εάν θέλεις checking, κάπου θα πρέπει να το κάνεις. 

 

Εάν ξέρεις ότι στη δομή που έχεις κάποιες συγκεκριμένες φορές, και μόνο αυτές, υπάρχει περίπτωση η τιμή σου να είναι εκτός ορίων τότε περιόρισε τον έλεγχο εκεί. Βέβαια, αυτό σε περίπτωση που ένα if (ή if, then, else "δομή") παραπάνω είναι σημαντικό time constraint για την εφαρμογή σου. 

 

Έτσι, εφόσον πρέπει να γίνει checking δες που θα το κάνεις. Εν γένει είναι καλό να γίνεται εκεί που γίνεται και η ανάθεση, μιας και δεν είναι attribute των άλλων να ξέρουν τι και πως σχετικά με τα limits αλλά της κλάσης που έχει τις "τιμές". 

 

Άρα, εάν αυτό που φτιάχνεις και έχει θέμα με τις τιμές πρόκειται να χρησιμοποιηθεί και αλλού, εγώ θα πρότεινα να μην πηγαίνει η τιμή volume πάνω από το μέγιστο με truncate από τον setter. Επίσης, εάν η τιμή ήταν μεγαλύτερη του ορίου τότε η μέθοδος που θα καλείς για να κάνεις set την τιμή να διαχειρίζεται την μετάδοση του περιορισμού προς τα εκεί που θες. 

 

Εάν είναι τελείως specific για αυτό που φτιάχνεις τότε δεν είναι ανάγκη να κάνεις έλεγχο μιας και μπορείς να περιορίζεις την τιμή από το interface που θα δέχεσαι είσοδο.

Δημοσ.

Η microsoft στο .ΝΕΤ συνηθως βαζει τον έλεγχο όπως στην 2η εκδοχή αλλα πεταει ArgumentException αν ειναι εκτος ορίων (δεν βαζει σιωπηλά άλλη τιμη). Δλδ πρεπει να φροντιζεις πως την καλεις (1η εκδοχη).

 

Μπορεις να φτιαξεις μια GameOptions.IncreaseVolume() που να πεταει exception αν ξερεπασει τα όρια.

Γενικα τα exceptions ειναι χρησιμα και πρεπει να τα συνηθίσεις. 

Δημοσ.

Η 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, Το πρόγραμμα συνεχίζει σωστά! πολύ καλή ιδέα (δεν την είχα σκεφτεί) Θανκς

Δημοσ.

GameOptions.SetVolume(GameOptions.GetVolume() + 0.1f);
Αυτο μου φαίνεται too much. Τουλαχιστον καντο property και γραψε GameOptions.Volume+=0.1f;Στην set; τωρα που το σκεφτομαι δεν θα πεταγα exception
Float Volume {   get{return v;}   set{ if(value >= 0&&value <= 1) v=value;}}

 

 

Tested, Το πρόγραμμα συνεχίζει σωστά! πολύ καλή ιδέα (δεν την είχα σκεφτεί) Θανκς

 

Τα πιθανα exceptions θέλουν χειρισμο catch   :shifty:

Δημοσ.

Εγω το θεωρω αχρηστο exception για volume. Δηλαδη πρεπει να εισαι καθυστερημενος να βαλεις πανω απο 100 και να βαλεις απλα δε θα πρεπει να σε αφηνει το UI.Εκτος αν δε θες να περασουν μουφα ντατα η για το χ,y λογο

Δημοσ.

Εγω το θεωρω αχρηστο exception για volume. Δηλαδη πρεπει να εισαι καθυστερημενος να βαλεις πανω απο 100 και να βαλεις απλα δε θα πρεπει να σε αφηνει το UI.Εκτος αν δε θες να περασουν μουφα ντατα η για το χ,y λογο

ήρεμα λίγο με τους χαρακτηρισμούς...

 

Ξέρεις... μερικές φορές δεν το βλέπεις από 1 εως 100 (%)

αλλά ως 0.1 εως 1 (*100)

 

Ναι οκ θα έχω έναν Slider που θα έχει τιμές από 0.01 εως 1.0 (1% εως 100%) , προστατεύεται από αυτό αλλά αν γίνει κάτι? (δεν ξέρω τι, απλά είμαι της άποψης ότι πρέπει να λειτουργώ προληπτικά)

 

Θα μου πείτε, μα και να βάλει Volume 100000 θα ακούσεις εσύ πάνω από 100%? ΟΧΙ!!!

 

 

Τα πιθανα exceptions θέλουν χειρισμο catch   :shifty:

 

Μπορείς ένα παράδειγμα παρακαλώ? πως θα μπορούσα να κάνω τον έλεγχο αν είναι μεταξύ ενός διαστήματος ;;

Δημοσ.

Παραδειγμα 

            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/Min
Value)

Αλλα επειδη αυτα θα αποθηκευτουν στο registry, ini , xml ή σε καποιο txt αρχειο θες μια προστασία απο το χρηστη που θα παει να αλλαξει αυτες τις τιμες.

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

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

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

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

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

Σύνδεση

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

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