= 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. [[Image(htdocs:wf/images/mvc.png)]] == 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; * [http://smarty.php.net/ Site do projeto 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 [wiki:WF/PHPDoc 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.