Ajuda Com Padrões Arqueitetura de aplicações empresariais - Martin Fowler

Boa Tarde a todos,

Como eu disse, no assunto do tópico, estou com pequenos problemas para entender alguns padrões desse maravilhoso livro, mais especificamente o padrão: Row Data Gateway(Portao linha dados), eu entendo que a intenção do padrão é isolar toda a parte de 

sql em uma classe, e que essa classe corresponde a um registro do banco, mas, o código que ele demonstra no livro ta meio "esquisito " ou eu to dando algum nó cego(oque é bem mais provável):

segue o código:

Primeiramente essa classe com alguns setters and getters.

public class PersonGateway {
    
    private String lastName;
    private String firstName;
    private int numberOfDependents;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public int getNumberOfDependents() {
        return numberOfDependents;
    }

    public void setNumberOfDependents(int numberOfDependents) {
        this.numberOfDependents = numberOfDependents;
    }

depois nessa mesma classe ele adiciona dois métodos:


private static final String updateStatementString = 
            "UPDATE people "+
            " set lastname = ?, firstname = ?,number_of_dependents = ? " +
            " where id = ?";
    
    public void update(){
        PreparedStatement updateStatement = null;
        
        try{
            updateStatement = DB.prepare(updateStatementString);
            updateStatement.setString(1, "lastName");
            updateStatement.setString(2, "firstName");
            updateStatement.setInt(3, numberOfDependents);
            updateStatement.setInt(4, getID.intValue());
            updateStatement.execute();
        }catch(Exception e){
            throw new ApplicationException(e.getMessage());
        }finally{
            DB.cleanUp(updateStatement);
        }
    }
   private static final String insertStatementString = 
                            "insert into people VALUES (?,?,?,?)";
   public Long insert(){
       PreparedStatement insertStatement = null;
       try{
           insertStatement = DB.prepare(insertStatement);
           setID(findNextDatbaseId());
           insertStatement.setInt(1,getID.intValue());
           insertStatement.setString(2,lastName);
           insertStatement.setString(3,firstName);
           insertStatement.setInt(4, numberOfDependents);
           insertStatement.execute();
           Registry.addPerson(this);
           return getID();
       }catch (SQLException e){
           throw new ApplicationException(e);
       }finally {
           DB.cleanUp(insertStatement);
       }
   }

bem, minhas duvidas:

O lançamento de uma nova exceção, de acordo com a descrição no NetBeans, é composta por dois parametros no construtor(String, inputStream).

Sera que alguem pode me explicar o que eu to fazendo errado ?

Não seria o caso de fazer um “e.getMessage()”, como está no método “update()”???

Essa exceção não faz parte da API padrão. Provavelmente ele está aqui representando uma classe de exceção que pertence à própria aplicação.

O que deve ter acontecido é que a sua IDE achou uma classe que por acaso tem o nome de ApplicationException (deve fazer parte da implementação de algum framework ou servidor).
Dá uma olhadinha no import da ApplicationException para ter certeza.

Essa exceção não faz parte da API padrão. Provavelmente ele está aqui representando uma classe de exceção que pertence à própria aplicação.

O que deve ter acontecido é que a sua IDE achou uma classe que por acaso tem o nome de ApplicationException (deve fazer parte da implementação de algum framework ou servidor).
Dá uma olhadinha no import da ApplicationException para ter certeza.

Pelo que lí (e entendi) no passado, Martin Fowler usa o termo/padrão Gateway para isolar APIs (seja de persistência, messaging, e-mail, …)

Abraço. t+
Paz

Gustavo e Gomesrod, Muito Obrigado Pelas Respostas!!!

Eu também entendi exatamente isso.

Pois é, foi isso que eu achei estranho, mas, ele não mostra as importações dos códigos que estão no livro dele, então, eu não sei à qual pacote essa classe pertence, procurei no google e encontrei outros pacotes, mas, nao atende as especificações do código dele.

esse “e.getMessage()” foi eu que adicionei, mas, alem disso ele pede também um inputStream. E eu tentei passar um novo inputStream como parâmetro.

vocês possuem mais alguma outra ideia ?

[quote=Asphael][quote]

       throw new ApplicationException(e)  

Essa exceção não faz parte da API padrão. Provavelmente ele está aqui representando uma classe de exceção que pertence à própria aplicação.

O que deve ter acontecido é que a sua IDE achou uma classe que por acaso tem o nome de ApplicationException (deve fazer parte da implementação de algum framework ou servidor).
Dá uma olhadinha no import da ApplicationException para ter certeza.
[/quote]

Pois é, foi isso que eu achei estranho, mas, ele não mostra as importações dos códigos que estão no livro dele, então, eu não sei à qual pacote essa classe pertence, procurei no google e encontrei outros pacotes, mas, nao atende as especificações do código dele.
[/quote]

Olhe o import que está na sua classe. A idéia é comprovar que essa ApplicationException que a IDE importou não tem nada a ver, é apenas uma classe que faz parte da implementação de algum framework ou ferramenta.
Possivelmente é essa aqui: org.omg.CORBA.portable.ApplicationException - (Descrição: This class is used for reporting application level exceptions between ORBs and stubs.).
Essa definitivamente não é a exceção que o código do livro está lançando, portanto a solução correta não é ficar procurando maneiras de forçar a criação de um InputStream, o que deve fazer é esquecer essa classe!

Basta acompanhar o raciocínio do código do livro. Nesse ponto ele está lançando uma classe de exceção pertencente à própria aplicação, então o que você deve fazer é a mesma coisa! O seu projeto possui uma classe de exceção para erros em geral? Se sim, utilize-a. Se não, crie uma. Se o código é só para estudo e você não quer criar uma classe de exceção, use RuntimeException que vai conseguir o mesmo efeito.

Confesso que quando lí o PoEAA, não achei a linguagem do Fowler tão simples não. Pois ele apresenta várias idéias, e não dá pra conectar mto as coisas, a princípio. Após várias leituras, aí sim se começa a entender.
(aconteceu isso tbém com o Analysis Pattern – aliás, continua sem entender mta coisa deste livro. Mas o UML Distilled e o Domain-Specific Languagem, já desce melhor. Vamos ver o NoSQL. – todos livros do Fowler.)

E acabei de ter uma dúvida, mas já consultei no livro. Qual seria a diferença entre Gateway de Linha de Dados e o ActiveRecord. Caso a classe tenha alguma business rule, então é considerada ActiveRecord. Em resumo.