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

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

Жанры

Программирование на языке 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)

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

Некромант . Трилогия

Петерсон Андрей Викторович
Перстень некромансера
Фантастика:
фэнтези
7.64
рейтинг книги
Некромант . Трилогия

По зову сердца

Меллер Юлия Викторовна
Фантастика:
фэнтези
6.40
рейтинг книги
По зову сердца

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Чтоб знали! Избранное (сборник)

Армалинский Михаил Израилевич
Русская потаенная литература
Поэзия:
поэзия
5.00
рейтинг книги
Чтоб знали! Избранное (сборник)

"Фантастика 2025-79". Компиляция. Книги 1-32

Буланова Наталья Александровна
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Фантастика 2025-79. Компиляция. Книги 1-32

Астроном

Шехтер Яков
Проза:
современная проза
5.00
рейтинг книги
Астроном

Двенадцатая реинкарнация. Трилогия

Богдашов Сергей Александрович
Фантастика:
боевая фантастика
5.60
рейтинг книги
Двенадцатая реинкарнация. Трилогия

"Фантастика 2023-134". Компиляция. Книги 1-22

Демина Карина
Фантастика 2023. Компиляция
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Фантастика 2023-134. Компиляция. Книги 1-22

Как воспитать здорового и умного ребенка. Ваш малыш от А до Я

Шалаева Галина Петровна
Научно-образовательная:
педагогика
5.00
рейтинг книги
Как воспитать здорового и умного ребенка. Ваш малыш от А до Я

Страдание

Гамильтон Лорел Кей
22. Анита Блейк
Фантастика:
фэнтези
ужасы и мистика
8.37
рейтинг книги
Страдание

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Аристократ из прошлого тысячелетия

Досье Дрездена. Книги 1 - 15

Батчер Джим
Досье Дрездена
Фантастика:
фэнтези
ужасы и мистика
5.00
рейтинг книги
Досье Дрездена. Книги 1 - 15

Имперец. Том 3

Романов Михаил Яковлевич
2. Имперец
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.50
рейтинг книги
Имперец. Том 3

"Фантастика 2023-201. Компиляция. Книги 1-26

Кароль Елена
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2023-201. Компиляция. Книги 1-26