2011-02-02 3 views
7

Я всегда хотел написать простой мир на Java, но затем я мог запустить «мир», а затем добавить новые объекты (что не " t существует в момент начала работы в мире) на более позднюю дату (для имитации/наблюдения за другим поведением между будущими объектами).нужна конструкция/структура/структура help при кодировании java 'world'

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

Мир может быть таким же простым, как 10 x 10 массив x/y 'местоположений' (подумайте о шахматной доске), но мне, наверное, понадобится какой-то процесс ticktimer для мониторинга объектов и предоставления каждому (если есть) шанс «действовать» (если они захотят).

Пример: Я код World.java в понедельник и оставлю его работать. Затем во вторник я пишу новый класс Rock.java (который не перемещается). Затем я бросаю его (каким-то образом) в этот уже запущенный мир (который просто отбрасывает его в случайном порядке в массиве 10x10 и никогда не перемещается).

Затем в среду я создаю новый класс под названием Cat.java и удаляю его в мир, снова помещенный случайным образом, но этот новый объект может перемещаться по всему миру (за некоторую единицу времени), а затем в четверг я пишу класс, называемый Dog.java, который также перемещается, но может «действовать» на другом объекте, если он находится в соседнем местоположении, и наоборот.

Вот что. Я не знаю, какой тип структуры/дизайна мне понадобится для кодирования реального мирового класса, чтобы знать, как определять/загружать/отслеживать будущие объекты.

Итак, любые идеи о том, как вы будете делать что-то подобное?

+2

Я чувствую запах грязи в процессе изготовления !!! – Orbit

+0

Есть ли вероятность, что вам понадобится повторно удалить тот же (измененный) класс? Или вы будете просто бросать новые классы? – cherouvim

+0

Первоначально я думал о новых классах, но, без сомнения, я вижу, что существующий объект немного сумасшедший, тогда да, я хотел бы его модифицировать (и все его экземпляры), а затем перерисовать его в мире, чтобы наблюдать за его поведением для другого неделю или около того. – d33j

ответ

0

Если вы заботитесь только о добавлении классов (а не модификации) вот что я хотел бы сделать:

  • есть интерфейс Entity со всеми бизнес-методы, вам нужно (insertIntoWorld(), isMovable(), getName(), getIcon() и т.д.)
  • есть конкретный пакет, в котором находятся объекты
  • есть запланированное задание в приложении, которое каждые 30 секунд перечислены файлы классы пакета
  • следить за классами и для любого нового класса пытаться загрузить класс и бросить на Entity
  • для любого нового загруженного Entity создайте новый экземпляр и позвоните по номеру insertIntoWorld().

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

Некоторые проблемы:

  • вы не можете легко обновить Entity.Вы, скорее всего, нужно сделать некоторые загрузчик классов волшебной
  • вы не можете расширить интерфейс Entity добавить новый бизнес bethod, так что вы привязаны к контракту вы изначально начали свое приложение с
1

я не знаю если у вас есть шаблон/стратегия для такой проблемы, но вот так я бы подошел к этому:

Я бы хотел, чтобы все эти разные классы, которые вы планируете сделать, должны были быть объектом некоторого общего класса (возможно, класс WorldObject), а затем помещать свои отличительные функции в отдельные файлы конфигурации.

Создание
Когда программа запущена, она будет регулярно проверять эту папку конфигурации для новых элементов. Если он видит, что существует новый файл конфигурации (например, Cat.config), он создаст новый объект WorldObject и предоставит ему функции, которые он читает из файла Cat.config, и переносит этот новый объект в мир.

Мутация
Если программа обнаруживает, что один из файла конфигурации этого элемента изменился, то обнаружит, что объект в мире, редактировать свои функции, а затем снова отобразить его.

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

0

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

Прежде всего, если вы каким-то образом знаете имя класса, вы можете загрузить его с помощью Class.forName(). Это способ получить класс. Затем вы можете создать экземпляр, используя Class.newInstance(). Если класс имеет общедоступный конструктор по умолчанию, этого достаточно. Подробнее читайте об API отражения.

Но как передать имя нового класса программе, которая уже запущена? Я бы предложил два способа.

  1. Программа может выполнять опрос предопределенного файла. Если вы хотите развернуть новый класс, вам необходимо его зарегистрировать, то есть записать его имя в этот файл. Кроме того, этот класс должен быть доступен в classpath вашего приложения.
  2. приложение может выполнять опрос (например) специальной директории, содержащей файлы jar. После того, как он обнаруживает новый файл банку он может прочитать его содержимое (см JarInputStream), а затем вызвать экземпляр нового класса с помощью ClaasLoader.defineClass(), а затем вызвать newInstane() и т.д.
+0

ОП сделал большую работу, описывая проблему своими словами. Нет проблем просто, если никто не знает, как его решить. – cherouvim

1

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

Вместо этого я разработал систему, которая может надежно сохранять состояние каждого задействованного объекта (самый простой подход: сделать каждый объект сериализуемым, но это не решит проблемы с версией).

Итак, в качестве первого шага я бы просто реализовал какую-нибудь красивую мануатуру классов, чтобы позволить «упасть» в мировую симуляцию, которая будет загружаться динамически.Но как только вы достигнете точки, когда это больше не работает (потому что вам нужно изменить сам мир или вам нужно сделать несовместимые изменения для какого-либо объекта), вы можете сохранить состояние, отключить библиотеки для новых версий и перезагрузить состояние ,

Возможность сохранения состояния также позволяет легко создавать тестовые сценарии или сценарии воспроизведения с различными параметрами.

1

Посмотрите на OSGi - эта среда позволяет устанавливать и удалять пакеты во время выполнения.

Рамка представляет собой контейнер для так называемых пучков, java-библиотек с некоторыми дополнительными конфигурационными данными в файле манифестов банок.

Вы можете установить «мировой» комплект и поддерживать его работу. Затем, через некоторое время, установите комплект, который вносит камни или песок в мир. Если вам это больше не нравится, отключите его. Если вам нужны другие камни, установите обновленную версию одного и того же пакета и активируйте его.

И с OSGi вы можете держать мир крутым и движущимся вокруг солнца.

Ссылка реализация equinox


КСТАТИ: «Я не знаю, что своего рода структуры/дизайн» - по крайней мере, вам нужно определить интерфейс для «geolocatable объекта», в противном случае вы не сможете разместить и отобразить его. Но для «мира», действительно, может быть достаточно знать, что «есть что-то в координатах x/y/z» и для мирового зрителя, что у этого «чего-то» есть способ «показать себя».

+0

О, мне это нравится ... но не «мир» должен знать о «кошке» в то время, когда «кошка» может даже не существовать. Во всяком случае, +1 – CurtainDog

+0

@CurtainDog - Нет, это не так. «Мир» не знает, что именно лежит или ползает на его поверхности (= мир ** имеет-поверхность **). Он может знать, какое местоположение (координата) занято * чем-то *. И мировой зритель может попросить «что-то» рисовать на 2D (или 3D) проекции. –

0

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

Вам будет нужен постоянный слой, JVM является надежным, но в конечном итоге кто-то перейдет через шнур питания и вытрит ваш мир. Опять с JPA и др. Здесь нет необходимости изобретать велосипед. Hibernate, вероятно, является «стандартом», но с вашими требованиями я бы попробовал что-то более интересное с одним из решений NoSQL на основе графиков.

0

Что вы, вероятно, хотите посмотреть, это модель/подход «динамическая объектная модель». Я реализовал его некоторое время назад. С его помощью вы можете создавать/изменять objecttypes во время выполнения, которые являются своего рода шаблонами для объектов. Вот документ, который описывает идею:

http://hillside.net/plop/plop2k/proceedings/Riehle/Riehle.pdf

Есть несколько статей, но я не смог опубликовать их, потому что это мой первый ответ, и я не имею достаточно репутации. Но Google - ваш друг :-)

Смежные вопросы