Здесь показаны различия между двумя версиями данной страницы.
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) | ||
+ | - Проверка нужно ли выполнять работу (Для детерминированных алгоритмов, которые зависят только от исходных данных, можно посчитать хэш всех исходных данных и сохранить вместе с результатом, а при следующем вызове перед долгими вычислениями проверить совпадает ли хеш новых данных с хешом по которым уже есть посчитанный результат) | ||
+ | - Быстрый поиск дубликатов в наборе данных (Если отсортировать объекты в массиве по их хешам, то поиск дубликатов выполняется тривиально) | ||
+ | |||
[[Конвейер подготовки видимого изображения]] | [[Конвейер подготовки видимого изображения]] |