Библиотека сайта rus-linux.net
Электронные таблицы SocialCalc
Глава 19 из книги "Архитектура приложений с открытым исходным кодом", том 1.
Оригинал: SocialCalc,
глава из книги "The Architecture of Open Source Applications" том 1.
Автор: Audrey Tang, перевод: Н.Ромоданов
19.2. SocialCalc
Рис.19.5. Интерфейс SocialCalc
На рис.19.5 и рис.19.6 показаны интерфейс и классы SocialCalc, соответственно. В сравнении с WikiCalc, роль сервера была значительно сокращена. Его единственной обязанностью осталось отвечать на запросы HTTP GET и обслуживать все электронные таблицы, сериализуя их в формате save, позволяющим их сохранять; как только браузер получал данные, все расчеты, отслеживание изменений и взаимодействия пользователем теперь осуществлялись на языке Javascript.
Рис.19.6: Диаграмма классов SocialCalc
Компоненты Javascript были разработаны в стиле послойной модели MVC (Model/View/Controller — Модель/Внешний вид/Контроллер), причем задача каждого класса фокусировалась на одном аспекте:
- Класс Sheet является моделью данных, представляющих структуру электронной таблицы, размещенную в памяти. В ней хранится словарь из координат для объектов Cell (Ячейка),Он содержит словарь из координат сотовых объектов, каждый из которых представляет одну ячейку. В пустых ячейках нет записей и, поэтому, для них вообще память не тратится.
- Класс Cell представляет собой содержимое и формат ячейки. Некоторые обычные свойства приведены в таблице 19.1.
- Класс RenderContext реализует компонент отображения, на него возложена обязанность отображать лист в объекты DOM.
- Класс TableControl является основным контроллером, принимающим события мыши и клавиатуры. Как только он получит событие, связанное с отображением, например, прокруткой и изменением размеров, он обновляет связанный с ними объект RenderContext. Как только он получит обновления события, которые влияют на содержимое листа, он создает новые команды, которые помещаются в очередь команд листа.
- Класс SpreadSheetControl является пользовательским интерфейсом верхнего уровня с панелями инструментов, строками состояний, диалоговыми окнами и палитрами для выбора цвета.
- Класс SpreadSheetViewer является альтернативным пользовательским интерфейсом верхнего уровня, который предназначен только для интерактивного просмотра.
Таблица 19.1: Содержимое и форматы ячеек
datatype | t |
datavalue | 1Q84 |
color | black |
bgcolor | white |
font | italic bold 12pt Ubuntu |
comment | Ichi-Kyu-Hachi-Yon |
Мы взяли на вооружение систему объектов с минимальным количеством классов и простыми механизмами композиции/делегирования и не использовали наследование или прототипы объектов. Все символы помещаются в пространство имен SocialCalc.*
с тем, чтобы избежать конфликта имен.
Каждое обновление на листе проходит через метод ScheduleSheetCommands
, который принимает строку, представляющую собой команду редактирования. Некоторые обычные команды показаны в таблице 19.2. В приложении, в которое встроен SocialCalc, можно самостоятельно определять дополнительные команды при помощи добавления именованных обратных вызовов в объект SocialCalc.SheetCommandInfo.CmdExtensionCallbacks
и использования команды startcmdextension
для обращения к ним.
Таблица 19.2: Команды SocialCalc
set sheet defaultcolor blue set A width 100 set A1 value n 42 set A2 text t Hello set A3 formula A1*2 set A4 empty set A5 bgcolor green merge A1:B2 unmerge A1 | erase A2 cut A3 paste A4 copy A5 sort A1:B9 A up B down name define Foo A1:A5 name desc Foo Used in formulas like SUM(Foo) name delete Foo startcmdextension UserDefined args |
Далее: Цикл работы команд