class Team def initialize name, roles={} @name = name @roles = roles end def roles @roles.keys end end Team.new('Scrum', product_owner: 'Alice', scrum_master: 'Bob').roles => [:product_owner, :scrum_master]looks plausible.
But:
Team.new('Scrum', product_owner: 'Alice', sales: 'Sarah').roles => [:product_owner, :sales]is definitely not a Scrum team.
Every time the API expects certain named parameters, those have to be filtered, like:
class Team def initialize name, roles={} @name = name @roles = [:product_owner, :scrum_master, :developer]. each_with_object(Hash.new) { |role, hash| hash[role] = roles[role] if roles.has_key?(role) } end def roles @roles.keys end end Team.new('Scrum', product_owner: 'Alice', sales: 'Sarah').roles => [:product_owner]Please note, that :sales was filtered out, like any would have been except :product_owner, :scrum_master or :developer.
The Hash filtering logic is likely supposed to be repeated. And that is why extending the Hash is plausible.
Ruby on Rails already has in their ActiveSupport gem. The Hash#slice does exactly filter a Hash for keys. So the example in Ruby On Rails would rather look like:
class Team def initialize name, roles={} @name = name @roles = roles.slice :product_owner, :scrum_master, :developer end def roles @roles.keys end end Team.new('Scrum', product_owner: 'Alice', sales: 'Sarah').roles => [:product_owner]Furthermore Hash#slice! even replaces the hash itself with the given keys. But beware it returns a hash with the removed key/ value pairs.
Further articles of interest:
Supported by Ruby 2.1.1 and Ruby on Rails 4.1.8
Keine Kommentare:
Kommentar veröffentlichen