wiki:WF/ArquiteturadeDesenvolvimento

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.

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;

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

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.

Attachments