?

Log in

No account? Create an account

Previous Entry | Next Entry

Появилась новая статья. А с ней - и новый раздел. "Архитектура". Давно хотел начать писать в этом направлении, да все никак не складывалось. Была одна статья о синглтонах, но больше про технику реализации.

И вот, наконец, сложилось. Статья о принципах модульного проектирования. Как сделать так, чтобы модуль можно было переиспользовать. Читайте: http://www.skipy.ru/architecture/module_design.html.

Обсуждение – в этой теме.

Comments

Samolisov Pavel [blogspot.com]
Sep. 14th, 2010 03:07 pm (UTC)
Как всегда замечательная статья. Единственный вопрос: Вы пишите, что DI и IoC - не одно и то же, соответственно существует еще какой(ие)-то механизм(ы) реализации IoC помимо DI. Возможно у вас есть какой-то пример?

З.Ы. По-моему запятая в названии статьи лишняя.
skipy_ru
Sep. 15th, 2010 06:00 am (UTC)
Павел, IoC (Inversion of Control) и DI (Dependency Injection) - действительно не одно и то же. IoC - это общий принцип. Он совершенно не связан с разработкой ПО, хотя получил известность именно благодаря ей. Даже в Википедии IoC назван принципом объектно-ориентированного программирования (http://en.wikipedia.org/wiki/Inversion_of_control, http://ru.wikipedia.org/wiki/Обращение_контроля).

В своей статье об IoC Мартин Фаулер привел хорошую аналогию с т.н. «голливудским принципом» – «не звоните нам, мы вам позвоним сами». Саму статью можно прочитать вот тут: http://martinfowler.com/bliki/InversionOfControl.html.

В дополнение приведу еще один пример IoC из Java, не связанный явно с DI.

Возьмем обычную сериализацию. Как Вы знаете, существует два способа реализации - использование Serializable и Externalizable. Начнем со второго.

Что происходит при обработке Externalizable? Объекту дают поток и говорят - на, родной, пишись! И объект сам пишет свои данные. И точно так же при чтении, создается пустой экземпляр, ему дается поток и говорится - на, родной, читайся. И объект сам читает свои данные.

А что происходит в случае Serializable? Объект сам ничего не делает. Он попадает в механизм, который разбирает его по косточкам, вытаскивает из него все данные и записывает в поток. И точно так же при чтении - внешний механизм читает данные из потока и прописывает их в объект. В этом случае сам объект не является активным действующим лицом - все операции производятся над ним кем-то. IoC в чистом виде.

На самом деле, если копнуть глубже - тут наблюдается сходство с DI. И в том, и в другом случаях в определенное поле объекта пишется определенное значение. Это может быть ссылка на объект, это может быть прочитанное число. Не суть принципиально, и то и другое - IoC. Просто когда мы говорим об объектах, мы не думаем о ссылках, - это ниже того уровня абстракции, на котором мы мыслим в данный момент. Скажем так, запись ссылки - это физическая реализация установки зависимости. А на более высоком уровне абстракции мы говорим о DI. То есть можно сказать, что IoC лежит в основе принципа реализации DI, но им не ограничивается.
Samolisov Pavel [blogspot.com]
Sep. 16th, 2010 01:26 am (UTC)
Большое спасибо за такой развернутый ответ. Кажется начало приходить просветление )
skipy_ru
Sep. 15th, 2010 06:00 am (UTC)
P.S. Запятую убрал. :)
magicprinc
Sep. 15th, 2010 11:21 am (UTC)
>существует еще какой(ие)-то механизм(ы) реализации IoC помимо DI

Классики также приводят в качестве примера IoC-не-DI оконную систему управляемую событиями, т.е.
не код активно читает getKeypress(), а сама система вызывает методы кода по приходу событий от клавиатуры