Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Ниже мы еще вернемся к вводу/выводу в контексте сокетов и сетевого программирования. Но предварительно рассмотрим некоторые другие темы.

Глава 11. ООП и динамические механизмы в Ruby

Как введение иррациональных чисел… стало удобным мифом упростившим законы арифметики… так физические объекты и постулированные сущности делают наше восприятие реальности более простым и завершенным… Концептуальная схема физических объектов напоминает удобный миф, который проще, чем истина, но при этом содержит тут и там частички истины.

Уиллард
Ван Орман Квин

Это необычная глава. В большинстве других глав рассматривается какой-то конкретный аспект, например строки или файлы, но в этой все иначе. Если расположить «пространство задачи» по одной оси системы координат, то данная глава окажется на другой оси, поскольку содержит по кусочку из всех других областей. Связано это с тем, что объектно-ориентированное программирование и динамичность сами по себе являются не задачами, а парадигмами, которые могут быть применены к решению любой задачи, будь то системное администрирование, низкоуровневое сетевое программирование или разработка приложений для Web.

Вот почему значительная часть материала данной главы должна быть уже знакома любому программисту, знающему Ruby. На самом деле все остальное в этой книге не имеет смысла без понимания изложенных здесь основ. Например, любой программист на Ruby знает, как создать подкласс. Возникает вопрос: что включить, а без чего можно обойтись? Знает ли любой программист о методе

extend
? А о методе
instance_eval
? То, что одному представляется очевидным, может оказаться откровением для другого.

Мы решили отдать предпочтение полноте. В главу включены некоторые экзотические вещи, которые можно делать с помощью динамического ООП в Ruby, но не забыты и рутинные задачи — на случай, если кто-то не знаком с ними. Мы спустились до самого простого уровня, поскольку многие по-разному представляют себе, где кончается «средний» уровень. И попытались дать кое-какую дополнительную информацию даже при изложении самых базовых вопросов, чтобы оправдать включение их в эту главу. С другой стороны, тем, которые раскрываются в других частях книги, мы здесь не касались.

Еще два замечания. Во-первых, ничего магического в динамическом ООП нет. Объектная ориентированность языка Ruby и его динамическая природа прекрасно уживаются между собой, но неотъемлемой связи между ними нет. Мы рассказываем о том и другом в одной главе только для удобства. Во-вторых, мы затрагиваем кое-какие особенности языка, которые, строго говоря, не относятся ни к одной из двух заявленных тем. Если хотите, считайте это мелким обманом. Но надо же было поместить их куда-то.

11.1. Рутинные объектно-ориентированные задачи

Of his quick objects hath the mind no part, Nor his own vision holds what it doth catch… Вильям Шекспир. Сонет 113 [12]

Если вы вообще не знакомы с ООП, то эта глава вас ничему не научит. А если вы понимаете, что такое ООП в языке Ruby, то, наверное, ее и читать не стоит. Если понятия ООП не слишком свежи в памяти, просмотрите главу 1, где мы приводим их краткий обзор (или обратитесь к другой книге).

12

Ни
сердцу, ни сознанью беглый взгляд
Не хочет дать о виденном отчет.
(Пер. С. Маршака)

С другой стороны, большая часть материала в этой главе изложена в виде руководства и довольно элементарна. Поэтому она будет полезна начинающему и менее интересна для программиста на Ruby среднего уровня. Эта книга организована как устройство ввода/вывода с произвольной выборкой, так что можете свободно пропускать те части, которые вас не интересуют.

11.1.1. Применение нескольких конструкторов

В Ruby нет «настоящих» конструкторов, как в C++ или в Java. Сама идея, конечно, никуда не делась, поскольку объекты необходимо создавать и инициализировать, но реализация выглядит иначе.

В Ruby каждый класс имеет метод класса

new
, который вызывается для создания новых объектов. Метод new вызывает специальный определяемый пользователем метод
initialize
, который инициализирует атрибуты объекта, после чего new возвращает ссылку на новый объект.

А если мы хотим иметь несколько конструкторов? Как быть в этом случае?

Ничто не мешает завести дополнительные методы класса, которые возвращают новые объекты. В листинге 11.1 приведен искусственный пример класса для представления прямоугольника, у которого есть две длины сторон и три значения цвета. Мы создали дополнительные методы класса, предполагающие определенные умолчания для каждого параметра. (Например, квадрат — это прямоугольник, у которого все стороны равны.)

Листинг 11.1. Несколько конструкторов

class ColoredRectangle

 def initialize(r, g, b, s1, s2)

@r, @g, @b, @s1, @s2 = r, g, b, s1, s2

 end

 def ColoredRectangle.white_rect(s1, s2)

new(0xff, 0xff, 0xff, s1, s2)

 end

 def ColoredRectangle.gray_rect(s1, s2)

new(0x88, 0x88, 0x88, s1, s2)

 end

 def ColoredRectangle.colored_square(r, g, b, s)

new(r, g, b, s, s)

 end

 def ColoredRectangle.red_square(s)

new(0xff, 0, 0, s, s)

 end

 def inspect

"#@r #@g #@b #@s1 #@s2"

 end

end

a = ColoredRectangle.new(0x88, 0xaa, 0xff, 20, 30)

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

Утопия

Чайлд Линкольн
151. Книга-загадка, книга-бестселлер
Детективы:
триллеры
8.00
рейтинг книги
Утопия

Москва. Путь к империи

Торопцев Александр Петрович
Научно-образовательная:
история
5.00
рейтинг книги
Москва. Путь к империи

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Большой Сочи. История Кавказа

Андреев Александр Радьевич
Приключения:
путешествия и география
5.00
рейтинг книги
Большой Сочи. История Кавказа

Ночная музыка

Мойес Джоджо
Любовные романы:
современные любовные романы
8.64
рейтинг книги
Ночная музыка

Синяя Птица. (Трилогия)

Самойлова Елена Александровна
Синяя Птица
Фантастика:
юмористическая фантастика
9.14
рейтинг книги
Синяя Птица. (Трилогия)

Рэдволл

Джейкс Брайан
1. Рэдволл
Детские:
сказки
7.00
рейтинг книги
Рэдволл

Такая разная любовь

Пембертон Маргарет
Любовные романы:
современные любовные романы
7.33
рейтинг книги
Такая разная любовь

Замуж за принца

Блэквелл Элизабет
Любовные романы:
исторические любовные романы
8.53
рейтинг книги
Замуж за принца

Кысь. Зверотур. Рассказы

Толстая Татьяна Никитична
Проза:
проза прочее
5.00
рейтинг книги
Кысь. Зверотур. Рассказы

Обратная сторона пути

Панкеева Оксана Петровна
11. Хроники странного королевства
Фантастика:
фэнтези
9.55
рейтинг книги
Обратная сторона пути

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
АН (цикл 11 книг)

Дым и зеркала

Хафф Таня
2. Дымовая трилогия
Фантастика:
фэнтези
ужасы и мистика
8.42
рейтинг книги
Дым и зеркала

Чудо купальской ночи

Алюшина Татьяна Александровна
Любовные романы:
современные любовные романы
7.87
рейтинг книги
Чудо купальской ночи