Version 4 (modified by viani, 16 years ago) (diff) |
---|
Arquitetura de Desenvolvimento
WikiInclude(WF/tableofcontents)?
O desenvolvimento de processos de Workflow utiliza a arquitetura MVC, já consagrada entre desenvolvedores, que organiza o código em camadas. Cada camada irá limitar-se exclusivamente àquilo que se propõe a fazer, mantendo tudo em seu contexto a fim de tornar transparente a localização de cada parte do código.
Visão geral
- O padrão de desenvolvimento MVC do módulo de workflow organiza-se em três níveis:
- módulo: Age em todos os processos desenvolvidos sob o padrão MVC no módulo de workflow.
- processo: Estende o nível de módulo. Age somente sobre as atividades dos processos.
- atividade: Estende os níveis anteriores. Recebe e responde as requisições do usuário final dos processos.
Camada View
Conceitos:
- É toda a interface do sistema, podendo ser tanto para pessoas quanto para outros programas (API). Exemplificando, um sistema pode ter uma interface web e outra web-service em XML. Essa camada deve saber apenas como apresentar os dados gerados pelo sistema;
- Manipulada diretamente apenas pela camada Control, como um de seus atributos;
- Não deve fazer restrições de segurança ou validação de dados, que são funções da camada Model;
- Apresenta interface para interação (entrada de dados) com o usuário;
- Formata e exibe dados vindos da camada Model.
Estrutura:
- Representada por templates Smarty;
Camada de lógica de negócios (Model)
Conceitos:
- A camada Model define o que o processo vai fazer e como implementá-lo, ou seja, as regras de negócio do sistema;
- Possibilita o desenvolvimento de recursos, independentemente da forma como os dados serão exibidos (interface) e do momento em que serão executados (fluxo). Essa camada deve saber somente como executar cada recurso do sistema.
Estrutura:
- Nível de módulo:
- Representado pela classe BaseModel;
- Contém um atributo para armazenamento de instância da classe Instance (!BaseModel::instance);
- Contém um atributo para armazenamento de instância da classe Activity (!BaseModel::activity);
- Contém um atributo para armazenamento de instância da classe Wf_Db (!BaseModel::DAO);
- Contém um atributo para armazenamento de comandos SQL (!BaseModel::commandText);
- Contém um atributo para armazenamento de resultados de consultas SQL (!BaseModel::resultSet);
- Contém um atributo para armazenamento de registros individuais das consultas SQL (!BaseModel::resultRow);
- Contém um atributo para armazenamento do array $_REQUEST (!BaseModel::request);
- Contém um atributo para armazenamento de informações sobre o ambiente workflow (!BaseModel::workflow);
- Contém um atributo para armazenamento de dados a serem lidos pelo Controller e exibidos na View (!BaseModel::viewData);
- Contém atributos para armazenamento de instâncias de classes de negócio (como paginação);
- Contém métodos para recuperar e alterar variáveis do ambiente workflow;
- Contém métodos de sincronização entre as informações contidas na classe Instance e nos atributos;
- Contém método construtor da camada Model (pode ser estendido no nível de processo).
- Nível de processo:
- Representado pela classe Model;
- Contém as informações, representadas na forma de atributos, comuns a todo o processo;
- Propaga as informações pelas atividades através da sincronização de seus atributos com a classe Instance do módulo de workflow;
- Nível de atividade:
- Representado pela classe NomeAtividadeModel;
- Contém métodos que implementam cada uma das ações solicitadas pelo usuário e encaminhada pelo Controller;
- Comunica-se com a camada de controle através de seus métodos que retornam booleanos indicando sucesso ou falha na requisição feita pelo usuário.
Camada de controle (Control)
Conceitos:
- Faz o gerenciamento entre o usuário, as Views (interfaces) e o Model (funções do sistema);
- Essa camada deve saber apenas quais são as funções do sistema e não como implementá-las;
- Recebe solicitações de serviços vindas do usuário, chama a implementação do Model correspondente e com base na resposta, encaminha uma interface (View) adequada de volta ao usuário;
- Manipula classe Smarty (ou subclasses dela) para geração da camada de apresentação, que contém formatação de dados;
- Gerencia códigos de erro de acordo com o mapeamento nos arquivos de configuração Smarty.
Estrutura:
- Nível de módulo:
- Representado pela classe BaseController;
- Contém um atributo para armazenamento de instância da camada View (!BaseController::view);
- Contém um atributo para controlar qual template (interface) será exibido (!BaseController::templateFile);
- Contém um atributo para armazenamento de instância Model de atividade (!BaseController::Model);
- Contém método que recupera os dados produzidos pela camada Model e os envia para a camada View (arquivos tpl, pdf, xml, etc) exibí-los e formatá-los (!BaseController::loadViewVars());
- Contém método que cancela a execução da requisição atual (!BaseController::cancelar());
- Contém método que executa a ação inicial/padrão de cada atividade, opcional ser vazio e opcional ser sobrescrito (!BaseController::default());
- Contém método abstrato (deve ser sobrescrito) que executa as atividades (!BaseController::run($action));
- Contém construtor da camada Controller, recebendo como argumento instância Model de atividade.
- Nível de processo:
- Representado pela classe Controller;
- Contém atributos que mapeiam arquivos de templates utilizados.
- Nível de atividade:
- Representado pela classe NomeAtividadeController;
- Gerencia comunicação entre a atividade (sistema) e o usuário;
- Contém método homônimo para cada uma das ações da atividade;
- Contém implementação para método herdado run ($action);
- Contém, quando necessário, implementação para método herdado default ().
Arquivo de configuração do processo (shared.php)
- Responsável por fazer a união das três camadas e possibilitar o mecanismo de extensão das classes base de cada camada. Todos os includes do processo são feitos nesse arquivo;
- Um arquivo de configuração ini (incluído no arquivo shared.php) por processo relacionando as tabelas e campos utilizados com constantes, facilitando a manutenção quando for necessário alterar o nome dos objetos, de forma que a alteração seja feita em um único ponto;
- Definição de constantes do processo.
Organização de arquivos
- Uma classe por arquivo .php;
- Includes somente no arquivo shared.php.
Nomenclatura
- Atividades:
- Verbos em português (passar idéia de ação, atividade, comportamento), com a primeira letra maiúscula. Exemplo: Compor, Escrever, Finalizar.
- Arquivos:
- De atividades: mesmo nome das atividades, adicionando a extensão .php. Exemplo: Compor.php, Escrever.php, Finalizar.php;
- De templates: mesmo nome das atividades e respectivas ações, adicionando a extensão .tpl. Exemplo: Compor.tpl, Imprimir.tpl, Visualizar.tpl;
- De classes: segue o formato class.nomeclasse.nomesuperclasse.inc.php.
- Classes:
- Iniciais com letras maiúsculas. Ex: Classe, NomeClasse;
- Subclasses Model seguem o formato [NomeAtividade]Model;
- Subclasses Controller seguem o formato [NomeAtividade]Controller.
- Métodos:
- Letras minúsculas, caso haja mais de uma palavra, a segunda inicia com letra maiúscula. Ex: metodo, meuMetodo;
- Métodos de subclasses Model seguem o formato [NomeAção]Action;
- Métodos de subclasses Controller têm o mesmo nome das ações das atividades.
Documentação dos processos
- Utilização do sistema PHPDocumentor?
Práticas
- No comentário de elementos como classes ou funções, evitar repetir a classe do elemento na descrição. Por exemplo, no comentário de uma função, evitar incluir a palavra "função".
- Classes com métodos contendo argumentos String esperando valores pré-definidos devem declarar atributos internos escritos em maiúscula para funcionarem como constantes com os valores válidos, visando minimizar erros de digitação do argumento e aproveitar o autocomplete dos editores para membros de classe;
- Deve-se seguir esta sequência de definições em uma classe:
- Declaração de constantes;
- Declaração de atributos;
- Declaração de construtores;
- Declaração de métodos.