Композиция. ООП.

274 views
Skip to first unread message

Andrey Voronkov

unread,
Aug 3, 2010, 11:33:52 AM8/3/10
to ror...@googlegroups.com
На данный момент читаю интереснейшую книгу по ООП за авторством "Банды четырех", а именно: Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес "Приемы объектно-ориентированного программирования. Паттерны проектирования."

При объяснении основ ООП на с. 34 (издательство Питер, 2009) сформулировано "второе правило объектно-ориентированного программирования": предпочитайте композицию наследованию класса. Понять что такое наследование в терминах Ruby и на примере Ruby on Rails достаточно легко: SomeModel < ActiveRecord::Base и SomeController < ApplicationController. Объясните пожалуйста в тех же самых терминах, что есть такое композиция. (подозреваю, что это есть include SomeClass)

COTOHA /\/\

unread,
Aug 3, 2010, 11:59:21 AM8/3/10
to ror...@googlegroups.com
обяснить в чём разница "is a" и "has a"?

классически композция осуществляется добавлением полей определённого типа в класс. 


2010/8/3 Andrey Voronkov <voron...@gmail.com>
На данный момент читаю интереснейшую книгу по ООП за авторством "Банды четырех", а именно: Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес "Приемы объектно-ориентированного программирования. Паттерны проектирования."

При объяснении основ ООП на с. 34 (издательство Питер, 2009) сформулировано "второе правило объектно-ориентированного программирования": предпочитайте композицию наследованию класса. Понять что такое наследование в терминах Ruby и на примере Ruby on Rails достаточно легко: SomeModel < ActiveRecord::Base и SomeController < ApplicationController. Объясните пожалуйста в тех же самых терминах, что есть такое композиция. (подозреваю, что это есть include SomeClass)

--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
 
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror...@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru



--
...dali bude...

Yury Korolev

unread,
Aug 3, 2010, 12:06:05 PM8/3/10
to ror...@googlegroups.com
Хорошая книга, потом советую почитать design patterns in ruby. 
Композиция, это когда объект одно класса является полем другого. 

Например, ActionController::Base#request

On Aug 3, 2010, at 7:33 PM, Andrey Voronkov <voron...@gmail.com> wrote:

На данный момент читаю интереснейшую книгу по ООП за авторством "Банды четырех", а именно: Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес "Приемы объектно-ориентированного программирования. Паттерны проектирования."

При объяснении основ ООП на с. 34 (издательство Питер, 2009) сформулировано "второе правило объектно-ориентированного программирования": предпочитайте композицию наследованию класса. Понять что такое наследование в терминах Ruby и на примере Ruby on Rails достаточно легко: SomeModel < ActiveRecord::Base и SomeController < ApplicationController. Объясните пожалуйста в тех же самых терминах, что есть такое композиция. (подозреваю, что это есть include SomeClass)

--

Andrey Voronkov

unread,
Aug 4, 2010, 12:45:57 AM8/4/10
to ror...@googlegroups.com
То есть реквест контроллера сам по себе объект. Если кто-нибудь может привести более явный пример, чтобы окончательно дошло, - буду благодарен.

2010/8/4 Yury Korolev <yury.k...@gmail.com>

Михаил Лапшин

unread,
Aug 4, 2010, 5:20:05 AM8/4/10
to ror...@googlegroups.com
2010/8/4 Andrey Voronkov <voron...@gmail.com>:

> То есть реквест контроллера сам по себе объект. Если кто-нибудь может
> привести более явный пример, чтобы окончательно дошло, - буду благодарен.

Например, есть у тебя игра, а в игре есть собачка. Можно сделать
(особенно в С++) класс Dog унаследованным от Renderable (рисуемый на
экране объект) и, скажем, SoundEmitter (гав-гав), что сразу же даст
целую кучу проблем. Поэтому Банда советует делать Renderable и
SoundEmitter членами класса. Такое решение, кстати, вытекает из еще
одной парадигмы - MVC, так как в нашем примере Renderable и
SoundEmitter - это обыкновенный View.

Andrey Voronkov

unread,
Aug 4, 2010, 5:37:38 AM8/4/10
to ror...@googlegroups.com
Показалось еще запутанней :(

2010/8/4 Михаил Лапшин <sota...@sotakone.com>

Yury Korolev

unread,
Aug 4, 2010, 5:38:17 AM8/4/10
to ror...@googlegroups.com
В rails яркий пример композиции - ActiverRecord::Base#connection
http://github.com/rails/rails/blob/3-0-stable/activerecord/lib/active_record/base.rb

Ты наследуешь свои модели от Base и в конфигурации выбираешь адаптер
mysql, sqlite и др.
И от конфигурации меняется именно connection.

А если делать через наследование, то нужно было бы модельки
наследовать от, скажем, ActiverRecord::MySqlBase или
ActiveRecord::SqliteBase

Ну и как следствие, при смене СУБД, тебе придется поменять базовый
класс для всех моделей.

--
--
Yury Korolev
AnjLab Team http://anjlab.com

Andrey Voronkov

unread,
Aug 4, 2010, 5:44:51 AM8/4/10
to ror...@googlegroups.com
Так уже понятней.

2010/8/4 Yury Korolev <yury.k...@gmail.com>

Andrey Voronkov

unread,
Aug 4, 2010, 7:20:53 AM8/4/10
to ror...@googlegroups.com
Я так понял суть кроется в последней строке этого файла:
require 'active_record/connection_adapters/abstract_adapter'
Кстати, я не понял, почему реальные connection_adapters не наследуются от abstract_adapter. На то он и абстрактный, чтобы наследоваться от него.

2010/8/4 Andrey Voronkov <voron...@gmail.com>

Dmytro Shteflyuk

unread,
Aug 4, 2010, 7:26:52 AM8/4/10
to ror...@googlegroups.com
2010/8/4 Andrey Voronkov <voron...@gmail.com>:

> Я так понял суть кроется в последней строке этого файла:
> require 'active_record/connection_adapters/abstract_adapter'
> Кстати, я не понял, почему реальные connection_adapters не наследуются от
> abstract_adapter. На то он и абстрактный, чтобы наследоваться от него.

С чего взял, что не наследуются?

--
Best regards, Dmytro Shteflyuk
http://kpumuk.info/, #twitter: http://twitter.com/kpumuk

Andrey Voronkov

unread,
Aug 4, 2010, 7:59:09 AM8/4/10
to ror...@googlegroups.com
Да, точно! Сейчас увидел.

2010/8/4 Dmytro Shteflyuk <kpu...@kpumuk.info>

--

Andrey Voronkov

unread,
Aug 5, 2010, 12:26:48 AM8/5/10
to ror...@googlegroups.com
Благодарю всех, кто помог разобраться.

2010/8/4 Andrey Voronkov <voron...@gmail.com>
Reply all
Reply to author
Forward
0 new messages