Клон Google Sheets на Canvas | Часть 4: Стили, Undo/Redo и паттерны Command, Flyweight, Observer

В четвертой части продолжаем писать клон Google Sheets. Добавим возможность применять стили к ячейкам (жирность и курсив) и создадим интерфейс тулбара. Основная задача этой части, заложить правильную логику работы с данными и реализовать механизм отмены и повтора действий (Undo / Redo). Чтобы код легко масштабировался, применим три паттерна проектирования: Flyweight (Приспособленец). Логику хранения стилей скопируем из Excel. Стили на ячейках часто повторяются, и чтобы не забивать память тысячами одинаковых объектов, на уровне ячейки мы будем хранить только ID стиля. А сами стили вынесем в отдельный словарь (StyleRegistry). Command (Команда). Чтобы иметь историю изменений с возможностью отката, мы не будем менять стили напрямую. Вместо этого сделаем обертку для каждой операции (CommandManager и интерфейс ICommand). Каждое действие будет иметь методы execute (выполнить) и undo (отменить). Observer (Наблюдатель / EventEmitter).Синхронизировать состояние кнопок тулбара и активной ячейки напрямую, плохой вариант, так как стили могут меняться при отмене действия (Ctrl+Z) или вставке текста. Чтобы убрать жесткую связность и костыли с прямым вызовом перерисовки, напишем строго типизированный EventEmitter, через который компоненты будут подписываться на изменение состояния.

Клон Google Sheets на Canvas и TypeScript | Часть 2
▶︎

Клон Google Sheets на Canvas и TypeScript | Часть 2

Клон Google Sheets на Canvas и TypeScript | Часть 3: Выделение диапазонов и Resize ячеек
▶︎

Клон Google Sheets на Canvas и TypeScript | Часть 3: Выделение диапазонов и Resize ячеек

ArrayList vs LinkedList, кто быстрее в 18000 раз? Чем отличаются? Вопросы с реальных собеседований.
▶︎

ArrayList vs LinkedList, кто быстрее в 18000 раз? Чем отличаются? Вопросы с реальных собеседований.

System Design Interviews: Mistakes That Sink You
▶︎

System Design Interviews: Mistakes That Sink You

Клон Google Sheets на Canvas и TypeScript | Часть 1
▶︎

Клон Google Sheets на Canvas и TypeScript | Часть 1

Плагин для офиса 22 - бэкенд для OfficeJs, Папки
▶︎

Плагин для офиса 22 - бэкенд для OfficeJs, Папки

Чистая Windows без мусора: Как я настраиваю ОС, которая служит годами
▶︎

Чистая Windows без мусора: Как я настраиваю ОС, которая служит годами

ДИНА И АРИНА АВЕРИНЫ — Беременность, конфликт с Кошкиной, про Мамун и Винер / БеС Комментариев
▶︎

ДИНА И АРИНА АВЕРИНЫ — Беременность, конфликт с Кошкиной, про Мамун и Винер / БеС Комментариев

Микросервисы Простыми Словами за 1 Час
▶︎

Микросервисы Простыми Словами за 1 Час

PINK & ORANGE GRADIENT IN HD [3 HOURS]
▶︎

PINK & ORANGE GRADIENT IN HD [3 HOURS]

Android 17 sucks. So I put Linux on a phone.
▶︎

Android 17 sucks. So I put Linux on a phone.

Погодите... Гослинг продвигает фашизм?
▶︎

Погодите... Гослинг продвигает фашизм?

Большие языковые модели — краткое объяснение [3Blue1Brown]
▶︎

Большие языковые модели — краткое объяснение [3Blue1Brown]

Our lives have changed overnight too! #iran
▶︎

Our lives have changed overnight too! #iran

Почему Европа не может пережить глобальное потепление?
▶︎

Почему Европа не может пережить глобальное потепление?

Yandex: What Happened to the Biggest Company on the Russian Internet
▶︎

Yandex: What Happened to the Biggest Company on the Russian Internet

Wildberries is on fire.
▶︎

Wildberries is on fire.

Tuesday, July 21 Morning Prayer for Financial Breakthrough | Trust God to Provide Every Need Today 🙏
▶︎

Tuesday, July 21 Morning Prayer for Financial Breakthrough | Trust God to Provide Every Need Today 🙏

System Design Course – APIs, Databases, Caching, CDNs, Load Balancing & Production Infra
▶︎

System Design Course – APIs, Databases, Caching, CDNs, Load Balancing & Production Infra

Why does AI even work?
▶︎

Why does AI even work?