русский
Germany.ruForen → Архив Досок→ Programmierung

Используете уникальные идентификаторы для объектов?

1559  1 2 3 alle
alex445 патриот01.11.24 16:28
01.11.24 16:28 
Zuletzt geändert 01.11.24 16:32 (alex445)

Работал с самописной коллекцией объектов, у каждого из которых была модель и представление. Байндингов нет, т.к. не охота заморачиваться их реализацией в самописных контролах. При операциях добавления-удаления представлений стали почему-то выкидываться исключения, что представления для удаления не найдены, хотя мне казалось, что они точно были в коллекции - ведь данные отображаются те же. При удалении представлений я сравниваю их по ссылке. Смотрю под дебагом - модели у представлений одинаковые, данные в них одинаковые, почему считает, что это разные представления и ссылки на них не равны? Оказалось, что при определённых условиях коллекция создаёт новые представления с теми же моделями, потому и данные отображаются одинаковые. Но пока не добавил уникальные идентификаторы для представлений, не смог понять это.


Если бы сравнивал представления не по ссылке, а скажем по значениям моделей (в моделях есть свои уникальные идентификаторы), то всё бы работало, баг бы не проявлялся. Только память бы постепенно утекала.

#1 
AlexNek патриот01.11.24 22:37
AlexNek
01.11.24 22:37 
in Antwort alex445 01.11.24 16:28

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

#2 
alex445 патриот01.11.24 23:18
NEW 01.11.24 23:18 
in Antwort AlexNek 01.11.24 22:37

Сама ссылка на объект и есть вполне себе уникальный айди.


вообще непонятно, как пришла идея сравнивать без ИД

А вы любой класс начинаете с добавления ему какого-то уникального идентификатора?

#3 
AlexNek патриот01.11.24 23:25
AlexNek
NEW 01.11.24 23:25 
in Antwort alex445 01.11.24 23:18
Сама ссылка на объект и есть вполне себе уникальный айди.

смотря что под этим понимать. Вначале должно быть определение, какие два объекта будут считаться одинаковыми.

Вот сделал я клон моего объекта - это одинаковые объекты или разные?


А вы любой класс начинаете с добавления ему какого-то уникального идентификатора?

Если класс "сидит" в базе, то скорее всего да. Но всегда есть исключения смущ

#4 
alex445 патриот02.11.24 00:53
NEW 02.11.24 00:53 
in Antwort AlexNek 01.11.24 23:25, Zuletzt geändert 02.11.24 00:57 (alex445)

Вначале должно быть определение, какие два объекта будут считаться одинаковыми.
Вот сделал я клон моего объекта - это одинаковые объекты или разные?

Две ссылки на один и тот же объект - это одинаковый объект. Тут-то разногласий не будет? Железное определение.

if (myIsland == yourIsland) throw new Exception();


А вы любой класс начинаете с добавления ему какого-то уникального идентификатора?
Если класс "сидит" в базе, то скорее всего да. Но всегда есть исключения

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

#5 
alex445 патриот02.11.24 01:05
NEW 02.11.24 01:05 
in Antwort alex445 02.11.24 00:53

Я пишу свой контрол для коллекций представлений. Среди прочего он должен запоминать выбранный объект. А также пытаюсь реализовать операцию обмена объектами между разными коллекциями. Я сделал для своей коллекции пока добавление и удаление как "атомарные" операции - т.е. происходят полностью внутри коллекции. А вот обмен, это когда из другой коллекции тащат предмет в мою коллекцию. Тогда моя коллекция должна отдать свой предмет и принять чужой. Если делать это как две последовательные атомарные операции - сначала удалить свой объект, потом принять чужой, то вот ошибка такая возникла. А реализовать обмен как отдельную атомарную операцию пока не придумал как. Да и не охота - придумал workaround через две простых, найдя описанную в начале ошибку и исправив.

#6 
Murr патриот02.11.24 04:39
Murr
NEW 02.11.24 04:39 
in Antwort alex445 01.11.24 23:18

Сама ссылка на объект и есть вполне себе уникальный айди.

------

С чего бы это? особенно с учетом возможной автоматической выгрузки/загрузки объектов...

#7 
kukka местный житель02.11.24 05:45
kukka
NEW 02.11.24 05:45 
in Antwort alex445 02.11.24 01:05, Zuletzt geändert 02.11.24 05:50 (kukka)

В одном списке количества объектов все равно меньше, чем в реальности. А теперь представьте комбинацию объектов и их трансформацию какое решение из этого вышло? Причем по некоторым объектам повторений то есть копий клонов ещё больше. Какое решение из этого вышло?


Второй вопрос по оптимизации приложений, почему вообще тут в Германии все работает с ошибками? В России и других странах бывшего постсовета у меня все чисто, а здесь полный бардак.


#8 
alex445 патриот02.11.24 08:18
NEW 02.11.24 08:18 
in Antwort Murr 02.11.24 04:39

Сама ссылка на объект и есть вполне себе уникальный айди.

------

С чего бы это? особенно с учетом возможной автоматической выгрузки/загрузки объектов...

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


Выгрузка загрузка - что вы имеете ввиду? Даже если адрес объекта обновится, то ссылка на него обновится у всех.


Для этой задачи мне нужно не сравнение по логике, а сравнение по физическому присутствию, если можно так выразиться. Для моделей пойдёт сравнение по логике (чтобы айдишники были одинаковые).

#9 
alex445 патриот02.11.24 08:21
NEW 02.11.24 08:21 
in Antwort alex445 02.11.24 08:18, Zuletzt geändert 02.11.24 08:29 (alex445)

Но вообще я другое имел ввиду под айдишниками для объектов. Я имел ввиду что-то типа


MyClass

{

static ulong idCounter = 0;

ulong id;

public MyClass() { id = idCounter++; }

}


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


Да это вообще старый приём с приписанными айдишниками к каждому объекту. Не понимаю, что все удивляются и цокают языками. )))

#10 
alex445 патриот02.11.24 08:27
NEW 02.11.24 08:27 
in Antwort kukka 02.11.24 05:45

В одном списке количества объектов все равно меньше, чем в реальности. А теперь представьте комбинацию объектов и их трансформацию какое решение из этого вышло? Причем по некоторым объектам повторений то есть копий клонов ещё больше. Какое решение из этого вышло?

Второй вопрос по оптимизации приложений, почему вообще тут в Германии все работает с ошибками? В России и других странах бывшего постсовета у меня все чисто, а здесь полный бардак.

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

#11 
AlexNek патриот02.11.24 10:25
AlexNek
NEW 02.11.24 10:25 
in Antwort alex445 02.11.24 00:53
Железное определение.

Абсолютно спок

https://onecompiler.com/csharp/42wws4jdp


Вы слишком далеко копаете

Вопрос - Используете уникальные идентификаторы для объектов смущ

#12 
Murr патриот02.11.24 11:07
Murr
NEW 02.11.24 11:07 
in Antwort alex445 02.11.24 08:18

Найдите второй объект с такой же ссылкой.

------

довольно давно описывал нерегулярно возникавшую ошибку с занулением объекта.

#13 
alex445 патриот02.11.24 17:12
NEW 02.11.24 17:12 
in Antwort AlexNek 02.11.24 10:25, Zuletzt geändert 02.11.24 17:14 (alex445)
https://onecompiler.com/csharp/42wws4jdp

У вас как раз моя ситуация - модель одна и та же (у вас просто данные скопированы), а инстансы представлений разные.


Если айди по смыслу должен иметь уникальный номер на инстанс, то не должно быть конструктора, копирующего этот айди. Каждый раз он должен присваиваться новый. У меня кстати счётчик айди простого типа (ulong) и статический, что по его природе уже гарантируют атомарность приращения и потокобезопасность. А значит и уникальность айди, если его задавать так

id = idCounter++;

#14 
AlexNek патриот02.11.24 18:03
AlexNek
NEW 02.11.24 18:03 
in Antwort alex445 02.11.24 17:12
Если айди по смыслу должен иметь уникальный номер на инстанс,

Не по смыслу, а так вам надо спок

Ну например так

Console.WriteLine($"Instance1 ID: 0x{RuntimeHelpers.GetHashCode(instance1):X8}");

Console.WriteLine($"Instance1 ID: 0x{RuntimeHelpers.GetHashCode(instance2):X8}");


Вариантов еще море

#15 
NightWatch коренной житель03.11.24 11:02
NightWatch
NEW 03.11.24 11:02 
in Antwort alex445 02.11.24 17:12
что по его природе уже гарантируют атомарность приращения и потокобезопасность. А значит и уникальность айди, если его задавать так
id = idCounter++;

Нет.

#16 
alex445 патриот03.11.24 14:45
NEW 03.11.24 14:45 
in Antwort NightWatch 03.11.24 11:02

Да.

#17 
NightWatch коренной житель03.11.24 16:10
NightWatch
NEW 03.11.24 16:10 
in Antwort alex445 03.11.24 14:45
internal class Program
{
    private static ulong idCounter = 0;

    static void Main(string[] args)
    {
        Task[] tasks = new Task[10];
        for (int j = 0; j < tasks.Length; j++) {
            tasks[j] = Task.Factory.StartNew(Increment);
        }
        Task.WaitAll(tasks);
        Debug.WriteLine($"Counter: {idCounter}");
    }

    private static void Increment()
    {
        for (int i = 0; i < 10000; i++) {
            idCounter++;
        }
    }
}
#18 
kukka местный житель03.11.24 17:51
kukka
NEW 03.11.24 17:51 
in Antwort NightWatch 03.11.24 16:10

Как быть с указанием метабазы и текст генератора?

#19 
AlexNek патриот03.11.24 19:45
AlexNek
NEW 03.11.24 19:45 
in Antwort alex445 03.11.24 14:45
Да.

Зачем тогда какие то придурки сделали "Interlocked.Increment(ref сount);"?

Можно же ведь проще спок

#20 
1 2 3 alle