[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PDIC - Property Dependency Injection Container
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
chee
Цитата (twin @ 13.04.2016 - 20:17)
А как ты конструкторы запретил в своей системе?

Декларация

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
chee
Подумал вчера вечером и понял, что звёздочка в начале и правда как то не выразительно, и будет непонятна читающему код без документации. Думаю, что нужно решение со звёздочкой инкапсулировать от клиентского кода, то есть создать в контейнере метод create(), в котором эта звёздочка будет добавляться и лишь потом будет вызываться get(). То есть, сделать как бы адаптер и скрыть эту синтаксическую лабуду biggrin.gif

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Я хотел тебе это предложить вчера, у меня примерно так. Без звездочек, но принцип похож. Но чет подумал, что с метаданными это будет геммор. И не стал. smile.gif

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Цитата (twin @ 14.04.2016 - 10:51)
Я хотел тебе это предложить вчера

Я бы вряд ли это принял к сведению laugh.gif

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
chee
Немного пошаманил с документацией https://github.com/cheevauva/container/blob/1/README.md. Может есть какие-то замечания?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Орфография. sad.gif
Цитата
Простой, и в тоже время мощный контейнер внедрения зависимостей, основанные на паттерне Property injection (Внедрение зависимостей через свойства)

Цитата
Компонент - класс, описаные в карте зависимостей;

Цитата
Cоздание контейнера с зависимостями по-умолчанию


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
https://packagist.org/packages/cheevauva/pdic
Дал новое название проекту;
Дописал тесты на некоторые случаи;
Привел в соответствие со стандартном PSR-11;


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
В двух словах можно? В чем его мощь и простота?

Это не сарказм, это реально интересно, а код лапать лень...

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

Цитата
Компонент - класс описаные в карте зависимостей;
исправь ошибку пожалуйста. Либо "классЫ", либо "описанныЙ"

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Пробежался по теме... Это то же говно, или концептуально другое? biggrin.gif
Шучу. Ты переделал его или концепция так же порочна? Код реально лень смотреть, вернее даже глянул, но ничего интересного и нового пока в нем не увидел. Ну кроме того, что ты теперь не гнушаешься конструкторами, слава яйцам.

Ты хотя бы для пиара расскажи, в чем фишка?)

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Цитата (twin @ 7.01.2021 - 05:20)
Ну кроме того, что ты теперь не гнушаешься конструкторами, слава яйцам

не понял о чем речь, сам контейнер конфигурируется через конструктор, это и раньше вроде было. А CMS внедряю зависимости через конструктор в те классы, которые инициализированны до контейнера.

Цитата (twin @ 7.01.2021 - 05:20)
Ты хотя бы для пиара расскажи, в чем фишка?)

Все тоже самое, что я и раньше писал.

Цитата (twin @ 7.01.2021 - 04:45)
В двух словах можно? В чем его мощь и простота?

Мощь - гибкое управление зависимостями, как и в любом другом контейнере. Простота - минималистичное api, простое конфигурирование, минимальное количество кода для использования зависимостей в классе.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Цитата (chee @ 7.01.2021 - 08:45)
не понял о чем речь, сам контейнер конфигурируется через конструктор, это и раньше вроде было. А CMS внедряю зависимости через конструктор в те классы, которые инициализированны до контейнера.

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

И тут вообще полная путаница. Дело в том, что прямое, как бы не единственное предназначение контейнера зависимостей - именно инициализация. Другими словами - сборка необходимого модуля (принято говорить - сервиса). И его прямая задача - собрать сервис из зависимых друг от друга объектов. Делается это для того, что бы ослабить связанность кода, для того, что бы можно было безболезненно изменять/заменять зависимости изолированно друг от друга. Дабы соблюсти принцип D из SOLID.

Не хранение сервисов (DIC может вообще не хранить объекты, это экономически выгодно), и уж не приведи господи - передача контейнера параметром в какой то конкретный класс. А именно сборка. Причем в идеале на каждый сервис должен быть свой экземпляр контейнера.

Если ты создаешь экземпляр класса до контейнера, а только потом внедряешь в него зависимость, это уже не контейнер по определению. Это в лучшем случае сервис-локатор.

Еще раз. Контейнер, это видно из названия, это упаковка классов, зависимых друг от друга. Полуфабрикат. Сервис. По сути это похоже на фабрику или билдер, с той разницей, что последние строят сервисы динамичски, в процессе выполнения кода, а DIC конфигурируется статически, один раз. Часто даже через конфигу.

Именно этот основополагающий принцип ты и нарушаешь. А особенно умиляет то, что ты сунул в свой код сервис-локатор. Намазал масло маслом.

Дело в том, что отличие DIC от локатора нельзя найти в отрыве от контекста. Их отличие именно в использовании.

А если ты внедряешь
Цитата (chee @ 7.01.2021 - 08:45)
зависимости через конструктор в те классы, которые инициализированны до контейнера.
то почему это гордо называется DIC? Тут либо трусы снять, либо крестик надеть biggrin.gif

Так что в настоящем DIC использование конструкторов - то, что доктор прописал. Это удобно, потому что все в одном месте, не размазано по сеттерам, и уж тем паче по публичным свойствам.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Цитата (twin @ 8.01.2021 - 11:52)
Так что в настоящем DIC использование конструкторов - то, что доктор прописал. Это удобно, потому что все в одном месте, не размазано по сеттерам, и уж тем паче по публичным свойствам.

Минусы внедрения через конструктор:

1. Количество аргументов в конструкторе может стать неразумно большим;
2. Для внедрения через конструктор все также нужны свойства, с той разницей что эти свойства будут защищенными, то есть программист обязан не только описать свойства, но и в конструкторе написать маппинг;
3. Давая разработчику право сделать передачу зависимости не обязательной мы приходим к ситуации "комбинаторного взрыва". Безусловно проблему можно решить при помощи декларации правил разработки по обязательности зависимостей при внедрении через классы. Но давай на чистоту, что такой подход в худшем случае нарушит тот кто это правило задекларировал, а в лучшем случае это будет периодически выскакивать на ревью.

К сожалению, эти все 3 минуса для меня являются жирными. Не могу терпеть большое количество аргументов, манки-коддинг и неоправданную сложностью.

При внедрении через свойства, ПРИ ПОМОЩИ МОЕГО КОНТЕЙНЕРА (про другие я не говорю), эти 3 минуса решены:
Количество свойств в классе меня не смущает;
Как минимум не нужно писать маппинг в конструкторе;
Все зависимости, что задекларированы, являются обязательными;

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

Вся беда в том, что лень при разработке оборачивается жутью при поддержке. Пишешь код ты один раз, читать его приходится много раз. И не только тебе.

Давай по порядку.
Цитата (chee @ 8.01.2021 - 08:57)
Количество аргументов в конструкторе может стать неразумно большим;
Может. Но это скорее относится к ошибке архитектуры. Кроме того, давно придуманы DTO.
Цитата (chee @ 8.01.2021 - 08:57)
оличество свойств в классе меня не смущает;
Количество свойств будет тем же, другой вопрос, что они у тебя публичны. Прямое нарушение SOLID.
Цитата (chee @ 8.01.2021 - 08:57)
Как минимум не нужно писать маппинг в конструкторе;
Вот маппинг как раз и нужен для простоты поддержки. Если есть маппинг, сразу видно: что, где и откуда. Маппинг решает и следующий вопрос:
Цитата (chee @ 8.01.2021 - 08:57)
Все зависимости, что задекларированы, являются обязательными;


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

Поддерживать такой код - адъ и израиль. И ради чего? Ради экономии пары секунд на мапке?

Так что конкретизируй декларацию. Твоя поделка, это не простота использования, а простота конфигурации. А это такое себе, я бы к особым преимуществам не относил.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Цитата (twin @ 8.01.2021 - 11:52)
Во первых, ты не можешь внедрить зависимость в класс. Во вторых, класс нельзя инициализировать. И то и другое можно сделать только с объектом, если точнее - с экземпляром класса.

Мы оба понимаем что я "опустил" слово экземпляр. Мы оба понимаем что под "инициализировать" я имел "создать экземпляр класса". Что за буквоедство, или для тебя это важно? Почему, что это меняет, если ты все равно понял что я написал?

Цитата (twin @ 8.01.2021 - 11:52)
И тут вообще полная путаница. Дело в том, что прямое, как бы не единственное предназначение контейнера зависимостей - именно инициализация. Другими словами - сборка необходимого модуля (принято говорить - сервиса). И его прямая задача - собрать сервис из зависимых друг от друга объектов. Делается это для того, что бы ослабить связанность кода, для того, что бы можно было безболезненно изменять/заменять зависимости изолированно друг от друга. Дабы соблюсти принцип D из SOLID.

Тут ты безусловно прав. Я просто похлопаю. Только зачем это писать? Количество экземпляров классов(исключая выбрасывание исключений), которые я инициализирую вручную вряд ли привысит 10 штук, и основанная часть их находится в классе который занимается запуском и инициализацией приложения, то есть в тот момент когда сам контейнер еще не подключен.

Цитата (twin @ 8.01.2021 - 11:52)
Не хранение сервисов (DIC может вообще не хранить объекты, это экономически выгодно), и уж не приведи господи - передача контейнера параметром в какой то конкретный класс. А именно сборка. Причем в идеале на каждый сервис должен быть свой экземпляр контейнера.

Хранить зависимости не обязанность DIC - согласен, это личное дело мисс инкапсуляции. Про передачу контейнера параметром в конкретный класс не очень понял, что ты имеешь ввиду? По поводу "сервиса" тоже не понимаю, что ты имеешь ввиду, что такое сервис в твоем понимании и почему у него должен быть каждый раз новый экземпляр контейнера? Если ты имеешь ввиду сервис локатор, то мой контейнер делает каждый раз новый сервис локатор и внедряет его через сеттер если видит что зависимость реализуем необходимый интерфейс.


Цитата (twin @ 8.01.2021 - 11:52)
Если ты создаешь экземпляр класса до контейнера, а только потом внедряешь в него зависимость, это уже не контейнер по определению. Это в лучшем случае сервис-локатор.

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


Цитата (twin @ 8.01.2021 - 11:52)
Еще раз. Контейнер, это видно из названия, это упаковка классов, зависимых друг от друга. Полуфабрикат. Сервис. По сути это похоже на фабрику или билдер, с той разницей, что последние строят сервисы динамичски, в процессе выполнения кода, а DIC конфигурируется статически, один раз. Часто даже через конфигу.

Я не понимаю, что ты хотел сказать. Нужно больше связанности между фактами, а также определить относительно чего ты это сейчас пишешь. Не используй короткие предложения, и не рви между предложениями связь. Я не собираюсь спорить сам с собой по наброскам твоих фраз wink.gif

Цитата (twin @ 8.01.2021 - 11:52)
Дело в том, что отличие DIC от локатора нельзя найти в отрыве от контекста. Их отличие именно в использовании.

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


Цитата (twin @ 8.01.2021 - 11:52)
то почему это гордо называется DIC? Тут либо трусы снять, либо крестик надеть biggrin.gif

Манипуляция на эмоции, ммм дэлишес. Гордо? Я вроде не писал, с "гордостью представляю вам". Ты привел аргументы так, что я их не понял, сделал какие-то непонятные мне выводы. Я готов их понять, не говорю, что принять, но проблема в том, что в последних твоих предложениях я даже не могу понять твоей точки зрения.

Цитата (twin @ 8.01.2021 - 11:52)
Это удобно, потому что все в одном месте, не размазано по сеттерам, и уж тем паче по публичным свойствам.

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

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.