Ζυγαριά

Ζυγαριά

Άσκηση εκμάθησης

Εισαγωγή

Τα getters και τα setters είναι μέθοδοι που σου επιτρέπουν να διαβάζεις και να γράφεις την τιμή μιας ιδιότητας ενός αντικειμένου. Η Crystal έχει macros, κάτι που κάνει εύκολο τον ορισμό getters και setters για μια ιδιότητα. Τα macros είναι ένας τρόπος να παράγεις κώδικα σε χρόνο μεταγλώττισης, κάτι που θα καλυφθεί αργότερα στην έννοια των macros.

Στη Ruby αυτές οι μέθοδοι ορίζονται με τις μεθόδους attr_reader, attr_writer και attr_accessor και, εκ πρώτης όψεως, μοιάζουν πολύ με την υλοποίηση της Crystal. Η Crystal τις έχει ορίσει ως τα macros getter, setter και property.

Getters

Το getter είναι ένα macro που ορίζει μια μέθοδο που επιστρέφει την τιμή μιας μεταβλητής στιγμιοτύπου. Αυτό σημαίνει ότι δεν χρειάζεται πια να γράφεις @ μπροστά από τη μεταβλητή στιγμιοτύπου όταν θέλεις να έχεις πρόσβαση σε αυτήν (μέσα σε μεθόδους, εκτός από την initialize). Αντ' αυτού, μπορείς να καλέσεις τη μέθοδο που έχει ορίσει το macro getter.

Το macro getter μπορεί να δεχτεί πολλές μεταβλητές στιγμιοτύπου, χωρίζοντάς τες με κόμματα.

# This:
class Person
  @name : String
  @age : Int32

  def name
    @name
  end

  def age
    @age
  end
end

# Is the same as this:
class Person
  @name : String
  @age : Int32

  getter name, :age
end

Όπως βλέπεις, χρησιμοποιώντας το getter γράφεις λιγότερο κώδικα και ο κώδικας γίνεται πιο ευανάγνωστος. Επίσης, η Ruby και η Crystal διαφέρουν στο ότι η Crystal δέχεται ως ορίσματα για το macro getter τόσο το όνομα της μεταβλητής όσο και το symbol. Τα symbols θα καλυφθούν αργότερα στην έννοια των symbols.

Setters

Το setter είναι ένα macro που ορίζει μια μέθοδο που θέτει την τιμή μιας μεταβλητής στιγμιοτύπου. Αυτό το macro δεν συναντάται τόσο συχνά, και συνήθως χρησιμοποιείται αντ' αυτού το macro property. Οι μέθοδοι που θα δημιουργηθούν θα έχουν τη μορφή name_of_method=. Το = είναι αυτό που επιτρέπει τον ορισμό της ιδιότητας.

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

Όπως και με το macro getter, όταν θέλεις να ενημερώσεις την τιμή μιας μεταβλητής στιγμιοτύπου αφού ορίσεις ένα setter, μπορείς να καλέσεις τη μέθοδο που έχει ορίσει το macro setter.

# This:
class Person
  @name : String
  @age : Int32

  def name=(name : String)
    @name = name
  end

  def age=(age : Int32)
    @age = age
  end
end

# Is the same as this:
class Person
  @name : String
  @age : Int32

  setter name, :age
end

Property

Το property είναι ένα macro που ορίζει ταυτόχρονα ένα getter και ένα setter για μια μεταβλητή στιγμιοτύπου.

class Person
  @name : String
  @age : Int32

  property name, :age
end

Οδηγίες

Σε αυτή την άσκηση θα μοντελοποιήσεις μια ζυγαριά.

1. Δημιούργησε μια αρχική κατάσταση για τη ζυγαριά

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

Υλοποίησε τη μέθοδο WeighingMachine#initialize που δέχεται δύο ορίσματα, το precision που είναι Int32 και το metric που είναι Bool. Το όρισμα metric, όταν είναι true, σημαίνει ότι η μηχανή θα πρέπει να χρησιμοποιεί το μετρικό σύστημα, αλλιώς θα πρέπει να χρησιμοποιεί το αγγλοσαξονικό σύστημα. Η μέθοδος initialize θα πρέπει επίσης να ορίζει τη μεταβλητή στιγμιοτύπου @weight σε 0.0.

precision = 3
metric = true
vm = WeighingMachine.new(precision, metric)

2. Επίτρεψε στη ζυγαριά να έχει ακρίβεια

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

Υλοποίησε τη μέθοδο getter WeighingMachine#precision ώστε να επιστρέφει την ακρίβεια της ζυγαριάς.

precision = 3
metric = true
vm = WeighingMachine.new(precision, metric)
vm.precision
# => 3

3. Επίτρεψε να οριστεί το βάρος στη ζυγαριά

Υλοποίησε την ιδιότητα WeighingMachine#weight ώστε να επιτρέπεται η ανάγνωση και ο ορισμός του βάρους:

precision = 3
metric = true
wm = WeighingMachine.new(precision, metric)
wm.weight = 60.5
wm.weight
# => 60.5

wm.weigh
# => 60.5

4. Επίτρεψε στη μηχανή να εναλλάσσεται μεταξύ μετρικών και αγγλοσαξονικών μονάδων

Υλοποίησε την ιδιότητα WeighingMachine#metric= ώστε να επιτρέπεται ο ορισμός της μονάδας. Θα πρέπει να δέχεται μια τιμή Boolean (λογική τιμή).

precision = 3
metric = true
wm = WeighingMachine.new(precision, metric)
vm.weight = 60.5
wm.metric = false

vm.weigh
# => 133.377
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Crystal Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ζυγαριά;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.