Sandi Metz говорит в ТВЕРДЫХ OOPS понятий из GORUCO что наличие if..else
блоков в Ruby, можно рассматривать как отклонение от Open-Close Принцип. Какие все методы можно использовать, чтобы избежать несрочных условий if..else
? Я пробовал следующий код:Возможная помощь в рефакторинга кода
class Fun
def park(s=String.new)
puts s
end
def park(i=Fixnum.new)
i=i+2
end
end
и выяснил, что перегрузка функций в Ruby не работает. Каковы другие методы, посредством которых код может быть выполнен, чтобы подчиняться OCP?
Я мог бы просто пошел на:
class Fun
def park(i)
i=i+2 if i.class==1.class
puts i if i.class=="asd".class
end
end
, но это нарушение к OCP.
Я исправил его, так как не связан с вопросом OP, просто опечатка. Возможно, действительный ответ может указывать на то, что презентация Санди Меца не может быть применена (я не уверен), и, не вдаваясь в дизайнерские мнения, возможно, объясняет, почему многие динамические языки будут избегать перегрузки методов на основе параметров. –
Я думаю, что идея OCP в вашем случае состоит в том, что 'i' должен производить свои собственные результаты, а не park(), вычисляя результат на основе типа' i'. – 7stud
Применить «Заменить условное с помощью рефакторинга полиморфизма». Это действительно не так сложно. Smalltalk даже не имеет условностей (или циклов, если на то пошло), и все же вы можете выразить все, что вы хотите довольно элегантно в нем. Объектно-ориентированные языки не нуждаются в условных выражениях, при этом полиморфная динамическая отправка сообщений во время работы более мощная. –