Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 208
1

Сделать несколько экземпляров класса со статическими полями

17.01.2015, 20:56. Показов 1241. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, для начала обрисую проблему. Есть обычный класс Человек с присущими человеку параметрами: возраст, вес имя и т.д. В этом классе есть статические поля представляющие из себя списки с Человеками такие как : Болеют, ПринимаютДуш, НаходятсяВОтпуске, УдарилисьГоловой и т.д. Т.е. это статусы или события и в эти списки вносятся Человеки для которых они верны.
Вы можете воскликнуть: "А почему ты занимаешься такими извращениями и не хранишь подобную информацию в инстанцах объекта?!", - потому что быстродействие критично. Если нам нужно вызвать из отпуска работников, необходимо найти всех людей в отпуске, если нужно обработать событие УдарГоловой и снять 10hp - нужно получить всех этих людей. Осуществлять поиск и выборку в каждой интерации среди всех людей очень накладно.

Я бы жил и горя не знал если бы мне не пришлось создать, например, два Мира и в каждом свой набор Человеков. Но поля в Человеке то статичны!
Возможные выходы из ситуации:
а. Вынести статическую инфу из Человека в отдельный инстанцируемый класс и назначить каждому Миру по экземпляру. Проблема в том, что объем кода и файлов возрастет в два раза. Сущность Человек у нас не один и для каждого создавать вспомогательный класс... Много мороки.
б. Отказаться от списков с событиями и обработки их пачкой. Человек СломалНогу? Тут же и вызвали обработчик события и нефиг что то там складировать в списках. Но архитектура моего приложения это некое подобие ECS (Entity component system) Обработчики вызываются последовательно, в определенном порядке и обрабатывают сразу пачку данных за раз.

Надеюсь, что более опытным коллегам известны темные заклинания и обряды способные решить данную проблему, потому что я не представляю, что можно придумать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2015, 20:56
Ответы с готовыми решениями:

Непонятки со статическими полями класса
Обязательно ли инициализировать статическую константу в определении класса? Можно ли ее определить...

Ошибка Unresolved external при работе со статическими полями класса
Доброго всем времени суток. Помогите решить вот такую проблемку. Имеется 2 класса: class...

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

Как хранить несколько экземпляров класса с их свойствами?
Есть у нас класс - овощи объект - овощ: картошка, огурец, морковь у них есть свойства - цвет,...

5
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
17.01.2015, 22:09 2
Вообще, хранить такие списки сама по себе сомнительная идея. Для каждого состояния нужен свой список, причем в списках будут повторы, т.к. человек может и болеть, и ударится головой, и быть в отпуске одновременно. В чем выгода не понятно.
Поэтому я бы реализовал и пункт А, и пункт Б.
а)Человек не должен знать о списке людей.
Цитата Сообщение от PlutDem Посмотреть сообщение
Проблема в том, что объем кода и файлов возрастет в два раза.
Если вы вырежете код из класса человек и перенесете в класс список с человеками, то ничего возрастать там не должно.
Цитата Сообщение от PlutDem Посмотреть сообщение
Сущность Человек у нас не один и для каждого создавать вспомогательный класс
Что вы понимаете под сущностью? объекты класса человек?Не нужно для каждого человека создавать вспомогательные классы. Есть один класс список с человеками и есть экземпляр этого класса. Этот экземпляр используют все кому надо.
Если у вас два мира, создаете 2 объекта "список с человеками" для каждого мира.

б)смысла в обработке пачкой не вижу, вам все равно нужно обработать всех людей на карте.


Цитата Сообщение от PlutDem Посмотреть сообщение
Осуществлять поиск и выборку в каждой интерации среди всех людей очень накладно
Едва ли обновлять списки будет быстрее. Суммарная длина списка как минимум равна кол-ву всех людей.

Что то добавить трудно, мало инфы.
0
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 208
18.01.2015, 01:17  [ТС] 3
Цитата Сообщение от tarasalk Посмотреть сообщение
Едва ли обновлять списки будет быстрее. Суммарная длина списка как минимум равна кол-ву всех людей.
В моем случае события происходят довольно редко и обновление списка это несколько .Add() и .Clear() в конце итерации.
Цитата Сообщение от tarasalk Посмотреть сообщение
Для каждого состояния нужен свой список, причем в списках будут повторы, т.к. человек может и болеть, и ударится головой, и быть в отпуске одновременно. В чем выгода не понятно.
Как минимум - это экономия памяти. Лучше одно поле со списком в 100 элементов, чем bool поле в 1кк экземплярах. К тому же пройтись циклом по 100 элементам точно быстрее чем по 1кк + условие.
И если честно, я не понял на счет повторений людей в списках. Да, человек может и болеть, и ударится головой и поэтому он входит в оба списка. Можно сделать как то иначе?
Цитата Сообщение от tarasalk Посмотреть сообщение
б)смысла в обработке пачкой не вижу, вам все равно нужно обработать всех людей на карте.
При таком подходе можно очень легко организовать многопотчность. И да, я забыл упомянуть, что важна последовательность в которой обработчики (извините за тавтологию) обрабатывают данные. При "б" подходе они могут быть вызваны цепочкой событий в любом месте и в любое время.
Цитата Сообщение от tarasalk Посмотреть сообщение
Что вы понимаете под сущностью? объекты класса человек?Не нужно для каждого человека создавать вспомогательные классы. Есть один класс список с человеками и есть экземпляр этого класса. Этот экземпляр используют все кому надо.
Нет, под сущностью имелся в виду класс. Для классов Камень, Дерево, Машина придется создавать по одному вспомогательному классу в отельном файле.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.01.2015, 03:06 4
PlutDem, перенеси список человеков в другой класс, и создавай нужно количество инстансов. Статическое поле может быть только одно и не наследуется, поэтому если нужно несколько - то нужно создавать инстансы. А-ля

C#
1
2
3
4
5
6
public class SomeState
{
   IList<People> Sick { get; set;}
   IList<People> SomethingElse { get; set;}
   //...
}
0
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 208
18.01.2015, 14:10  [ТС] 5
Psilon, но ведь это тоже самое, что и вариант а. Или вы предлагаете один класс для всех событий/состояний всех классов?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.01.2015, 15:03 6
PlutDem, ну вроде того. Для каждого типа создаете один инстанс этого мега-класса и все дела.

По крайней мере без полного описания задачи точнее сказать не получится. Может этот способ и не очень подходит. Хотя должен.
0
18.01.2015, 15:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2015, 15:03
Помогаю со студенческими работами здесь

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

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

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

Как сделать так, чтобы значения экземпляров класса не повторялись
Я пытаюсь написать игру 2048. Коротко об игре, для тех кто не знает: Есть поле 4х4 в нем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru