Idiomatic Ruby: γράφοντας όμορφο κώδικα

Το Ruby είναι μια όμορφη γλώσσα προγραμματισμού.

Σύμφωνα με την επίσημη ιστοσελίδα της Ruby, η Ruby είναι:

« Δυναμική, γλώσσα προγραμματισμού ανοιχτού κώδικα με έμφαση στην απλότητα και την παραγωγικότητα. Έχει μια κομψή σύνταξη που είναι φυσικό να διαβάζεται και να γράφεται εύκολα. "

Η Ruby δημιουργήθηκε από τον Yukihiro Matsumoto, ιαπωνικό μηχανικό λογισμικού. Από το 2011, είναι ο επικεφαλής σχεδιαστής & μηχανικός λογισμικού για την Ruby στο Heroku.

Ο Ματσουμότο είπε συχνά ότι προσπαθεί να κάνει το Ρούμπι φυσικό, όχι απλό , με τρόπο που να αντικατοπτρίζει τη ζωή.

«Το Ruby είναι απλό στην εμφάνιση, αλλά είναι πολύ περίπλοκο στο εσωτερικό, όπως και το ανθρώπινο σώμα μας» - Yukihiro Matsumoto

Νιώθω τον ίδιο τρόπο για τον Ruby. Είναι μια πολύπλοκη αλλά πολύ φυσική γλώσσα προγραμματισμού, με μια όμορφη και διαισθητική σύνταξη.

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

Εκφράζοντας τις σκέψεις μου με μεθόδους συστοιχίας

Χάρτης

Χρησιμοποιήστε τη μέθοδο χάρτη για να απλοποιήσετε τον κωδικό σας και να λάβετε αυτό που θέλετε.

Ο χάρτης μεθόδων επιστρέφει έναν νέο πίνακα με τα αποτελέσματα της εκτέλεσης ενός μπλοκ μία φορά για κάθε στοιχείο στο enum.

Ας το προσπαθήσουμε:

an_array.map  element * element 

Τόσο απλό.

Αλλά όταν αρχίζετε να κωδικοποιείτε με το Ruby, είναι εύκολο να χρησιμοποιείτε πάντα τον κάθε επαναληπτικό.

Το κάθε επαναληπτικό όπως φαίνεται παρακάτω

user_ids = [] users.each user

Μπορεί να απλοποιηθεί με χάρτη σε μια μοναδική όμορφη γραμμή κώδικα:

user_ids = users.map  user.id 

Ή ακόμα καλύτερα (και πιο γρήγορα):

user_ids = users.map(&:id)

Επιλέγω

Και όταν συνηθίζετε να κωδικοποιείτε με χάρτη , μερικές φορές ο κώδικάς σας μπορεί να είναι έτσι:

even_numbers = [1, 2, 3, 4, 5].map element # [ni, 2, nil, 4, nil] even_numbers = even_numbers.compact # [2, 4]

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

Και ta-da, έχετε επιλέξει όλους τους ζυγούς αριθμούς.

Αποστολή εξετελέσθει.

Έλα, μπορούμε να κάνουμε καλύτερα από αυτό! Ακούσατε για την επιλεγμένη μέθοδο από την αναρίθμητη ενότητα;

[1, 2, 3, 4, 5].select  

Μόνο μία γραμμή. Απλός κωδικός. Ευνόητος.

Δώρο

[1, 2, 3, 4, 5].select(&:even?)

Δείγμα

Φανταστείτε ότι πρέπει να λάβετε ένα τυχαίο στοιχείο από έναν πίνακα. Μόλις ξεκινήσατε να μαθαίνετε τον Ruby, οπότε η πρώτη σας σκέψη θα είναι: «Ας χρησιμοποιήσουμε την τυχαία μέθοδο» και αυτό συμβαίνει:

[1, 2, 3][rand(3)]

Λοιπόν, μπορούμε να καταλάβουμε τον κώδικα, αλλά δεν είμαι σίγουρος αν είναι αρκετά καλός. Και τι γίνεται αν χρησιμοποιούμε τη μέθοδο ανακατέματος ;

[1, 2, 3].shuffle.first

Χμμ. Στην πραγματικότητα προτιμώ να χρησιμοποιώ shuffle over rand . Αλλά όταν ανακάλυψα τη μέθοδο δειγματοληψίας , ήταν πολύ πιο λογικό:

[1, 2, 3].sample

Πραγματικά, πολύ απλό.

Πολύ φυσικό και διαισθητικό. Ζητούμε ένα δείγμα από έναν πίνακα και η μέθοδος το επιστρέφει. Τώρα είμαι χαρούμενος.

Τι γίνεται με εσένα;

Εκφράζοντας τις σκέψεις μου με τη σύνταξη του Ruby

Όπως ανέφερα προηγουμένως, μου αρέσει ο τρόπος με τον οποίο η Ruby μου επιτρέπει να κωδικοποιώ. Είναι πραγματικά φυσικό για μένα. Θα δείξω τμήματα της όμορφης σύνταξης Ruby.

Σιωπηρή επιστροφή

Οποιαδήποτε δήλωση στο Ruby επιστρέφει την τιμή της τελευταίας αξιολογημένης έκφρασης. Ένα απλό παράδειγμα είναι η μέθοδος λήψης . Καλούμε μια μέθοδο και αναμένουμε κάποια αξία ως αντάλλαγμα.

Ας δούμε:

def get_user_ids(users) return users.map(&:id) end

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

Μετά τη χρήση του Ruby για 3 χρόνια, νιώθω υπέροχα χρησιμοποιώντας σχεδόν κάθε μέθοδο χωρίς τη δήλωση επιστροφής .

def get_user_ids(users) users.map(&:id) end

Πολλαπλές εργασίες

Το Ruby μου επιτρέπει να εκχωρήσω πολλές μεταβλητές ταυτόχρονα. Όταν ξεκινάτε, ενδέχεται να κωδικοποιείτε ως εξής:

def values [1, 2, 3] end one = values[0] two = values[1] three = values[2]

Αλλά γιατί να μην εκχωρήσετε πολλές μεταβλητές ταυτόχρονα;

def values [1, 2, 3] end one, two, three = values

Πολύ φοβερό.

Μέθοδοι που κάνουν ερωτήσεις (ονομάζονται επίσης κατηγορηματικά)

One feature that caught my attention when I was learning Ruby was the question mark (?) method, also called the predicates methods. It was weird to see at first, but now it makes so much sense. You can write code like this:

movie.awesome # => true

Ok… nothing wrong with that. But let’s use the question mark:

movie.awesome? # => true

This code is much more expressive, and I expect the method’s answer to return either a true or false value.

A method that I commonly use is any? It’s like asking an array if it has anything inside it.

[].any? # => false [1, 2, 3].any? # => true

Interpolation

For me string interpolation is more intuitive than string concatenation. Period. Let’s see it in action.

An example of a string concatenation:

programming_language = "Ruby" programming_language + " is a beautiful programming_language" # => "Ruby is a beautiful programming_language"

An example of a string interpolation:

programming_language = "Ruby" "#{programming_language} is a beautiful programming_language" # => "Ruby is a beautiful programming_language"

I prefer string interpolation.

What do you think?

The if statement

I like to use the if statement:

def hey_ho? true end puts "let’s go" if hey_ho?

Pretty nice to code like that.

Feels really natural.

The try method (with Rails mode on)

The try method invokes the method identified by the symbol, passing it any arguments and/or the block specified. This is similar to Ruby’s Object#send. Unlike that method, nil will be returned if the receiving object is a nil object or NilClass.

Using if and unless condition statement:

user.id unless user.nil?

Using the try method:

user.try(:id)

Since Ruby 2.3, we can use Ruby’s safe navigation operator (&.) instead of Rails try method.

user&.id

Double pipe equals (||=) / memoization

This feature is so C-O-O-L. It’s like caching a value in a variable.

some_variable ||= 10 puts some_variable # => 10 some_variable ||= 99 puts some_variable # => 10

You don’t need to use the if statement ever. Just use double pipe equals (||=) and it’s done.

Simple and easy.

Class static method

One way I like to write Ruby classes is to define a static method (class method).

GetSearchResult.call(params)

Simple. Beautiful. Intuitive.

What happens in the background?

class GetSearchResult def self.call(params) new(params).call end def initialize(params) @params = params end def call # ... your code here ... end end

The self.call method initializes an instance, and this object calls the call method. Interactor design pattern uses it.

Getters and setters

For the same GetSearchResult class, if we want to use the params, we can use the @params

class GetSearchResult def self.call(params) new(params).call end def initialize(params) @params = params end def call # ... your code here ... @params # do something with @params end end

We define a setter and getter:

class GetSearchResult def self.call(params) new(params).call end def initialize(params) @params = params end def call # ... your code here ... params # do something with params method here end private def params @params end def params=(parameters) @params = parameters end end

Or we can define attr_reader, attr_writer, or attr_accessor

class GetSearchResult attr_reader :param def self.call(params) new(params).call end def initialize(params) @params = params end def call # ... your code here ... params # do something with params method here end end

Nice.

We don’t need to define the getter and setter methods. The code just became simpler, just what we want.

Tap

Imagine you want to define a create_user method. This method will instantiate, set the parameters, and save and return the user.

Let’s do it.

def create_user(params) user = User.new user.id = params[:id] user.name = params[:name] user.email = params[:email] # ... user.save user end

Simple. Nothing wrong here.

So now let’s implement it with the tap method

def create_user(params) User.new.tap do |user| user.id = params[:id] user.name = params[:name] user.email = params[:email] # ... user.save end end

You just need to worry about the user parameters, and the tap method will return the user object for you.

That’s it

We learned I write idiomatic Ruby by coding with

  • array methods
  • syntax

Μάθαμε επίσης πώς το Ruby είναι όμορφο και διαισθητικό και τρέχει ακόμα πιο γρήγορα.

Και αυτό είναι, παιδιά! Θα ενημερώσω και θα συμπεριλάβω περισσότερες λεπτομέρειες στο ιστολόγιό μου. Η ιδέα είναι να μοιραστείτε υπέροχο περιεχόμενο και η κοινότητα συμβάλλει στη βελτίωση αυτής της ανάρτησης! ☺

Ελπίζω να εκτιμήσετε το περιεχόμενο και να μάθετε πώς να προγραμματίζετε όμορφο κώδικα (και καλύτερο λογισμικό).

Αν θέλετε ένα πλήρες μάθημα Ruby, μάθετε δεξιότητες κωδικοποίησης πραγματικού κόσμου και δημιουργήστε έργα, δοκιμάστε ένα μήνα Ruby Bootcamp . Τα λέμε εκεί ☺

Αυτή η ανάρτηση εμφανίστηκε για πρώτη φορά εδώ στη δημοσίευση του Renaissance Developer .

Διασκεδάστε, συνεχίστε να μαθαίνετε και συνεχίστε να κωδικοποιείτε!

Το Twitter και το Github. ☺