Основы sFF

Основная концепция sFF состоит в максимальной изолированности объектов фреймворка (во избежание коллизий при создании объектов и их функций, и обращении к ним) от объекта Window. Основные принципы разработки:

  • Всё находится в одном месте.

  • Ко всему обращаться единообразно.

  • Всё доступно для всех.

  • ООП - основа приложений sFF.

  • Все операции с HTML-элементами и стилями проводятся внутри классов компонентов, проведение их из пользовательского кода крайне не рекомендуется.

  • Пользователь может разрабатывать и подключать собственные и сторонние библиотеки классов.

  • Всё работает максимально быстро.

Весь sFF со всем его содержимым (объектами, компонентами, функциями, картами, коллекциями и т.д.) расположен в классе globalApplicationObjectStore (обращение к контенту осуществляется вызовом функции window.$_GAOS() или $_GAOS()). Первая выполняемая функция запуска приложения - создание уникального для приложения экземпляра класса globalApplicationObjectStore, после чего в приложении становятся доступен весь его контент.

В DOM (Объектной Модели Документа) HTML все элементы страницы рассматриваются в качестве структурированной группы узлов и объектов, могущих иметь свойства и методы. DOM связывает элементы страниц со скриптами. При этом элементы страницы и JS-код с его объектами и классами не являются единым целым и живут отдельно друг от друга.

sFF объединяет JS и элементы страницы (совмещая и упрощая деятельность верстальщика и JS-программиста), создавая компоненты из классов, включая в них визуальную (HTML + CSS) и программную (JS) части. И поскольку компоненты всегда имеют программную часть, собственные id и имя, внутреннюю иерархическую структуру, программные свойства и методы, отпадает потребность использовать селекторы для обнаружения элементов с целью применения к ним каких-либо операций. Компонент, его положение, отображение и функциональное поведение рассматривается как единое целое. Компонент неделим, но при этом его класс сам может состоять из нескольких связанных классов компонентов.

Нужно помнить, что термин включенный класс (includedClass), весьма условен. Для экземпляра класса Label экземплярами своих классов являются динамически создаваемые "через new" в конструкторе Label.LabelFont и Label.LabelFontColor, а Label.Label - объектом (object), с внедрёнными в него свойствами и методами. Но, поскольку внешнее (да и внутреннее) обращение к ним, их свойствам и методам абсолютно идентичное, будем оба этих типа называть одинаково.

Внутри классов компонентов НЕ ДОЛЖНО БЫТЬ "свободно шатающихся" свойств и методов, так как при нарушении этого правила в случаях наследования классов друг от друга по цепочке, результирующий класс может содержать в себе любое количество свойств и методов неопределённого происхождения, взаимно перекрывающих друг друга по именам (конфликт имён), расположенных на произвольном уровне вложенности и непонятно каким образом классифицируемых и изменяемых в Редакторе свойств. Таким образом, адресация к классу компонента выглядит как Label; адресация к включенному классу выглядит Label.Panel; адресация к свойству - как Label.Panel.cursor. ВСЕ классы компонентов ДОЛЖНЫ ИМЕТЬ трёхуровневую вложенность адресации свойства (ни больше, ни меньше).

Заметим, что то же самое свойство cursor, отвечающее за форму указателя мыши над компонентом для класса Button будет записываться как Button.Panel.cursor, что сразу даёт понимание: эти два свойства имеют одну природу, но лишь с тем различием, что расположены в разных классах.

Ответ на вопрос, почему обращение к объектам осуществляется по имени или идентификатору, а не через глобальную переменную, прост: потому что для хранения компонентов предназначена главная карта (Map) sFF, имеющая название ACM (Application Component Map) и находящаяся по адресу $_GAOS().Component.Comp или $_GC() (что соответствует концепции sFF), а вовсе не глобальный объект Window.

Ответ на вопрос, почему такой странный доступ к объектам через $ и функции, скажем, что можно и от Window путь провести, но он будет ещё более странным, а про $ и функции - сравните, например, с jQuery. Переменные и пользовательские функции таковы потому, что они тоже расположены в картах (Map), как и всё в sFF.

Last updated