Хороший и плохой код

в 8:45, , рубрики: ruby, ооп, Программирование

Под катом несколько примеров того как можно отрефакторить код, сделать его более элегантным и расширяемым. Все представлено в примерах.

ПРИМЕР 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js