2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 208
|
|
1 | |
Сделать несколько экземпляров класса со статическими полями17.01.2015, 20:56. Показов 1241. Ответов 5
Метки нет (Все метки)
Здравствуйте, для начала обрисую проблему. Есть обычный класс Человек с присущими человеку параметрами: возраст, вес имя и т.д. В этом классе есть статические поля представляющие из себя списки с Человеками такие как : Болеют, ПринимаютДуш, НаходятсяВОтпуске, УдарилисьГоловой и т.д. Т.е. это статусы или события и в эти списки вносятся Человеки для которых они верны.
Вы можете воскликнуть: "А почему ты занимаешься такими извращениями и не хранишь подобную информацию в инстанцах объекта?!", - потому что быстродействие критично. Если нам нужно вызвать из отпуска работников, необходимо найти всех людей в отпуске, если нужно обработать событие УдарГоловой и снять 10hp - нужно получить всех этих людей. Осуществлять поиск и выборку в каждой интерации среди всех людей очень накладно. Я бы жил и горя не знал если бы мне не пришлось создать, например, два Мира и в каждом свой набор Человеков. Но поля в Человеке то статичны! Возможные выходы из ситуации: а. Вынести статическую инфу из Человека в отдельный инстанцируемый класс и назначить каждому Миру по экземпляру. Проблема в том, что объем кода и файлов возрастет в два раза. Сущность Человек у нас не один и для каждого создавать вспомогательный класс... Много мороки. б. Отказаться от списков с событиями и обработки их пачкой. Человек СломалНогу? Тут же и вызвали обработчик события и нефиг что то там складировать в списках. Но архитектура моего приложения это некое подобие ECS (Entity component system) Обработчики вызываются последовательно, в определенном порядке и обрабатывают сразу пачку данных за раз. Надеюсь, что более опытным коллегам известны темные заклинания и обряды способные решить данную проблему, потому что я не представляю, что можно придумать.
0
|
17.01.2015, 20:56 | |
Ответы с готовыми решениями:
5
Непонятки со статическими полями класса Ошибка Unresolved external при работе со статическими полями класса Несколько экземпляров класса Как хранить несколько экземпляров класса с их свойствами? |
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
|
|
17.01.2015, 22:09 | 2 |
Вообще, хранить такие списки сама по себе сомнительная идея. Для каждого состояния нужен свой список, причем в списках будут повторы, т.к. человек может и болеть, и ударится головой, и быть в отпуске одновременно. В чем выгода не понятно.
Поэтому я бы реализовал и пункт А, и пункт Б. а)Человек не должен знать о списке людей. Если вы вырежете код из класса человек и перенесете в класс список с человеками, то ничего возрастать там не должно. Что вы понимаете под сущностью? объекты класса человек?Не нужно для каждого человека создавать вспомогательные классы. Есть один класс список с человеками и есть экземпляр этого класса. Этот экземпляр используют все кому надо. Если у вас два мира, создаете 2 объекта "список с человеками" для каждого мира. б)смысла в обработке пачкой не вижу, вам все равно нужно обработать всех людей на карте. Едва ли обновлять списки будет быстрее. Суммарная длина списка как минимум равна кол-ву всех людей. Что то добавить трудно, мало инфы.
0
|
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 208
|
|
18.01.2015, 01:17 [ТС] | 3 |
В моем случае события происходят довольно редко и обновление списка это несколько .Add() и .Clear() в конце итерации.
Как минимум - это экономия памяти. Лучше одно поле со списком в 100 элементов, чем bool поле в 1кк экземплярах. К тому же пройтись циклом по 100 элементам точно быстрее чем по 1кк + условие. И если честно, я не понял на счет повторений людей в списках. Да, человек может и болеть, и ударится головой и поэтому он входит в оба списка. Можно сделать как то иначе? При таком подходе можно очень легко организовать многопотчность. И да, я забыл упомянуть, что важна последовательность в которой обработчики (извините за тавтологию) обрабатывают данные. При "б" подходе они могут быть вызваны цепочкой событий в любом месте и в любое время. Нет, под сущностью имелся в виду класс. Для классов Камень, Дерево, Машина придется создавать по одному вспомогательному классу в отельном файле.
0
|
Master of Orion
|
||||||
18.01.2015, 03:06 | 4 | |||||
PlutDem, перенеси список человеков в другой класс, и создавай нужно количество инстансов. Статическое поле может быть только одно и не наследуется, поэтому если нужно несколько - то нужно создавать инстансы. А-ля
0
|
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 208
|
|
18.01.2015, 14:10 [ТС] | 5 |
Psilon, но ведь это тоже самое, что и вариант а. Или вы предлагаете один класс для всех событий/состояний всех классов?
0
|
Master of Orion
|
|
18.01.2015, 15:03 | 6 |
PlutDem, ну вроде того. Для каждого типа создаете один инстанс этого мега-класса и все дела.
По крайней мере без полного описания задачи точнее сказать не получится. Может этот способ и не очень подходит. Хотя должен.
0
|
18.01.2015, 15:03 | |
18.01.2015, 15:03 | |
Помогаю со студенческими работами здесь
6
Каким лучше образом создавать сразу несколько экземпляров класса? Почему при множественном наследовании в производном классе оказывется несколько экземпляров общего базового класса Динамический массив экземпляров класса, с неизвестным количеством экземпляров Как сделать так, чтобы значения экземпляров класса не повторялись Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |