2016-04-10 10 views
0

条件付きメソッドを定義してコードをリファクタリングしようとしています。
現在のコードは完全に機能しますが、既存の構造と可読性を維持しながら完全にリファクタリングする必要があります。ハッシュの配列のメソッドを定義してリファクタリングする


このシナリオでは、ユーザーに選択を求めるメッセージが表示されます。その選択は、ハッシュの配列内のシンボルに関連付けられます。方法は、このサンプルの最後の2つのputsを置き換える必要があります。コードはこれらの2行を何度も何度も表示します。

puts"Red, white, or something else?" 
user_category_selection = gets.chomp.downcase 
puts "-"*80 

wine_rack = [ 
    { name: "The Fugitive", 
    vintage: 2010, 
    category: "Red", 
    grape_composition: "Red Blend", 
    location: "Napa, California", 
    personal_rating: 91}, 

    { name: "Au Bon Climat", 
    vintage: 2010, 
    category: "White", 
    grape_composition: "Chardonnay", 
    location: "Santa Barbara, California", 
    personal_rating: 89}, 

    { name: "Laurent-Perrier", 
    vintage: "Non-vintage", 
    category: "Something Else", 
    grape_composition: "Ultra Brut", 
    location: "France", 
    personal_rating: 92} 
] 

これが機能していない作品です。

def vintage_name_location(category) 
    category = wine_rack[:category].downcase 
    while category.downcase.include? user_category_selection 
    puts "#{wine[:vintage]} #{wine[:name]}, #{wine[:location]}".center(80) 
    puts "#{wine[:grape_composition]}, rated #{wine[:personal_rating]} points".center(80) 
    end 
end 
puts vintage_name_location(user_category_selection) 

コードの残りの部分がある:あなたが正しく説明してきたように

until ["white", "red", "something else"].include? user_category_selection.downcase 
    puts "Pardon me for asking, but are you intoxicated already?".center(80) 
    puts "I said red, white, or something else.".center(80) 
    user_category_selection = gets.chomp 
end 

if user_category_selection.downcase.eql? "red" 
    puts "May I suggest one of these delightful reds:" 
    puts "--------------------------------------------------".center(80) 
    for wine in wine_rack 
    if wine[:category].downcase == user_category_selection 
     puts "#{wine[:vintage]} #{wine[:name]}, #{wine[:location]}".center(80) 
     puts "#{wine[:grape_composition]}, rated #{wine[:personal_rating]} points".center(80) 
     puts "--------------------------------------------------".center(80) 
    end 
    end 
elsif user_category_selection.downcase.eql? "white" 
+0

あなたはそのようcategory_to_winesは[user_category_selection.downcase] '与え'、「コードの残りの部分」にハッシュ 'category_to_wines'を構築検討するかもしれませんあなたには推奨するワイン(ハッシュ)のリストがあります。次のようにすることができます: 'category_to_wines = wine_rack.each_with_object({}){| wine、h | (h [wine [:category] ​​.downcase] || = [])<<ワイン}。各キーの "カテゴリ"(ダウンケース)の値は、そのカテゴリで一致するワイン(ハッシュ)の配列です。より大きな画像を見ると、アプリケーションにデータベースを使用することを検討する必要があります。 –

+0

私は 'for'ループを使用しない* * *をお勧めします。 Rubyの方法は 'each'または' map'を使って反復することです。あなたのコードにインデントをデバッグ/メンテナンスの補佐として維持してください。長期的には本当に役立ちます。あなたのコードは完全ではありません。 「[mcve]」をお読みください。文法的に正しいものが必要です。 –

+0

Tin Manありがとうございました - 現時点では、私は意図的にさらなる実践のためにループを使用しています。まったく同感です。このコードは、簡潔にするために完全に公開されていませんでした。 –

答えて

1

、あなたのwine_rackはとても配列でありますwine_rack[:category]のようなカテゴリの名前を使用して項目を検索することはできません。

一つのアプローチは、このようなカテゴリに一致するワインを選び出すためにselectを使用することです:

matching_wines = wine_rack.select { |wine| wine[:category].downcase == category } 

あなたはこのようなあなたの機能であることをラップしたい:

def wines_in_category(category) 
    wine_rack.select { |wine| wine[:category].downcase == category } 
end 

してから使用しますそれは次のようなものです:

suitable_wines = wines_in_category(user_category_selection) 
for wine in suitable_wines 
... 
+0

これは完璧な意味合いがあります!私は丸穴に箱を入れようとしていました! –

+0

:-)うれしかった – mikej

0

あなたが作業しなければならないハット変数。

メソッドから直接wine_rackとやりとりする機能がないことに注意してください。 sendメソッドを使用してスコープゲートを開くことができます。または、wine_rack配列を渡すことができます。

また、Array#selectは、ブロックがtrueを返すすべてのインスタンスを返します。これは、今お使いのソフトウェアに影響を与えないかもしれないが、それは後で問題につながる可能性:

puts "Variables I have to work with: #{local_variables}" 

def get_wine_information(passed_wine_rack,user_selection) 
    puts "Variables I have to work with inside method: #{local_variables}" 
    selection = passed_wine_rack.find {|wine| wine[:category] == user_selection} 
    puts "#{selection[:vintage]} #{selection[:name]}, #{selection[:location]}" 
    puts "#{selection[:grape_composition]}, rated #{selection[:personal_rating]} points" 
end 

#Scope Gate 
Kernel.send(:define_method, :get_wine_info) do |user_selection| 
    puts "Variables I have to work with inside scope gate: #{local_variables}" 
end 

#Calling just to see scope information 
get_wine_info("") 

get_wine_information(wine_rack,user_category_selection) 
関連する問題