Idiomatic Ruby: pisanje čudovite kode

Ruby je čudovit programski jezik.

Po Rubyjevi uradni spletni strani je Ruby:

Dinamičen, odprtokodni programski jezik s poudarkom na preprostosti in storilnosti. Ima elegantno skladnjo, ki je naravno berljiva in enostavna za pisanje. «

Ruby je ustvaril Yukihiro Matsumoto, japonski programski inženir. Od leta 2011 je v Herokuju glavni oblikovalec in inženir programske opreme za Ruby.

Matsumoto je pogosto rekel, da poskuša Ruby narediti naravnega, ne preprostega , tako da odraža življenje.

"Ruby je preprostega videza, v notranjosti pa je zelo zapletena, tako kot naše človeško telo" - Yukihiro Matsumoto

Do Ruby se počutim enako. Je kompleksen, a zelo naraven programski jezik z lepo in intuitivno sintakso.

Z bolj intuitivno in hitrejšo kodo lahko zgradimo boljšo programsko opremo. V tem prispevku vam bom pokazal, kako izražam svoje misli (aka koda) z Ruby, z uporabo odrezkov kode.

Izražanje svojih misli z metodami nizov

Zemljevid

Z metodo zemljevida poenostavite kodo in dobite, kar želite.

Zemljevid metode vrne novo matriko z rezultati izvajanja bloka enkrat za vsak element v enum.

Poskusimo:

an_array.map  element * element 

Tako preprosto.

Ko pa začnete kodirati z Rubyjem, je enostavno vedno uporabiti vsak iterator.

Vsak iteratorja kot je prikazano spodaj

user_ids = [] users.each user

Lahko ga poenostavite z zemljevidom v eni lepi vrstici kode:

user_ids = users.map  user.id 

Ali še bolje (in hitreje):

user_ids = users.map(&:id)

Izberite

In ko ste navajeni kodiranja z zemljevidom , je včasih vaša koda lahko taka:

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

Z uporabo zemljevida za izbiro samo parnih številk se vrnenič predmet tudi. S kompaktno metodo odstranite vse ničelne predmete.

In ta-da, izbrali ste vse parne številke.

Naloga opravljena.

Daj no, lahko tudi boljše od tega! Ste slišali za izbrano metodo iz naštetega modula?

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

Samo ena vrstica. Preprosta koda. Lahko razumeti.

Bonus

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

Vzorec

Predstavljajte si, da morate iz nabora dobiti naključni element. Pravkar ste se začeli učiti Ruby, zato bo vaša prva misel: "Uporabimo naključno metodo," in to se zgodi:

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

No, kodo lahko razumemo, vendar nisem prepričan, ali je dovolj dobra. In kaj, če uporabimo metodo premešanja ?

[1, 2, 3].shuffle.first

Hmm. Pravzaprav raje uporabljam naključno mešanje čez rand . Toda ko sem odkril vzorčno metodo, je bila toliko bolj smiselna:

[1, 2, 3].sample

Res, res preprosto.

Precej naravno in intuitivno. Zahtevamo vzorec iz polja in metoda ga vrne. Zdaj sem vesel.

Kaj pa ti?

Izražanje svojih misli s sintakso Ruby

Kot sem že omenil, mi je všeč, kako mi Ruby dovoljuje kodiranje. Zame je res naravno. Pokazal bom dele čudovite sintakse Ruby.

Implicitna vrnitev

Vsak stavek v Rubyu vrne vrednost zadnjega ocenjenega izraza. Preprost primer je getrske način. Pokličemo metodo in v zameno pričakujemo neko vrednost.

Pa poglejmo:

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

A kot vemo, Ruby vedno vrne zadnji ocenjeni izraz. Zakaj uporabiti izjavo return ?

Po 3 letih uporabe Rubyja se počutim odlično, saj uporabljam skoraj vse metode brez izjave o vrnitvi .

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

Več nalog

Ruby mi omogoča, da hkrati dodelim več spremenljivk. Ko začnete, morda kodirate tako:

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

Zakaj pa ne bi dodelili več spremenljivk hkrati?

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

Precej super.

Metode, ki postavljajo vprašanja (imenovane tudi predikati)

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

Izvedeli smo tudi, kako je Ruby lepa in intuitivna ter teče še hitreje.

In to je to, fantje! Posodobil bom in vključil več podrobnosti v svoj spletni dnevnik. Ideja je deliti odlično vsebino in skupnost pomaga izboljšati to objavo! ☺

Upam, da cenite vsebino in ste se naučili programirati čudovito kodo (in boljšo programsko opremo).

Če želite popoln tečaj Ruby, se naučite resničnih veščin kodiranja in gradite projekte, poskusite enomesečni Ruby Bootcamp . Se vidimo ☺

Ta objava se je prvič pojavila tukaj v moji publikaciji Renaissance Developer .

Zabavajte se, nadaljujte z učenjem in vedno kodirajte!

Moj Twitter in Github. ☺