2016-02-16 2 views
1

Я недавно начал изучать рубин, и я стараюсь избегать использования глобальных переменных там, где это возможно. Я написал программу ниже, которая принимает вход пользователя и выводит математические таблицы выбора пользователей (в настоящее время просто +, *, но для расширения). Я следую предложениям от https://adriann.github.io/programming_problems.html, чтобы получить образование.Можно ли это оптимизировать без использования глобальной переменной?

class User_input 
    . 
    # multiply 
    def User_input.mult1_to_12 
     by = (0..12).each do | range | 
     result = $choice_int * range 
     puts "#{$choice_int} x #{range} = #{result}" 
     end 
    end 

# add 
def User_input.add1_to_12 
    add = (0..12).each do | range | 
    result = $choice_int + range 
    puts "#{$choice_int} + #{range} = #{result}" 
    end 
end 

# accepts user input 
puts "Please enter the tables you require (1-12): " 
    $choice_int = gets.to_i 
    puts "You have selected #{$choice_int}" 
    puts "Which tables do you require (+ - * /): " 
    choice_method = gets.chomp 
    puts "the method you have chosen is #{choice_method}" 

    if choice_method == "*" 
    User_input.mult1_to_12 
    elsif 
    choice_method == "+" 
    add1_to_12 
    end 
end 

Вы заметите, что я в настоящее время с помощью глобальной переменной для $choice. Может ли кто-нибудь с большим опытом предложить более оптимальное решение. Пожалуйста, не стесняйтесь разрывать мой код:) Спасибо.

+2

Ваш вопрос лучше подходит для SO, [Обзор кода] (http://codereview.stackexchange.com/), где вы можете получить полезные советы о том, как улучшить рабочий код. Цель SO - предоставить помощь по исправлению неисправного кода и предоставить предложения о том, как выполнить задание. Кроме того, в обзоре кода вы, как правило, получите более подробное объяснение причин для решения проблемы определенным образом. –

+0

@ CarySwoveland Спасибо за отзыв Кэри. Посмотрите обзор кода. – mickm

+0

«Можно ли это сделать более оптимальным образом?» подразумевает, что ваш код уже оптимален, поэтому по определению он не может быть улучшен. (-: и | - :. –

ответ

1

Методы могут принимать параметры, например:

# add numbers 
def add(a,b) 
    a+b 
end 

puts add(1,2) 
# will output 3 

Вот простая модификация кода с использованием параметров:

class UserInput 
    # multiply 
    def self.mult1_to_12(choice_int) 
    (0..12).each do | range | 
     result = choice_int * range 
     puts "#{choice_int} x #{range} = #{result}" 
    end 
    end 

    # add 
    def self.add1_to_12(choice_int) 
    (0..12).each do | range | 
     result = choice_int + range 
     puts "#{choice_int} + #{range} = #{result}" 
    end 
    end 
end 

# accepts user input 
puts "Please enter the tables you require (1-12): " 
choice_int = gets.to_i 
puts "You have selected #{choice_int}" 
puts "Which tables do you require (+ - * /): " 
choice_method = gets.chomp 
puts "the method you have chosen is #{choice_method}" 

if choice_method == "*" 
    UserInput.mult1_to_12(choice_int) 
elsif choice_method == "+" 
    UserInput.add1_to_12(choice_int) 
end 

А вот немного симпатичнее решение, которое также может обрабатывать - и/(и кучу других операций, предоставленных Ruby's Fixnum):

class UserInputProcessor 
    # define accessors to instance variables 
    attr_accessor :choice_int, :choice_method 

    def process 
    (0..12).map do |range| 
     if choice_method.eql?('/') 
     next if range.eql?(0) # need to skip X/0 to avoid division by zero 
     range = range.to_f # need to convert range to float to get float results 
     end 
     "#{choice_int} #{choice_method} #{range.to_i} = #{choice_int.send(choice_method, range)}" 
    end 
    end 
end 

handler = UserInputProcessor.new 

print "Please enter the tables you require (1-12): " 
handler.choice_int = gets.chomp.to_i 
puts "You have selected #{handler.choice_int}" 

print "Which tables do you require (+ - * /): " 
handler.choice_method = gets.chomp 
puts "the method you have chosen is #{handler.choice_method}" 
puts "And here are the results:" 
puts handler.process.join("\n") 
+0

было в его коде –

+0

. Вы правы. done. –

+1

Поскольку мы делаем [codereview.se ] здесь: вызов 'new' без аргументов, а затем настройка объекта с помощью сеттеров - это запах кода. Объекты должны быть действительными после построения, но в вашем случае экземпляр' UserInputProcessor' взорвется 'NoMethodError' для 'nil 'повсюду, если вы попытаетесь использовать его непосредственно после его создания. И второстепенный:' puts' уже обрабатывает 'Array' специально, печатая элементы по очереди, нет необходимости в этом вызове ' join' на последней строке. 'to_i' игнорирует все после числа в начале nning строки, не нужно 'chomp' it. –

Смежные вопросы