cstd
Version:
CoffeeScript Standart Library
102 lines (83 loc) • 6.27 kB
Markdown
# Библиотека стандартных классов для кофескрипта/яваскрипта
[](https://travis-ci.org/E-geek/cstd)
[](https://coveralls.io/github/E-geek/cstd)
## Оглавление
1. [Оглавление](#Оглавление)
1. [Введение](#Введение)
1. [Общее описание классов](#Общее-описание-классов)
2. [Легенда](#Легенда)
2. [Атомы](#Атомы)
2. [Контейнеры](#Контейнеры)
2. [Даты](#Даты)
2. [События](#События)
2. [Кэш](#Кэш)
2. [Ошибки](#Ошибки)
## Введение
Библиотека реализует набор примитивов, которые могут быть полезны.
Примитивы создаются аналогично библиотеке STL для C++,
но аналогичность не означает идиентичность.
Некоторые контейнеры могут уступать по скорости нативному массиву (например
`Stack`), но гарантируют отсутствие утечек и странных скачков потребления
памяти (в отличии от `Array`). Так же следует понимать зачем какой
тип вы используете т.к. в противном случае получить просадку по
скорости и памяти проще простого.
Методы, использование которых не желательно, зачастую имеют
простор для оптимизации, но она отложена. О нежелательном использовании
можно узнать из документации.
В библиотеке предусматриватся обратная совместимость поведения,
без обратной совместимости отбрасывания ошибок. Это значит,
что если метод в одной версии может обрабатывать 2 аргумента,
а в следущей 3, то в первой версии он бросит исключение при
работе с 3 аргументами, а во второй версии -- нет.
Библиотека полностью покрывается тестами, которые так же будут
учавствовать в тестах на обратную совместимость. Естественно
тесты исключений в обратной совместимости будут пропущены.
## Общее описание классов:
### Легенда:
* '<-' = extends (означает что класс слева унаследован от класса справа)
* '(abstract)' = класс абстрактный, если создавать объект на его основе,
то будет брошено исключение
* '(inner)' = класс не доступен через мостик `cstd`, для доступа надо подключать
самостоятельно
* '(native)' = уточнение, что речь идёт от встроенном классе, чтобы не путать
### Атомы
Атомами являются классы, котрые не наследуют никакой другой класс
и не имплементируют в себе никакой класс вовсе.
Типичными атомами являются:
* `CSObject` (abstract) <- `Object`
* `Node` <- `CSObject`
### Контейнеры
Контейнерами являются классы, объекты которых хранят, обрабатывают,
представляют и удаляют другие сущности (примитивы и объекты)
по определённым для данного класса правилам. Контейнеры оперируют
с узлами (`Node`) и обычно класс контейнера имеет метод (`fromArray`) создания
кобъекта на основе представления массива. Реализованны:
* `Container` (abstract) <- `CSObject`
* `Stack` <- `Container`
* `Queue` <- `Container`
* `Deque` <- `Container`
* `List` <- `CSObject`
* `CircularList` <- `CSObject`
* `NodeQueue` (inner) <- `CSObject`
### Даты
Для возможности наследовать класс `Date` был создан промежуточный
класс `CSDate`. В нём все методы дублируют оригинальный `Date`
и есть гарантия наличия некоторых методов (напрмер `now`).
* `CSDate` <- `Date` (native)
### События
Для событий существует абстрактный класс `CSEmitter` объекта,
создающего события и сам класс события `CSEvent`.
* `CSEmitter` <- `CSObject`
* `CSEvent` <- `CSObject`
### Кэш
Для кеширования по количеству объектов существует абстрактный класс `BaseCache`,
работающий на `NodeQueue` представлениях с примитивнейшим механизмом вытеснения.
Реализован полноценный LRU кэш (`LRUCache`) с алгоритмической сложностью
доступа, посика, вставки О(1). Для всех кэшей публичны методы `get`, `set`,
`clear`, а так же read-only свойства `length` и `maxSize`
* `BaseCache` (abstract) <- `CSObject`
* `LRUCache` <- `BaseCache`
### Ошибки
Для создания "своих" классов ошибок есть `CSError`, который сам так же может
быть использован для бросания исключения.
* `CSError` <- `Error` (native)