Last active
January 15, 2023 21:24
-
-
Save serradura/2d9cab9a1f0975ba1e0a0bbd53ea8fa9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AssemblyLine | |
CARS_PRODUCED_PER_HOUR = 221.0 | |
def self.calculate_cars_per_hour(speed) | |
speed * CARS_PRODUCED_PER_HOUR | |
end | |
def self.calculate_success_rate(speed) | |
case speed | |
when 1..4 then 1 | |
when 5..8 then 0.9 | |
when 9 then 0.8 | |
when 10 then 0.77 | |
end | |
end | |
def self.calculate_production_rate_per_hour(speed) | |
calculate_cars_per_hour(speed) * calculate_success_rate(speed) | |
end | |
def initialize(speed) | |
@speed = speed | |
end | |
def production_rate_per_hour | |
self.class.calculate_production_rate_per_hour(@speed) | |
end | |
ONE_HOUR_IN_MINUTES = 60 | |
def working_items_per_minute | |
(production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AssemblyLine | |
module Calculate | |
def self.cars_per_hour(speed) | |
speed * 221.0 | |
end | |
def self.success_rate(speed) | |
case speed | |
when 1..4 then 1 | |
when 5..8 then 0.9 | |
when 9 then 0.8 | |
when 10 then 0.77 | |
end | |
end | |
def self.production_rate_per_hour(speed) | |
cars_per_hour(speed) * success_rate(speed) | |
end | |
end | |
attr_reader :production_rate_per_hour | |
def initialize(speed) | |
@production_rate_per_hour = Calculate.production_rate_per_hour(speed) | |
end | |
ONE_HOUR_IN_MINUTES = 60 | |
def working_items_per_minute | |
@working_items_per_minute ||= (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AssemblyLine | |
SuccessRate = Struct.new(:speed, :percentage, keyword_init: true) do | |
@options = [ | |
{ speed: 1..4, percentage: 1.00 }, | |
{ speed: 5..8, percentage: 0.90 }, | |
{ speed: 9, percentage: 0.80 }, | |
{ speed: 10, percentage: 0.77 } | |
].map! { |config| new(**config).freeze }.freeze | |
def self.detect_for(speed) | |
@options.find { |rate| rate.speed === speed } | |
end | |
end | |
attr_reader :speed, :success_rate | |
def initialize(speed) | |
@speed = speed | |
@success_rate = SuccessRate.detect_for(speed) | |
end | |
CARS_PRODUCED_PER_HOUR = 221.0 | |
def production_rate_per_hour | |
@production_rate_per_hour ||= (CARS_PRODUCED_PER_HOUR * speed) * success_rate.percentage | |
end | |
ONE_HOUR_IN_MINUTES = 60 | |
def working_items_per_minute | |
@working_items_per_minute ||= (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AssemblyLine | |
SuccessRate = Struct.new(:speed, :percentage, keyword_init: true) do | |
@options = [ | |
new(speed: 1..4, percentage: 1.00), | |
new(speed: 5..8, percentage: 0.90), | |
new(speed: 9, percentage: 0.80), | |
new(speed: 10, percentage: 0.77) | |
].map!(&:freeze).freeze | |
def self.detect_for(speed) | |
@options.detect { |rate| rate.speed === speed } | |
end | |
end | |
attr_reader :speed, :success_rate | |
def initialize(speed) | |
@speed = speed | |
@success_rate = SuccessRate.detect_for(speed) | |
end | |
CARS_PRODUCED_PER_HOUR = 221.0 | |
def production_rate_per_hour | |
@production_rate_per_hour ||= (CARS_PRODUCED_PER_HOUR * speed) * success_rate.percentage | |
end | |
ONE_HOUR_IN_MINUTES = 60 | |
def working_items_per_minute | |
@working_items_per_minute ||= (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AssemblyLine | |
SuccessRate = Struct.new(:speed, :percentage, keyword_init: true) do | |
private_class_method :new | |
@options = [ | |
new(speed: 1..4, percentage: 1.00), | |
new(speed: 5..8, percentage: 0.90), | |
new(speed: 9, percentage: 0.80), | |
new(speed: 10, percentage: 0.77) | |
].map!(&:freeze).freeze | |
def self.detect_for(speed) | |
@options.detect { |rate| rate.speed === speed } | |
end | |
end | |
attr_reader :speed, :success_rate | |
def initialize(speed) | |
@speed = speed | |
@success_rate = SuccessRate.detect_for(speed) | |
end | |
CARS_PRODUCED_PER_HOUR = 221.0 | |
def production_rate_per_hour | |
@production_rate_per_hour ||= (CARS_PRODUCED_PER_HOUR * speed) * success_rate.percentage | |
end | |
ONE_HOUR_IN_MINUTES = 60 | |
def working_items_per_minute | |
@working_items_per_minute ||= (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i | |
end | |
end |
class AssemblyLine
SuccessRate = Struct.new(:speed) do
def percentage
case speed
when 1..4 then 1.00
when 5..8 then 0.90
when 9 then 0.80
when 10 then 0.77
end
end
def coerce(other)
[other, percentage]
end
end
attr_reader :speed
def initialize(speed)
@speed = speed
end
CARS_PRODUCED_PER_HOUR = 221.0
def production_rate_per_hour
(CARS_PRODUCED_PER_HOUR * speed) * SuccessRate[speed]
end
ONE_HOUR_IN_MINUTES = 60
def working_items_per_minute
(production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i
end
end
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The simplest version.
And an iteration that adds constants to reduce the magic numbers code smell.