Пример чистой архитектуры на оценку

Обсуждаем, как правильно строить приложения
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение ElisDN »

BrusSENS писал(а): 2019.10.01, 21:04 Для решения подобной задачи я использую возврат т.н. коллекции. По сути объект-итератор, хранящий в себе набор одинаковых сущностей, в который можно инкапсулировать как-раз все кишки, отвечающие за добавление комметариев к посту, что бы получить подобное API...
Во-первых, в вашем:

Код: Выделить всё

$comment = new Comment();
$post->getCommentCollection()->addComment($comment);
$blogRepository->updatePost($post);
именование можно сократить:

Код: Выделить всё

$comment = new Comment();
$post->getComments()->add($comment);
$posts->update($post);
Во-вторых, здесь снова видно, что инкапсуляцию вы так и не осилили.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Пример чистой архитектуры на оценку

Сообщение chungachguk »

BrusSENS писал(а): 2019.10.01, 21:06
chungachguk писал(а): 2019.10.01, 18:02 Непонятно о какой тонне реализаций идёт речь. Вижу всего 2 8-)
Люблю final классы) Так что 2 не вариант вообще)
Чем final классы мешают наличию двух сущностей?
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Пример чистой архитектуры на оценку

Сообщение anton_z »

ElisDN писал(а): 2019.10.01, 22:38
именование можно сократить:
Это прям охеренный недостаток, чтоб на него указывать :D
ElisDN писал(а): 2019.10.01, 22:38

Код: Выделить всё

$comment = new Comment();
$post->getComments()->add($comment);
$posts->update($post);
Во-вторых, здесь снова видно, что инкапсуляцию вы так и не осилили.

Код: Выделить всё

$comment = new Comment();
$post->add($comment);
$posts->update($post);
Прям это инкапсуляцию подняло до небес) Мелочи это. Человек на C++ работает (редкость это) и зп за это получает. У него ООП инструментарий куда побогаче, всякие шаблонные классы, методы, дружественные классы, множественное наследование и пр.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение ElisDN »

anton_z писал(а): 2019.10.02, 10:50 Это прям охеренный недостаток, чтоб на него указывать :D
Как, впрочем, и на отсутствие тайпхинтинга.
anton_z писал(а): 2019.10.02, 10:50 Прям это инкапсуляцию подняло до небес)
Не до небес, но полусокрытие хотя бы появилось. Первый шаг из двух.
anton_z писал(а): 2019.10.02, 10:50 Мелочи это. Человек на C++ работает (редкость это) и зп за это получает. У него ООП инструментарий куда побогаче, всякие шаблонные классы, методы, дружественные классы, множественное наследование и пр.
Так говорите, как будто в PHP действие addComment в этом примере инкапсулировать нельзя, а в C++ можно.
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

ElisDN писал(а): 2019.10.01, 22:38 Во-первых, в вашем:
именование можно сократить:
Во первых, если бы Вы внимательно смотрели, а не умничали бы, то увидели бы то, что это попытка иметь объект, который забирает всю логику добавления комментариев и прочего. В идеале, CommentCollection объект может в конструкторе получать CommentMapper, который в свою очередь может лениво подтягивать комментарии к посту. Но не только посты могут иметь комментарии. Посему если нам нужно будет делать например сущность новостей, то вполне можно создать интерфейс:

Код: Выделить всё

interface CommentableInterface
{
    public function getCommentCollection(): CommentCollection;
}
И реализовывать данный интерфейс у каждой комментируемой сущности, если мы говорим о полиморфных связях комментариев и сущностей.
И получается, что CommentCollection начинает играть у нас роль некоего провайдера данных с вполне внятным API без всякого проксирования.

Код: Выделить всё

class CommentCollection implements Iterator
{
    public function __construct(CommentableInterface $entity, CommentMapper $mapper)
    {
        ...
    }
    
    public function add(Comment $comment): void
    {
        ...
    }
    ...
}
getComments() или getCommentCollection() - вопрос вкуса. На понятность кода это никак не влияет.

Безусловно, можно и

Код: Выделить всё

interface CommentableInterface
{
    public function getComments(): CommentCollection;
    public function addComment(Comment $comment): void;
}
Но опять-таки, особо понятнее программа от этого не стала. Добавить коммент можно как через addComment() сущности, так и через add() самого объекта-коллекции. А это уже нифига не поворачивается язык назвать инкапсуляцией. Тупое декорирование.

Так что Вы, со своими разговорами о том, что кто-то не "осилил инкапсуляцию", просто неуместны.
Последний раз редактировалось BrusSENS 2019.10.02, 22:28, всего редактировалось 1 раз.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

ElisDN писал(а): 2019.10.02, 12:51 Как, впрочем, и на отсутствие тайпхинтинга.
Отсутствие тайпхинта при PHP 7.3.x Stable? Это нормально? Что же, тогда извините за то, что призываю пользоваться актуальными возможностями яп.
ElisDN писал(а): 2019.10.02, 12:51 Не до небес, но полусокрытие хотя бы появилось. Первый шаг из двух.
Переименовали методы и полусокрытие появилось... Вы сейчас серьёзно?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

chungachguk писал(а): 2019.10.02, 05:30 Чем final классы мешают наличию двух сущностей?
А зачем нам одинаковые сущности? Или мы весь код по 150 раз будет и для того и для другого писать?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

anton_z писал(а): 2019.10.02, 10:50 Человек на C++ работает (редкость это) и зп за это получает. У него ООП инструментарий куда побогаче, всякие шаблонные классы, методы, дружественные классы, множественное наследование и пр.
К сожалению основа у меня это PHP, C++ пока не на том уровне, что бы полностью на него перейти, да и люблю я веб, плюсы для веба сильно заморочены) Просто познакомившись с плюсами данный яп многое заставил понять, что я так долго упёрто игнорировал (тонкости сетевых протоколов, тонкости работы с файлами и т.п.), но самое главное, что этот язык научил строгости и объяснил, что не везде за памятью следят за разработчика и это аукается, ой как аукается. И на своём опыте скажу, что советую каждому PHP (а лучше даже и не PHP) разработчику познакомиться с данным ЯП. Очень многое даст это знакомство. Ну и софт писать естественно приятно) Захотел супербыстрый демон - взял и написал) А насчёт инструментария согласен) Свободы в действиях намного больше, хотя и ответственности и соблазна заюзать намного больше)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение ElisDN »

BrusSENS писал(а): 2019.10.02, 22:27 Переименовали методы и полусокрытие появилось... Вы сейчас серьёзно?
Переименование методов было в пункте "во-первых". А к "во-вторых" @anton_z мой намёк понял и даже вам код с полусокрытием привёл:

Код: Выделить всё

$comment = new Comment();
$post->addComment($comment);
$posts->update($post);
А у вас пока воз и ныне там и снова ни о чём:
BrusSENS писал(а): 2019.10.02, 22:21 Посему если нам нужно будет делать например сущность новостей, то вполне можно создать интерфейс:

Код: Выделить всё

interface CommentableInterface {
    public function getCommentCollection(): CommentCollection;
}
Безусловно, можно и

Код: Выделить всё

interface CommentableInterface {
    public function getComments(): CommentCollection;
    public function addComment(Comment $comment): void;
}
Но опять-таки, особо понятнее программа от этого не стала. Добавить коммент можно как через addComment() сущности, так и через add() самого объекта-коллекции. А это уже нифига не поворачивается язык назвать инкапсуляцией. Тупое декорирование.
Ни первый ваш вариант, ни второй не поворачивается язык назвать. И там, и там нарушение за счёт прямого получения коллекции. Полусокрытие будет только в варианте с прятаньем коллекции внутри:

Код: Выделить всё

interface CommentableInterface {
    public function getComments(): array;
    public function addComment(Comment $comment): void;
}
Так что мы со своими разговорами о том, что кто-то не "осилил" инкапсуляцию, до сих пор уместны.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Пример чистой архитектуры на оценку

Сообщение chungachguk »

BrusSENS писал(а): 2019.10.02, 22:31
chungachguk писал(а): 2019.10.02, 05:30 Чем final классы мешают наличию двух сущностей?
А зачем нам одинаковые сущности? Или мы весь код по 150 раз будет и для того и для другого писать?
А зачем нам универсальная сущность? Сидеть потом гадать как в ней ID формируется.
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

ElisDN писал(а): 2019.10.02, 23:11 Переименование методов было в пункте "во-первых". А к "во-вторых" @anton_z мой намёк понял и даже вам код с полусокрытием привёл:

Код: Выделить всё

$comment = new Comment();
$post->addComment($comment);
$posts->update($post);
А у вас пока воз и ныне там и снова ни о чём:

Ни первый ваш вариант, ни второй не поворачивается язык назвать. И там, и там нарушение за счёт прямого получения коллекции. Полусокрытие будет только в варианте с прятаньем коллекции внутри:

Код: Выделить всё

interface CommentableInterface {
    public function getComments(): array;
    public function addComment(Comment $comment): void;
}
Мыши плакали, кололись, но всё-равно продолжали есть кактус :) Возврат массива вместо объекта-итератора - думаю нам с Вами дальше не о чем говорить дальше. Говорим про ООП, а работаем с массивами - это нонсенс :) Вы бы сначала удосужились понять то, что CommentCollection не в коем случае не является ни репозиторием, ни ДМ. Если для Вас итераторы являются чем-то страшным, то видимо ещё не доросли до них. Если Вы не в курсе, по сути своей массив в PHP и является своего рода итератором, но его гораздо удобнее, в данном случае его представить в виде объекта. Хотя чего я Вам объясняю) Человек в 2019 возвращает массивы, говоря о DDD, смешно. Текст книг читаем, а вот кроме текста в них ничего не видим.
ElisDN писал(а): 2019.10.02, 23:11 Так что мы со своими разговорами о том, что кто-то не "осилил" инкапсуляцию, до сих пор уместны.
Я вижу, как они уместны :) Будем городить прокси классы для ленивой подгрузки связей, делая невозможным использование final'изированных классов сущностей, отстаивая при этом то, что есть единственно-верный путь для реализации хорошего кода XD А тех, кто не придерживается подобного "чудо" подхода - будем упрекать в том, что не осилили инкапсуляцию XD
А вообще очень странно видеть, как сообщество Yii (да и PHP в целом) деградирует от коммерсов, которые с г**ном тебя съедят, потому что ты им указал на то, что они несут бред. Аргументов, кроме как
ElisDN писал(а): 2019.10.02, 23:11 кто-то не "осилил" инкапсуляцию
больше то и нет. Видно, что человек всю жизнь только и работал с массивами, начитался умных книжек и ушёл в коммерцию, рассказывая про волшебство того или иного подхода. А те смотрят идеально подобранные решения некоторых проблем и уши развешивают. А на практике, простите, об**раются, потому что показанные подходы перестают работать в отличном от показанного случая. А бывает и запилят архитектуру. Глядя на которую за голову берёшься. Прокси и т.п. дребедень, которая еле работает, множество бестолковых объектов, но зато заюзали побольше паттернов, адаптеров нафигачили, посредников, декораторов, но там, где оно не нужно 300 лет.
Просто, Дмитрий, запомните, что существует теория и существует практика. Вы теоретик, я это уже для себя уяснил. Но прошу, не пытайтесь тут мне сейчас свою теорию втереть за "чистую монету". Любые правила можно и в некоторых случаях нужно нарушать, если того требует проект и от этого будет больше плюсов, чем минусов. А Вы нам тут рассказываете про идеальную архитектуру, которой не существует.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

chungachguk писал(а): 2019.10.03, 04:35 А зачем нам универсальная сущность? Сидеть потом гадать как в ней ID формируется.
А почему это ID в сущности генерируется?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Пример чистой архитектуры на оценку

Сообщение chungachguk »

BrusSENS писал(а): 2019.10.03, 04:37
chungachguk писал(а): 2019.10.03, 04:35 А зачем нам универсальная сущность? Сидеть потом гадать как в ней ID формируется.
А почему это ID в сущности генерируется?
А где ему генерироваться, если он при создании не был добавлен?
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Пример чистой архитектуры на оценку

Сообщение anton_z »

BrusSENS писал(а): 2019.10.01, 13:27 Вы правда не понимаете того, что у Вас репозиторий ничего не сохраняет и он бесполезный объект?
Нет, он не бесполезный, если бьть точным. Его инжектить можно и мокнуть потом. Таким образом код, которорый зависит от таких репов можно будет тестить без базы:

Код: Выделить всё


$this->repository->save(new Record()); //тестится без базы

(new Record())->save(); //не тестится

Но я сам так в проектах на Yii не делаю, делаю чуть по другому, если мне надо какой-нибудь зависимый от AR класс без базы протестить, я просто все new Record() и Record::find() в фабрику выношу, а потом уже фабрику внедряю и мокаю.

Код: Выделить всё


class RecordFactory {

    public function create() : Record
    {
         return new Record();
    }
    
    
    public function createQuery(): ActiveQuery 
    {
         return Record::find();
    }

}


$record = $this->factory->create();

$record->save(); //ну или $record->doSomething();

Тоже без базы получается затестить. Лично мне кажется что такой способ как-то больше в Yii подходит, чем репы, такого когнитивного диссонанса не вызывает. Если очень постараться, можно таким способом много классов без базы протестить юнитами, кроме самих AR, разумеется. Их прям надо с базой тестить.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение ElisDN »

BrusSENS писал(а): 2019.10.03, 04:36 Мыши плакали, кололись, но всё-равно продолжали есть кактус :) Возврат массива вместо объекта-итератора - думаю нам с Вами дальше не о чем говорить дальше. Говорим про ООП, а работаем с массивами - это нонсенс :)
Печаль-беда с вами... Перевожу фразу "полусокрытие будет только в варианте с прятаньем коллекции внутри" в код:

С массивом:

Код: Выделить всё

class Post
{
    public function getComments(): array {
        return $this->comments->toArray();
    }

    public function addComment(Comment $comment): void {
        return $this->comments->add($comment);
    }
}
С итератором:

Код: Выделить всё

class Post
{
    public function getComments(): iterable {
        return $this->comments->getIterator();
    }

    public function addComment(Comment $comment): void {
        return $this->comments->add($comment);
    }
}
Возврат массива, итератора или коллекции чтения - хорошо. Ваше вытекание самой колллекции - плохо.
BrusSENS писал(а): 2019.10.03, 04:36 Вы бы сначала удосужились понять то, что CommentCollection не в коем случае не является ни репозиторием, ни ДМ. Если для Вас итераторы являются чем-то страшным, то видимо ещё не доросли до них. Если Вы не в курсе, по сути своей массив в PHP и является своего рода итератором, но его гораздо удобнее, в данном случае его представить в виде объекта.
У меня в статье такая коллекция называется Phones. А в Doctrine коллекции вместо массивов идут из коробки. Так что я в курсе.
BrusSENS писал(а): 2019.10.03, 04:36 Хотя чего я Вам объясняю) Человек в 2019 возвращает массивы, говоря о DDD, смешно. Текст книг читаем, а вот кроме текста в них ничего не видим.
Вот вам ещё один сюрприз: к DDD геттеры вроде getComments() вообще не относятся и сущностям они не нужны. У нас они добавлены только из-за отсутствия отдельной модели чтения. Так что и здесь вы опять не в теме.
BrusSENS писал(а): 2019.10.03, 04:36 Думаю нам с Вами дальше не о чем говорить дальше.
Ну вот и прекращайте нас радовать своими фантазиями а-ля "Земля - это квадратный конь в созвездии Деда Мороза". Мы не против.
Последний раз редактировалось ElisDN 2019.10.03, 12:05, всего редактировалось 6 раз.
noLogicOnlyWar
Сообщения: 83
Зарегистрирован: 2017.07.04, 20:53

Re: Пример чистой архитектуры на оценку

Сообщение noLogicOnlyWar »

Человек на C++ работает (редкость это) и зп за это получает. У него ООП инструментарий куда побогаче, всякие шаблонные классы, методы, дружественные классы, множественное наследование и пр.
Там впринципе ООП другое, пхпшное вдохновленно java'й и сравнивать их просто некорректно, их инструменты зачастую решают их же проблемы.
Просто познакомившись с плюсами данный яп многое заставил понять, что я так долго упёрто игнорировал (тонкости сетевых протоколов, тонкости работы с файлами и т.п.), но самое главное, что этот язык научил строгости и объяснил, что не везде за памятью следят за разработчика и это аукается, ой как аукается. И на своём опыте скажу, что советую каждому PHP (а лучше даже и не PHP) разработчику познакомиться с данным ЯП.
Отличный совет потратить пару лет на изучение далеко не самого актуального языка. Работа с сетью, файлами это тонкости работы с api ос, к си плюс плюс отношения никакого не имеют, вы же в курсе что вы сишный api дергаете?
Говорим про ООП, а работаем с массивами - это нонсенс
Сильное заявление, подкрепить мы его конечно ничем не сможем.
Если Вы не в курсе, по сути своей массив в PHP и является своего рода итератором
Интересный вы плюсовик если не знаете разницу между итератором и контейнером по которому итерируются.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение ElisDN »

BrusSENS писал(а): 2019.10.03, 04:36 Просто, Дмитрий, запомните, что существует теория и существует практика. Вы теоретик, я это уже для себя уяснил.
Есть у нас ещё один "опытный практик", который думал, что он круче всех, а потом в суп попал.

Так что делайте как хотите если вы "практик", не осиливший инкапсуляцию, ООП и DDD. Но тогда не спорьте о теории.
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

anton_z писал(а): 2019.10.03, 09:22 Нет, он не бесполезный, если бьть точным. Его инжектить можно и мокнуть потом. Таким образом код, которорый зависит от таких репов можно будет тестить без базы:
Имхо, самое ненормальное в коде, когда она пишется для тестов, а не для того, что бы нормально работать.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

ElisDN писал(а): 2019.10.03, 10:15 Печаль-беда с вами... Перевожу фразу "полусокрытие будет только в варианте с прятаньем коллекции внутри" в код:

С массивом:

Код: Выделить всё

class Post
{
    public function getComments(): array {
        return $this->comments->toArray();
    }

    public function addComment(Comment $comment): void {
        return $this->comments->add($comment);
    }
}
С итератором:

Код: Выделить всё

class Post
{
    public function getComments(): iterable {
        return $this->comments->getIterator();
    }

    public function addComment(Comment $comment): void {
        return $this->comments->add($comment);
    }
}
Возврат массива, итератора или коллекции чтения - хорошо. Ваше вытекание самой колллекции - плохо.
Опять Вы видимо не поняли о чём Вам говорят. Почитайте посты ещё несколько раз, мб мозг заработает, а то серое вещество видать застоялось от постоянного штудирования теории.
ElisDN писал(а): 2019.10.03, 10:15 У меня в статье такая коллекция называется Phones. А в Doctrine коллекции вместо массивов идут из коробки. Так что я в курсе.
О нет, не рассказывайте об этом куске, под названием Doctrine. Жутчайший тормоз, работающий через гору костылей. Приводите в пример, но в сущности всё должно быть инкапсулировано! Иначе всё, приложение работать не будет, всё пропало.
ElisDN писал(а): 2019.10.03, 10:15 Вот вам ещё один сюрприз: к DDD геттеры вроде getComments() вообще не относятся и сущностям они не нужны. У нас они добавлены только из-за отсутствия отдельной модели чтения. Так что и здесь вы опять не в теме.
Лул. Я приводя примеры даже не думал о DDD XD Вы всегда странным образом за человека всё додумываете и считаете, что человек именно это и хотел сказать/сделать) Разочарую Вас) Вам нужно срочно к психотерапевту, возможно психическое расстройство или детская обида (без шуток кстати).
ElisDN писал(а): 2019.10.03, 10:15 Ну вот и прекращайте нас радовать своими фантазиями а-ля "Земля - это квадратный конь в созвездии Деда Мороза". Мы не против.
Вай) Не играй в мои игрушки и не писяй в мой горшок)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

noLogicOnlyWar писал(а): 2019.10.03, 10:21 Отличный совет потратить пару лет на изучение далеко не самого актуального языка.
У Вас в голове информация не самая актуальная. Посмотрите на инструменты, использующие сейчас C/C++ и потом расскажете нам про актуальность.
noLogicOnlyWar писал(а): 2019.10.03, 10:21 Сильное заявление, подкрепить мы его конечно ничем не сможем.
А чего его подкреплять? Сущности массивом возвращать? Человек делал отдельный объект для username, а набор сущностей возвращает массивом.
noLogicOnlyWar писал(а): 2019.10.03, 10:21 Интересный вы плюсовик если не знаете разницу между итератором и контейнером по которому итерируются.
лул. Тут вообще просто кричу. просто высер сгенерированный где-то в недрах Вашей головы. Вы с Елисеевым похожи) И тот за всех додумывает и решает и Вы. Ах да, ещё по теории всё, по теории. Вы случайно не почитатель его коммерс трудов?)
Последний раз редактировалось BrusSENS 2019.10.03, 14:54, всего редактировалось 1 раз.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Ответить