Под катом несколько примеров того как можно отрефакторить код, сделать его более элегантным и расширяемым. Все представлено в примерах.
ПРИМЕР 1
Не слишком хорошо:
<% if current_user.admin? %>
<%= current_user.admin_welcome_message %>
<% else %>
<%= current_user.user_welcome_message %>
<% end %>
Лучше:
<%= current_user.welcome_message %>
ПРИМЕР 2
Не слишком хорошо:
def check_for_overheating(system_monitor)
if system_monitor.temperature > 100
system_monitor.sound_alarms
end
end
Лучше:
system_monitor.check_for_overheating
class SystemMonitor
def check_for_overheating
if temperature > 100
sound_alarms
end
end
end
ПРИМЕР 3
Не слишком хорошо:
class Post
def send_to_feed
if user.is_a?(TwitterUser)
user.send_to_feed(contents)
end
end
end
Лучше:
class Post
def send_to_feed
user.send_to_feed(contents)
end
end
class TwitterUser
def send_to_feed(contents)
twitter_client.post_to_feed(contents)
end
end
class EmailUser
def send_to_feed(contents)
# no-op.
end
end
ПРИМЕР 4
Не слишком хорошо:
def street_name(user)
if user.address
user.address.street_name
else
'No street name on file'
end
end
Лучше:
def street_name(user)
user.address.street_name
end
class User
def address
@address || NullAddress.new
end
end
class NullAddress
def street_name
'No street name on file'
end
end
Хорошое ООП — это когда вы говорите объектам что вам нужно сделать, а не просто даете им запросы, которые они должны выполнить. Данные и операции, которые завязаны на этих данных, принадлежат одному и тому же объекту.
Автор: heel