Fundamentos do Sencha Touch: Classes e Estrutura de Aplicações

Ao mergulhar no ecossistema Sencha Touch, muitos desenvolvedores ficam impressionados com a vasta gama de componentes disponíveis. Embora estes facilitem a criação de interfaces ricas, a verdadeira força e flexibilidade do framework residem em seu robusto sistema de classes. É essa arquitetura orientada a objetos que permite o desenvolvimento de aplicações escaláveis e bem organizadas, servindo como a espinha dorsal para todos os componentes, plugins e APIs.

O Sistema de Classes do Sencha Touch

O Sencha Touch adota um sistema de classes próprio que facilita a construção de aplicações JavaScript de forma organizada e modular. Inspirado em conceitos de linguagens orientadas a objetos, ele oferece mecanismos para definição de classes, herança e gerenciamento de dependências.

A documentação oficial do Sencha fornece um guia detalhado sobre o sistema de classes e o greenciador de classes (Ext.ClassManager).

Para definir uma nova classe, utiliza-se o método Ext.define(), que aceita o nome da classe e um objeto de configuração com suas propriedades e métodos:

Ext.define('EntidadeBase', {
    // Propriedade inicial
    identificador: 'Desconhecido',

    // Construtor da classe: método executado ao instanciar
    constructor: function(id) {
        if (id) {
            this.identificador = id;
        }
        return this; // Permite encadeamento de chamadas de métodos
    },

    // Método para descrever uma ação
    realizarAcao: function(descricaoAcao) {
        console.log(`A entidade '${this.identificador}' está realizando: ${descricaoAcao}`);
        return this;
    }
});

A criação de uma instância de classe pode ser feita de algumas maneiras, sendo a mais comum em Sencha Touch o uso de Ext.create(), embora a sintaxe new também funcione:

var minhaEntidade = Ext.create('EntidadeBase', 'Objeto 1');
// ou
var outraEntidade = new EntidadeBase('Objeto 2');

É crucial lembrar de instanciar as classes quando necessário. O Sencha Touch, no entanto, oferece recursos para o carregamento e instanciação automática de classes essenciais, especialmente em configurações de aplicação, através das propriedades requires, views, models e stores:

requires: [
    'Ext.MessageBox',
    'Ext.data.proxy.JsonP',
    'Ext.dataview.List'
],
views: [
    'Main', // Carrega 'app/view/Main.js'
    'MinhaApp.view.Informacoes' // Carrega 'app/view/Informacoes.js'
],
models:[
    'MinhaApp.model.DadosItem'
],
stores:[
    'MinhaApp.store.ListaDados'
]

A herança é um pilar do desenvolvimento orientado a objetos. Em Sencha Touch, uma classe pode estender outra utilizando a propriedade extend. Isso permite a reutilização de código e a criação de hierarquias de classes.

Ext.define('Programador', {
    extend: 'EntidadeBase', // Estende a nossa classe base
    
    // Propriedade específica para a classe Programador
    ehExpert: false,

    // Construtor com parâmetro adicional e chamada ao construtor pai
    constructor: function(id, expertStatus) {
        this.ehExpert = expertStatus;
        // Chama o construtor da classe pai (EntidadeBase)
        this.callParent([id]); 
        return this;
    },

    // Método para simular uma atividade específica
    codificar: function(linguagem) {
        console.log(`O programador ${this.identificador} está codificando em: ${linguagem}`);
        // Utiliza um método da classe pai
        this.realizarAcao("depurar código");
        return this;
    }
});

Estrutura Básica de um Projeto Sencha Touch

A organização de um projeto Sencha Touch segue uma estrutura padrão que facilita o desenvolvimento e a manutenção. A ferramenta Sencha Cmd é fundamental para gerar essa estrutura automaticamente. Mais detalhes podem ser encontrados no guia de aplicações Sencha Cmd.

O arquivo app.js é o ponto de entrada principal de qualquer aplicação Sencha Touch. Ele configura o carregador de classes, define as dependências e inicializa a aplicação:

Ext.Loader.setPath({
    'Ext': 'touch/src', // Caminho para a biblioteca Sencha Touch SDK
    'MinhaApp': 'app' // Caminho base para os arquivos da sua aplicação
});

Ext.application({
    name: 'MinhaApp', // Nome da aplicação

    // Classes que a aplicação necessita para iniciar
    requires: [
        'Ext.MessageBox',
        'Ext.data.proxy.Ajax', // Exemplo de proxy de dados
        'Ext.navigation.View'  // Exemplo de componente de navegação
    ],

    // Definição das visualizações (views) da aplicação
    views: [
        'Principal', // View principal, geralmente localizada em app/view/Principal.js
        'MinhaApp.view.DetalhesItem' // Exemplo de view aninhada
    ],
    // Modelos de dados utilizados pela aplicação
    models: [
        'MinhaApp.model.Usuario' // Exemplo de modelo, em app/model/Usuario.js
    ],
    // Stores para gerenciamento de dados
    stores: [
        'MinhaApp.store.Usuarios' // Exemplo de store, em app/store/Usuarios.js
    ],

    // Configurações de ícones e telas de inicialização para dispositivos móveis
    icon: {
        '57': 'resources/icons/Icon.png',
        '72': 'resources/icons/Icon~ipad.png',
        '114': 'resources/icons/Icon@2x.png',
        '144': 'resources/icons/Icon~ipad@2x.png'
    },
    isIconPrecomposed: true,
    startupImage: {
        '320x460': 'resources/startup/320x460.jpg',
        '640x920': 'resources/startup/640x920.png',
        '768x1004': 'resources/startup/768x1004.png',
        '748x1024': 'resources/startup/748x1024.png',
        '1536x2008': 'resources/startup/1536x2008.png',
        '1496x2048': 'resources/startup/1496x2048.png'
    },

    // Método executado após o carregamento de todas as dependências da aplicação
    launch: function() {
        // Remove o indicador de carregamento inicial da página
        Ext.get('appLoadingIndicator').destroy();

        // Cria e adiciona a view principal ao Viewport do Sencha Touch
        let mainView = Ext.create('MinhaApp.view.Principal');
        Ext.Viewport.add(mainView);
    },

    // Função para lidar com atualizações da aplicação (PWA-like)
    onUpdated: function() {
        Ext.Msg.confirm(
            "Atualização da Aplicação",
            "Esta aplicação foi atualizada para a versão mais recente. Deseja recarregar agora?",
            function(buttonId) {
                if (buttonId === 'yes') {
                    window.location.reload();
                }
            }
        );
    }
});

Tags: Sencha Touch ExtJS javascript Mobile Development Class System

Publicado em 11-1 12:19