2016-05-23 2 views
-2

Ich bin Neuling in Programmierung und Ruby. Ich benutze eine Methode, um herauszufinden, wer jemand geheimer Weihnachtsmann ist. Die Methode verwendet String- und Integer-Argumente (Vorname oder ID). Ich habe einen anderen Code für String- und Integer-Argumente. Dies führt dazu, dass dieselbe Codezeile für verschiedene Argumente wiederholt wird (secret = PERSONS [person [: santa] -1]).TROCKEN in Ruby - Ist es in Ordnung, eine Codezeile zu wiederholen?

Meine Fragen sind zweifach:

  1. Ist diese Art der Wiederholung gegen DRY Prinzipien? Gibt es einen anderen Weg, die Wiederholung zu vermeiden?

  2. Sehen Sie, dass ich local_variable secret außerhalb des Iterators initialisiert habe und den Iterator verwendet habe, um an diese Variable zu übergeben. Ist das der effizienteste Weg, dies zu tun? Kann ich einfach einen Wert vom Iterator zurückgeben, ohne eine lokale Variable zu initialisieren?

Mein Code ist unten. Außerdem füge ich einen Beispiel-Hash der Daten (PERSONS) bei, auf dem ich den Code ausführe.

def who_is_secret_santa(first_name) 
    secret = nil 
    PERSONS.each do |person| 
    if first_name.is_a? String 
     if person[:first_name] == first_name 
     secret = PERSONS[person[:santa]-1] 
     end 
    elsif first_name.is_a? Integer 
     if person[:id] == first_name 
     secret = PERSONS[person[:santa]-1] 
     end 
    else 
     puts "Bad argument" 
    end 
    end 
    puts "#{first_name}'s Secret Santa " + (secret ? "is #{secret[:first_name]}" : "not found") 
end 


[{:id=>1, 
    :first_name=>"Luke", 
    :last_name=>"Skywalker", 
    :email=>"<[email protected]>", 
    :santa=>4}, 
{:id=>2, 
    :first_name=>"Leia", 
    :last_name=>"Skywalker", 
    :email=>"<[email protected]>", 
    :santa=>7}, 
{:id=>3, 
    :first_name=>"Toula", 
    :last_name=>"Portokalos", 
    :email=>"<[email protected]>", 
    :santa=>5}, 
{:id=>4, 
    :first_name=>"Gus", 
    :last_name=>"Portokalos", 
    :email=>"<[email protected]>", 
    :santa=>2}, 
{:id=>5, 
    :first_name=>"Bruce", 
    :last_name=>"Wayne", 
    :email=>"<[email protected]>", 
    :santa=>3}, 
{:id=>6, 
    :first_name=>"Virgil", 
    :last_name=>"Brigman", 
    :email=>"<[email protected]>", 
    :santa=>1}, 
{:id=>7, 
    :first_name=>"Lindsey", 
    :last_name=>"Brigman", 
    :email=>"<[email protected]>", 
    :santa=>6}] 
+0

einen Blick auf diese: http://rubyofftherails.blogspot.com.br/2016/05/better-algorithms.html –

+0

Es geht nicht um Ihren speziellen Code, aber können Sie mit dem DRY-Prinzip helfen. –

Antwort

1

Es gibt einen Weg Wiederholung in diesem Fall zu vermeiden, indem sie zuerst für ein „schlechtes Argument“ Prüfen und dann anschließend die richtige Person aus dem Array auswählen.

Für Ihre zweite Frage suchen Sie wahrscheinlich den select Iterator anstelle von jedem. Es wird alle Elemente in Ihrem Array zurückgeben, die die Bedingung in dem Block, der an es übergeben wird, wahr machen.

Unten ist ein Code. p wird die Person darstellen, deren first_name an die Methode übergeben wurde.

def who_is_secret_santa(first_name) 
    if ! ((first_name.is_a? String) || (first_name.is_a? Integer)) 
    puts "Bad argument" 
    else 
    p = (PERSONS.select do |person| person[:first_name] == first_name || person[:id] == first_name end)[0] 
    puts "#{first_name}'s Secret Santa " + (p ? "is #{PERSONS[p[:santa]-1][:first_name]}" : "not found") 
    end 
end 
Verwandte Themen