2017-05-03 4 views
0

Je rencontre des problèmes pour refactoriser du code dupliqué à partir de deux méthodes partageant une boucle for. Les deux méthodes avec le code dupliqué sont gcdOfFiveUpToFive et remainderStepsUpToFive. Les deux boucles partagent la variable d'instance de paramètre commun @m à 5 et les deux utilisent une boucle for x dans 1..5, puis définissent @n à x et elles ont toutes deux besoin d'appeler euclidGCD bien que l'on appelle euclidGCD pour son retour valeur et l'autre pour ajouter + = 1 à la variable @count. Je veux vouloir retourner 2 valeurs d'une méthode. Je suppose que je pourrais faire une 4ème instance appelée @countArray et obtenir un tableau du nombre de pas restants.Refactoring d'une boucle pour ruby ​​

require 'minitest/autorun' 


class GCDTest < Minitest::Test 
    def test_euclid_gcd 
    gcdTestObject=GCD.new(20,5) 
    assert gcdTestObject.euclidGcd==5 
    assert gcdTestObject.gcdRemainderSteps==1 

    end 

    def test_euclid_two 
    gcdTestObject=GCD.new(13,8) 
    assert gcdTestObject.euclidGcd==1 
    assert gcdTestObject.gcdRemainderSteps==5 
    end 

    def test_euclid_loop 
    gcdTestObject=GCD.new(0,0) 
    assert gcdTestObject.gcdOfFiveUpToFive==[1,1,1,1,5] 
    end 

    def test_count_of_loop 
    gcdTestObject=GCD.new(0,0) 
    assert gcdTestObject.remainderStepsUpToFive==[1,2,3,2,1] 
    end 


end 



class GCD 
    attr_accessor :m,:n 
    attr_reader :count 
    def initialize(m,n) 
    @m=m 
    @n=n 
    @count=0 
    end 

    def euclidGcd 
    @count=1 
    [email protected] 
    [email protected] 
    r= m % n 
    until r==0 
     m=n 
     n=r 
     r= m % n 
     @count+=1 
    end 
    return n 
    end 

    def gcdRemainderSteps 
    return @count 
    end 

    def gcdOfFiveUpToFive 
    @m=5 
    gcdArrayUpToFive=[] 
    for x in 1..5 
     @n=x 
     gcdArrayUpToFive << euclidGcd 
    end 
    return gcdArrayUpToFive 
    end 

    def remainderStepsUpToFive 
    @m=5 
    gcdStepArrayUpToFive=[] 
    for x in 1..5 
     @n=x 
     euclidGcd 
     gcdStepArrayUpToFive << gcdRemainderSteps 
    end 
    return gcdStepArrayUpToFive 
    end 

    def fiveLoopExtraction 

    end 

Répondre

0
code

qui se répète est la suivante:

array=[] 
for x in 1..5 
    # result = do something with x 
    array << result 
end 
return array 

C'est exactement ce que la fonction de carte fait.
What does the "map" method do in Ruby?

Les noms de méthodes Ruby doivent être snake_case. Permet de refactoriser ceci pour utiliser la convention de nommage appropriée et la fonction de carte. Je l'appelle avec params au lieu d'utiliser @m et @n. Cela simplifierait le code. Si vous changez euclid_gcd à ceci: def euclid_gcd(m:, n:) vous obtiendrez ceci:

def gcd_of_5_up_to_5 
    (1..5).map { |x| euclid_gcd(m: 5, n: x) } 
    end 

    def remainder_steps_up_to_5 
    (1..5).map do |x| 
     euclid_gcd(m: 5, n: x) 
     gcd_remainder_steps 
    end 
    end 

On dirait que ce besoin peu ou pas refactoring plus loin.

+0

[link] (https://github.com/jackparsons93/gcdAverage/blob/master/euclidGcdAverage.rb) Ceci est un lien github à mon nouveau code avec le guide de style ruby ​​et votre aide, les 6 tests unitaires sont verts . Aussi pensez-vous que j'ai besoin de refactoriser euclid_gcd c'est 11 lignes ou 9 si vous ne comptez pas def et fin. Aussi, je ne pouvais pas trouver sur le guide de style ruby ​​[link] (https://github.com/bbatsov/ruby-style-guide#classes--modules) S'il était correct d'utiliser toutes les majuscules comme une abréviation, mon nom de classe est GCD et il est tout en majuscules mais il est abrégé. Je me demande si toutes les majuscules sont correctes pour un code rubis éloquent. J'ai également omis tous les retours. –

+0

Vous pouvez google guide de style ruby ​​- variables sont également snake_case. Je pense que GCD et Gcd vont bien, pas sûr de ça. Vous n'avez pas besoin des lignes 44 et 46, essayez ce que j'ai écrit, juste une ligne que j'ai pour def gcd_of_5_up_to_5 .... end est suffisant. Je vous suggère de passer par quelques tutoriels/exemples qui expliquent 'map', c'est une fonction importante et souvent utilisée, également trouvée en javascript et dans d'autres langues. –