В понедельник я начал свои Рубиновые крестики-нолики. Это 4-й крестики-нолики, которые я сделал. Раньше я делал это на Lua, Java, CSharp, а теперь и на Ruby.

Как бы это ни повторялось, приятно видеть улучшения у всех, кого я делаю. Прошло всего пару месяцев с тех пор, как я в последний раз играл в крестики-нолики в CSharp, и я уже чувствую, что сделал много ошибок, которые я надеюсь исправить в Ruby, который я делаю сейчас.

Например, теперь я действительно осознаю, сколько строк в моих классах. В моих предыдущих крестиках-ноликах было много классов по 100–150 линий, что просто неприемлемо. У большинства классов должна быть только одна обязанность, и если класс имеет более 100 строк, велика вероятность, что ответственности больше одной; что было верно в моих старых крестиках-ноликах. Ruby также позволяет очень легко писать меньше кода, пара примеров:

До:

array = [1, 2, 3]
array.each do |number|
  puts number
end

После:

array = [1, 2, 3]
array.all? {|number| puts number}

До:

@array = [1, 2, 3]
def contains_one?(array)
  array.each do |number|
    return true if number == 1
  end
  return false
end

После:

@array = [1, 2, 3]
def contains_one?(array)
  array.any? {|number| number == 1}
end

До:

@users = [{name: "Will", age: 17}, {name: "Bob", age: 17}]
def find_users_by_name(name)
  requested_users = []
  @users.each do |user|
    requested_users << user if user.name == name
  end
  return requested_users
end

После:

@users = [{name: "Will", age: 17}, {name: "Bob", age: 17}]
def find_user_by_name(name)
  @users.select {|user| user.name == name}
end