|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
Преобразование типов разных слоёв23.08.2021, 21:36. Показов 3187. Ответов 37
Метки нет (Все метки)
Допустим у меня где-то там, в приложении, есть какие-то API. Так как результатом будет json-response я создал отдельный тип под него:
IDictionary<string, Student>.Также у меня уже где-то в моделе лежит список 10 студентов IDictionary<string, StudentReadOnlyStruct> из прошлого запроса. Допустим 9 студентов, которые результируют запрос, остались прежними, а один студент изменился.Задача: проверить, какой из 10 новых студентов изменился и заменить его в списке IDictionary<string, StudentReadOnlyStruct>. Я вижу тут 2 решения: - банально перевести первую коллекцию в тип второй коллекции, а потом их сравнить(но мне кажется это слишком дорого). - попробовать помудрить что-то с хешами.
0
|
|||||||||||
| 23.08.2021, 21:36 | |
|
Ответы с готовыми решениями:
37
Создать массивы разных типов(3 типов), вывести их на экран Преобразование типов
|
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
||||||
| 24.08.2021, 09:44 | ||||||
|
Красный - модели работы с API. Специфические вещи для передачи и представления данных как, например, дата в формате ISO 8601. Зеленый - обслуживающие классы, которые делают полезную работу. Понятия, которыми оперирует владелец предметной области. Фиолетовый - классы, отражающие способ хранения данных. Ключи, агрегаторы, кеши, порядок сериализации. Желтый - классы представления. Цвет, шрифт, изображение. Белый - вспомогательные классы для трансформации данных из одной формы в другую. Некий общий набор параметров между двумя слоями. Нет никаких правил, описывающих количество слоев и способы именования. В рамках одного проекта возможно смешивание нескольких подходов. Идея простая, детали реализации одного слоя не должны влиять на детали реализации другого слоя.
2
|
||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 24.08.2021, 10:20 [ТС] | ||
0
|
||
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
||
| 24.08.2021, 11:02 | ||
|
2
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 24.08.2021, 11:10 [ТС] | ||
|
Дело в том, что при такой реализации информация о последнем изменении должна приходить с сервера. Ибо я сравниваю ту информацию, которая пришла с сервера с той, которая есть.
0
|
||
|
Модератор
|
||||||||||||||||||||||||
| 24.08.2021, 20:57 | ||||||||||||||||||||||||
|
Может, что-то не так понял из ваших объяснений. Пишу в меру того как понял - если чё поправите. По идее у вас должен быть в Модели словарь
Можно, при желании, под это сделать и какой-то специальный тип словаря, чтобы не повторять каждый раз кучу кода. Теперь вам Репозиторий возвращает последовательность Студентов DTO. Так как значение словаря значимый тип, то работа со словарём будет не очень оптимальной. Что, впрочем, для несильно нагруженного приложения значения практически не имеет. Метод для обработки словаря:
Дополненный тип:
А если будет настолько нагруженная система (допустим обработка данных Вузов всей страны), то по любому домашний комп это не потянет. Добавлено через 8 минут НО! Во-первых, вы по любому эти данные как-то должны получить и хранить. То есть одна конвертации в типы репозитория будет однозначно без каких либо вариантов. Во вторых, типы репозитория инкапсулированы в нём, и для того чтобы репозиторий проверил какую часть своих типов надо конвертировать в типы Модели (у вас это DTO. но это не обязательно - по идее должны быть Бизнес Сущности), Репозиторий должен "залезть" в данные Модели, что тоже не есть хорошо. Это возможно только если Репозиторий не выделен из Модели. Поэтому второй конвертацию из типов Репозитория в Бизнес Сущности, без нарушения архитекторы, тоже никак не получится избежать. Или там таких "мин" можно самому себе понаставить... Добавлено через 1 минуту Поэтому штамп времени - это значение упрощающее валидацию, сравнение, но не заменяющее конвертации. Добавлено через 5 минут Допустим, при каждом изменении таблицы корректируется её штамп времени. Пришли данные из этой таблицы. Они сопровождаются штампом времени самой таблицы. Вы его проверили - если совпадает со последним обработанным, то игнорируете все остальные присланные данные. Но если штамп времени будет на каждой записи, то сравнение придётся производить в Модели. А для этого придётся сначала сделать две конвертации. Или хранить два экземпляра типов: типы Репозитория и Бизнес Сущности.
1
|
||||||||||||||||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 24.08.2021, 20:59 [ТС] | ||
Элд Хасп, выглядит не плохо, но я сомневаюсь касательно следующей ситуации: 1. В списке A следующий набор: { "Кирилл, 5 лет" , "Иван, 56 лет", "Юлия, бессмертный ангел" } 2. В списке Б следующий набор: { "Арсений, 13 лет" , "Иван, 56 лет", "Юлия, бессмертный ангел" } 3. Список Б — это новый ответ от сервера, в котором уже нет Кирилла и появился Арсений. А это, получается, ещё одна итерация. Из предложенной Вами реализации, я так понимаю, мне нужно создать третий список, для элементов, которые есть в старом списке, но которых нет в новом ( чтобы удалить их и вызвать событие).
0
|
||
|
Модератор
|
|||
| 24.08.2021, 21:09 | |||
|
Так как Модель должна извещать об изменении своего состояния. В общем случае зависит от того как у вас реализованы события. Если изменения относительно редкие, единичные, то можно подымать событие при изменение каждого элемента - тогда список не нужен. Но если изменения в основном пакетные, то лучше обработать сразу весь пакет и поднять одно событие для всего пакета. А это без накопления списков удаляемых и добавляемых не выйдет. Добавлено через 2 минуты Посмотрите внимательнее код. Для каждого элемента полученного списка выполняется единичный поиск в словаре.
0
|
|||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 24.08.2021, 21:47 [ТС] | ||
|
Добавлено через 2 минуты Вообще, мне известно количество элементов(пользователь выбирает сколько элементов он хочет получить: 20, 30...), поэтому я тут подумываю всё на массиве сделать. Добавлено через 22 минуты Вообще стоит ли, в данной ситуации, использовать массивы (в чистом виде)? Допустим у пользователя есть ComboBox, в котором он выбрал: "показать 20 элеметов" и я знаю, что элементов будет 20. Есть ли у массива StudentDto[] преимущества перед конкурентами: IReadOnlyCollection<StudentDto>; IList<StudentDto> и IDictionary<long, Student> и т.д.? Какой, в данном случае, самый оптимальный подход, при условии самый ТС задачи?
0
|
||
|
Модератор
|
||||||||
| 24.08.2021, 21:51 | ||||||||
|
Когда оно заменяется students[student.id] = newStudent; - происходит второй поиск.Если бы это был ссылочный тип: class entity {StudentReadOnlyStruct student}.То второго поиска можно было избежать:
Сказать что лучше, без тестирования на реальных данных не возможно. И нужно создавать очень критические условия для тестов, так как на обычной типовой нагрузке вряд ли получится определить разницу. Добавлено через 2 минуты Иначе можно в лёгкую дров наломать.
0
|
||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 24.08.2021, 21:52 [ТС] | ||
|
Элд Хасп,
0
|
||
|
Модератор
|
|||
| 24.08.2021, 21:58 | |||
|
Там любой тип будет раз двадцать конвертирован, упакован-распакован. На любое представление простейшего числа или строки требуется сотни, если не тысячи операций. Такая оптимизация (по быстродействию) необходима только в случае очень нагруженной Бизнес Логики. Для представление максимум что следует сделать, это не создавать огромного количества UI элементов. Допустим передача коллекции из сотен элементов с десятком свойств в DataGrid может ощутимо подвесить GUI. Добавлено через 2 минуты Имеет смысл, если вы оптимизируете суперкомпьютер обрабатывающий данные всей страны. Если из любопытства, то надо делать тесты на реальных данных. Теория здесь не поможет. На разных данных, на разном железе может получить противоположные результаты.
0
|
|||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||||||||
| 24.08.2021, 22:49 [ТС] | ||||||||||||||||||||||
foreach(var newStudent in recivedStudents), но как я себе это представляю, чтобы проверить содержит ли новая коллекция элемент из старой коллекции, то для этого нужно будет foreach(var maybeDeletedStudent in students)________________________________________ __________________ Добавлено через 13 секунд Элд Хасп, начитался информации о том, какие же крутые Структуры и подумал: "тогда почему я всё ещё использую ссылчные типы?". Первое внедрение Значимого типа и уже дополнительная итерация где-то ) И уже никакая не оптимизация. Ох. Касательно WPF -- да, не спорю, но я бы хотел на стороне репозитория сделать всё приближённо к идеалу в рамках собственного обучения. Давайте резюмирую: - основное перечисление лучше хранить в словаре, "так как для десериализованных данных роль ссылки на экземпляр играет Id"
(и так как Id типа long, убрал проверку на null)
- определяемся с тем, как много элементов будут изменены за раз. В моём случае нет смысла в событии передавать коллекцию, я думаю будет достаточно передать элемент и его событие. Благо у меня есть Ваша реализация этой задачи: Реализация поднятия события изменения значения в словаре. Взято у Элд Хасп, Кликните здесь для просмотра всего текста
- в таком случае реализция будет выглядеть следущим образом:
0
|
||||||||||||||||||||||
|
Модератор
|
||
| 24.08.2021, 23:03 | ||
|
Вы проверяете только входящую коллекцию. Каждый элемент сначала ищите такой же в существующей. Если его нет то добавляете. Если он есть, то проверяя обновился он или нет.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 24.08.2021, 23:08 [ТС] | ||
|
0
|
||
|
Модератор
|
|||||||||||||
| 24.08.2021, 23:34 | |||||||||||||
|
ДО ИЗМЕНЕНИЯ происходит событие Changing - такие используются, но редко и, сколько видел, всегда в паре с Changed. Поэтому так:
Так же в событии Changing могут предусматриваться параметры для отмены присвоения, или изменения присваиваемого значения. Добавлено через 7 минут Обычно такое происходит только при подписке на Репозиторий. А потом приходят обновления. Если приходит всегда НОВЫЙ список, то не надо заморачиваться. Просто создайте массив и отправьте его по событию. В ViewModel нужна совсем иная оптимизация для уменьшения нагрузки на View. Там ObservableCollection переписываете элементами из нового списка. Лишние удаляете, нехватающие - добавляете. Немного проблем доставит только. если в View предусмотрена обработка одного элемента и надо предусмотреть как должно отреагировать представление при смене коллекции в этом случае.
1
|
|||||||||||||
|
Модератор
|
||
| 24.08.2021, 23:35 | ||
|
Создали массив ссылочного типа. Это достаточно затрано. Под каждый элемент выделяется место в куче. Потом выделяется место под массив по 4 (или 8) байт под каждую ссылку на объект. Для значимого типа, выделяется чуть меньшее место в стеке. Но массив то сам ссылочного типа. И значит место под ссылочный тип всё равно будет затребовано в куче. Если нужно клонировать массив (при передаче в другой метод, в ругой слой и т.д.), то для ссылочного типа будут копироваться только ссылки на объекты. А для значимого - целиком весь массив. То есть нет общего правила на все случаи жизни. Всё зависит от конкретной задачи. Другой пример. Если у вас в структуре поля ТОЛЬКО значимого типа. То тогда не нужно реализовывать Equals и GetHasCode - хватает реализации по умолчанию. Но если в структуре есть поля ссылочного типа, даже если они иммутабельные (как у вас строка Name), то реализации по умолчанию Equals и GetHasCode будут учитывать только ссылку в поле. И может быть ситуация когда одинаковые Name, но полученные разными способами для дефолтных Equals и GetHasCode не будут считаться равными. Поэтому, если есть ссылочные поля в структуре и нужно сравнение по значению, то нужна собственная реализация Equals и GetHasCode. В целом, такое заключение. Если в типе поля ТОЛЬКО значимого типа, то с большой вероятностью этот тип получится удачно реализовать как структуру. Если в типе есть поля ссылочного типа, то удобство реализации и использования структуры резко снижается. И надо рассматривать уже по многим параметрам и конкретным условиям задания.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 24.08.2021, 23:48 [ТС] | ||
|
0
|
||
|
Модератор
|
||||||
| 24.08.2021, 23:51 | ||||||
|
limeniye, простые структуры сейчас очень успешно во многих случаях могут заменить кортежи.
Это значимы мутабельный тип. Но мутабельность значимых типов несоздаёт проблем, поскольку после копирования копия не связана с оригиналам. Допустим:
1. Как было это значение записано так оно и осталось.А для ссылочного типа, вывод будет 10.Что не всегда очевидно.
0
|
||||||
|
Модератор
|
||
| 24.08.2021, 23:57 | ||
|
Однозначного ответа нет. Допустим, есть массив Point[]. Вам нужно изменить X у первого элемента. Если это ссылочный тип, то это points[0].X = 12;.Если значимый, то - points[0] = new Point(12, point[0].Y) - то есть нужно заменять полностью весь экземпляр.С одной стороны это не удобно. Но посмотрите с точки зрения WPF. Если ссылочного, то нужно в типе элемента Point - реализация INPC. А для значимого - не нужно. Так как элемент заменяется всегда только полностью, то достаточно ObservableCollection.
1
|
||
| 24.08.2021, 23:57 | |
|
Помогаю со студенческими работами здесь
20
Преобразование типов....
Преобразование типов
Преобразование типов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|