SAS.Wiki

Веб-картография и навигация

Инструменты пользователя

Инструменты сайта


sasdev:архитектура_программы

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

sasdev:архитектура_программы [14/01/2015 13:53]
vdemidov создано
sasdev:архитектура_программы [16/01/2015 11:00] (текущий)
vdemidov
Строка 1: Строка 1:
 ====== Архитектура программы ====== ====== Архитектура программы ======
 +
 +===== Неизменяемые (иммутабельные) данные =====
 +
 +В условиях многопоточности,​ самый лучший способ не нарваться на проблемы,​ это просто не изменять общие данные. Поэтому многие объекты в программе неизменяемые. Это позволяет кэшировать их, использовать пулы объектов и тд.
 +
 +===== Подписка на события =====
  
 Практически повсеместно в SAS.Планете используются подписки на события. То есть, если какой-то объект может меняться,​ то он наследуется от интерфейса IChangeable у которого есть ChangeNotifier:​ INotifier позволяющий любому заинтересованному объекту подписаться на уведомления об изменениях. Обработчики этих уведомлений должны быть максимально легковесными и не занимать много времени. ​ Практически повсеместно в SAS.Планете используются подписки на события. То есть, если какой-то объект может меняться,​ то он наследуется от интерфейса IChangeable у которого есть ChangeNotifier:​ INotifier позволяющий любому заинтересованному объекту подписаться на уведомления об изменениях. Обработчики этих уведомлений должны быть максимально легковесными и не занимать много времени. ​
Строка 6: Строка 12:
  
 Плюс они должны по максимуму гасить продвижение волны уведомлений - если изменчивый объект A зависит от изменчивого объекта B, то объект А, после получения уведомления об изменении B, должен проверить реально ли это влияет на его собственное состояние и отправлять уведомление о своем изменении только если оно действительно произошло. Плюс они должны по максимуму гасить продвижение волны уведомлений - если изменчивый объект A зависит от изменчивого объекта B, то объект А, после получения уведомления об изменении B, должен проверить реально ли это влияет на его собственное состояние и отправлять уведомление о своем изменении только если оно действительно произошло.
 +
 +===== Использование хешей =====
 +Использование хешей в программе преследует несколько целей:
 +  - Самое очевидно применение это быстрое сравнение больших и сложных объектов (Если у нас есть массив точек полигона,​ то для сравнения мы можем сравнивать все точки, что может быть долго, или можем кроме точек полигона хранить их хеш и сравнивать только хэши. Вероятность коллизии для качественной 64-битной хэш функции для случая данных в ОЗУ просто таки микроскопически мала)
 +  - Быстрый поиск при кэшировании данных (В программе реализован алгоритм кэширования 2Q, который при определенных параметрах может вырождаться в простой LRU)
 +  - Проверка нужно ли выполнять работу (Для детерминированных алгоритмов,​ которые зависят только от исходных данных,​ можно посчитать хэш всех исходных данных и сохранить вместе с результатом,​ а при следующем вызове перед долгими вычислениями проверить совпадает ли хеш новых данных с хешом по которым уже есть посчитанный результат)
 +  - Быстрый поиск дубликатов в наборе данных (Если отсортировать объекты в массиве по их хешам, то поиск дубликатов выполняется тривиально)
 +
  
 [[Конвейер подготовки видимого изображения]] [[Конвейер подготовки видимого изображения]]