RFS: Классы в Ruby

Руби — объектно-ориентированный язык. Одно из свойств ООП языков — инкапсуляция (изоляция и разделение). На мой взгляд это свойство лучше всего отвечает на вопрос «А зачем вообще нужны классы?», поэтому начнем с него.

В предыдущих уроках (которые еще не написаны) код выполнялся как-то так:

puts 'User Data'

Это безобразие подходит только для простейших примеров и поиска ошибок.

Код нужно изолировать на разные логические составляющие, каждая из которых лежит в отдельном файле.

Допустим у нас есть коллективный блог, где пользователь выбирает любимые рубрики и читает статьи только по ним.

Таким образом у нас получается как минимум три разных логических компоненты этого сайта — пользователи, посты и категории.

Правильно будет создавать методы для этих сущностей в отдельных неймспейсах, они же классы.

Чтобы мы могли указать сначала логическую сущность, а уже потом метод:

User.first
Post.oldest
Category.hottest

User, Post, Category как раз классы. Методы объявленные в них — работают только в них, никакого смешения мух и котлет.

Еще один пример:

User.first вернет первого пользователя.
Category.first вернет первую категорию.

Создаем три файла с названиями user.rb, post.rb и category.rb. Отдельный файл для каждого класса считается правилом хорошего кода.

Пустой класс выглядит очень просто:

class User
end

Где User название класса, оно всегда пишется с большой буквы.

В предыдущих уроках использовались методы системных классов, например 'oh wow'.reverse. Метод reverse встроен в системный класс String.

Но если мы создаем новый класс для пользователей (User), то методы для него должны добавлять сами. Это делается очень просто:

class User
 def self.say_something
   'pew pew'
 end
end

Теперь мы можем вызвать наш метод так:

User.say_something
=> 'pew pew'

Оч просто и удобно.

Добавить комментарий