Encapsulamento

Tem algum artigo sobre louds?

]['s

fabgp2001, que tal o blog dele, de onde li sobre isso? :slight_smile:

http://fishbowl.pastiche.org/2004/04/04/cut_with_the_grain

E o que fazer com a coleção heterogênea de objetos? Se eles não implementarem ao menos uma interface em comum, o máximo de informação que podem dar é um toString()? Tem alguma mágica de reflexão?

QUANTO A TRANSAÇÕES… sei que é uma discução um tanto quanto antiga, mas achei o assunto legal e gostaria de compartilhar uma solução…

public ActionForward gravar(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    DynaActionForm atividadeForm = (DynaActionForm)form;
    Atividade      atividade     = null;
    
    SystemUserSession   systemUserSession   = new SystemUserSession(request);
    BusinessTransaction businessTransaction = getBusinessTransactionFactory().createNewBusinessTransaction((SystemUser)systemUserSession.getModel());
    
    try {
        businessTransaction.start();

        AtividadeBusiness atividadeBusiness = new AtividadeBusiness(businessTransaction);
        
        atividade = (Atividade)atividadeBusiness.newEntityInstance(
                ((Long)atividadeForm.get("idAtividade")).longValue()
        );
        BeanUtils.copyProperties(atividade, atividadeForm);

        try {
            businessTransaction.beginTransactionalBlock();

            atividadeBusiness.save(atividade);
            
            businessTransaction.commitTransactionalBlock();
        } catch (BusinessTransactionException bte) {
            businessTransaction.rollbackTransactionalBlock();

            setAlertMessage(request, be.getMessage());
        }           
    } finally {
        businessTransaction.finish();
    }
    
    atividadeForm.initialize(mapping);
    
    return mapping.findForward("_FormAtividade");        
}

Nessa solução que implementei na arquitetura que desenvolvi para fabrica de software que trabalho, criei uma classe responsavel por controlar o escopo (start/finish) e as ações (begin/commit/rollback) das trasações de negócio do sistema.

O fluxo é o seguinte…

  1. start() - cria uma sessão SessionFactory.
  2. Vários business-objects podem ser instanciados passando a instância “startada” de businessTransaction e manipulados.
  3. beginTransactionalBlock() - inicia uma transação do Hibernate (session.beginTransaction()).
    (save/remove/get/anyMethod).
  4. businessTransaction.commitTransactionalBlock() ou businessTransaction.rollbackTransactionalBlock() - comita ou descarta a trasação do Hibernate.
  5. businessTransaction.finish() - encerra a sessão do Hibernate.

Obviamente que existem outras classes e interfaces envolvidas na parada, mas o conceito é esse.

Da maneira como estruturei essa arquitetura, fica bastante fácil se amanhã ou depois eu não quiser mais utilizar o Hibernate e passar a usar um outro mecanismo de persistencia, porque toda a estrutura está baseada em interfaces.

Bom espero que ajude… espliquei bem por cima, como disse, tem várias classes e interfaces envolvidas, mas acho que deu para enternder o conceito, né?

Sei que ainda tem várias coisas para serem melhoradas e estou trabalhando todos os dias para fazer isso… :smiley: …sugestões são bem vindas…

Abraço!

[quote=AllMighty]E o que fazer com a coleção heterogênea de objetos? Se eles não implementarem ao menos uma interface em comum, o máximo de informação que podem dar é um toString()? Tem alguma mágica de reflexão?

[/quote]

No meu caso eu tinha 1 factory de helpers que providenciavam a view e outras colaborações.

qual o jeito certo d fazer DAOs :? ?

[quote=cv]O ActiveRecord (do Ruby On Rails, nao o Pattern) faz algo mais ou menos assim (traduzindo pra Java, e eu nao sei se acertei na sintaxe um-ponto-cincozenta):

[code]
public class Base {

public static T find(int id) { … }
public static Collection find_by_example(T example) { … }
public static Collection find_by_…

public T save() { … }
}[/code]
[/quote]

Em java num da pra usar generics em metodos Static! :frowning:

Eu também já fiquei um pouco confuso com a questão dos objetos getters e setters. O que mais vejo são os programadores colocando os atributos como private e depois criando métodos set e get. A idéia do encapsulamento não seria esconder dos outros objetos, a forma como foi escolhida para representar um dado.

Por exemplo, se eu tenho uma classe chamada Turma que usa um ArrayList ou uma Hashtable para guardar os alunos:

private ArrayList alunos;

e criar um método getAlunos que retorna esse ArrayList, não seria a mesma coisa que deixar o atributo alunos como público?