可能有助于代码重构 [英] Possible help in code refactoring
问题描述
Sandi Metz 在 GORUCO 的 SOLID OOPS 概念 中说,Ruby 中 if..else
块的存在可以被认为是一种偏差来自开闭原则.可以使用哪些所有方法来避免不紧急的 if..else
条件?我尝试了以下代码:
Sandi Metz says in SOLID OOPS concepts from GORUCO that presence of if..else
blocks in Ruby can be considered to be a deviation from Open-Close Principle. What all methods can be used to avoid not-urgent if..else
conditions? I tried the following code:
class Fun
def park(s=String.new)
puts s
end
def park(i=Fixnum.new)
i=i+2
end
end
并发现函数重载在 Ruby 中不起作用.还有哪些方法可以让代码遵守OCP?
and found out that function overloading does not work in Ruby. What are other methods through which the code can be made to obey OCP?
我本来可以去的:
class Fun
def park(i)
i=i+2 if i.class==1.class
puts i if i.class=="asd".class
end
end
但这违反了 OCP.
推荐答案
你可以这样做:
class Parent
attr_reader :s
def initialize(s='')
@s = s
end
def park
puts s
end
end
class Child1 < Parent
attr_reader :x
def initialize(s, x)
super(s)
@x = x
end
def park
puts x
end
end
class Child2 < Parent
attr_reader :y
def initialize(s, y)
super(s)
@y = y
end
def park
puts y
end
end
objects = [
Parent.new('hello'),
Child1.new('goodbye', 1),
Child2.new('adios', 2),
]
objects.each do |obj|
obj.park
end
--output:--
hello
1
2
或者,也许我忽略了你的一个曲折:
Or, maybe I overlooked one of your twists:
class Parent
attr_reader :x
def initialize(s='')
@x = s
end
def park
puts x
end
end
class Child1 < Parent
def initialize(x)
super
end
def park
x + 2
end
end
class Child2 < Parent
def initialize(x)
super
end
def park
x * 2
end
end
objects = [
Parent.new('hello'),
Child1.new(2),
Child2.new(100),
]
results = objects.map do |obj|
obj.park
end
p results
--output:--
hello
[nil, 4, 200]
另一个使用 blocks 的例子,类似于匿名函数.您可以将所需的行为作为函数传递给 park():
And another example using blocks, which are like anonymous functions. You can pass in the desired behavior to park() as a function:
class Function
attr_reader :block
def initialize(&park)
@block = park
end
def park
raise "Not implemented"
end
end
class StringFunction < Function
def initialize(&park)
super
end
def park
block.call
end
end
class AdditionFunction < Function
def initialize(&park)
super
end
def park
block.call 1
end
end
class DogFunction < Function
class Dog
def bark
puts 'woof, woof'
end
end
def initialize(&park)
super
end
def park
block.call Dog.new
end
end
objects = [
StringFunction.new {puts 'hello'},
AdditionFunction.new {|i| i+2},
DogFunction.new {|dog| dog.bark},
]
results = objects.map do |obj|
obj.park
end
p results
--output:--
hello
woof, woof
[nil, 3, nil]
这篇关于可能有助于代码重构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!