Duvidas sobre OO

Andei lendo sobre OO aqui no GUJ, especificamente a area “Patterns, …” e um tópico em especial: “Então vc gostaria de discutir OO?”. Algumas dúvidas me surgiram:

-> como são denomindados objetos simples, sem comportamento? Isso “fere” OOP, mas de vez em nunca existem objetos apenas com atributos,pelo menos no momento atual do sistema, que mais tarde podem vir a ter comportamentos.

-> Alguns usuários se reuniram e fizeram um motim :smiley: contra set e get , e afirmam que os estado interno de um objeto não deveria ser acessado. Como lidar com esta caracteristica do objeto? Digo: se tenho uma propriedade A util e descritiva o suficiente para que ela seja utilizada, por que não acessa-la?

->Um usuário chamado Lipe, em um de seus posts escreveu que: “conheço 4 pessoas que programam OO, o resto, me incluindo no resto, programa pseudo OO”. Realmente já li em inumeros lugares que código OO bem sucedido (da forma correta) é uma especie rara. Onde posso ler, ver, estudar, tentar assimilar um bom código OO ?

->Muito do que o usuário Philip Shoes (pcalcado) diz é: existem pessoas utilizando objetos para os dados e objetos para a logica, isto é errado. Concordo plenamente, logica e dados andam juntos,sempre. O objeto é auto contido. Onde posso arrumar exemplos sobre o código ruim tão citado pelo Philip Shoes?

->Onde posso colocar minhas duvidas sobre OO?

Se e somente se eu postei no local indevido: desculpas! Não programo Java então decidi colocar aqui mesmo…

[quote=faq]
-> como são denomindados objetos simples, sem comportamento? Isso “fere” OOP, mas de vez em nunca existem objetos apenas com atributos,pelo menos no momento atual do sistema, que mais tarde podem vir a ter comportamentos.[/quote]

Eles não deveriam existir. Eu já vi gente(creio que o Phillip) chamando de objetos burros.

[quote=faq]
-> Alguns usuários se reuniram e fizeram um motim :smiley: contra set e get , e afirmam que os estado interno de um objeto não deveria ser acessado. Como lidar com esta caracteristica do objeto? Digo: se tenho uma propriedade A util e descritiva o suficiente para que ela seja utilizada, por que não acessa-la?[/quote]
Não é que ela não deva ser acessada, mas um objeto não pode e não deve conhecer a implementação interna de outro objeto, o meio de acesso deve ser feito pela interface deste objeto, onde o responsável pela ação é quem detém a informação, ou seja, ao invés de você ter um determinado atributo e set/gets pra ele, você tem um atributo e um método que realizará alguma operação com o atributo, retornando a informação necessária.

[quote=faq]
->Um usuário chamado Lipe, em um de seus posts escreveu que: “conheço 4 pessoas que programam OO, o resto, me incluindo no resto, programa pseudo OO”. Realmente já li em inumeros lugares que código OO bem sucedido (da forma correta) é uma especie rara. Onde posso ler, ver, estudar, tentar assimilar um bom código OO ?[/quote]
Dá uma pesquisada por algumas sugestões de livros aqui no fórum

[quote=faq]
->Muito do que o usuário Philip Shoes (pcalcado) diz é: existem pessoas utilizando objetos para os dados e objetos para a logica, isto é errado. Concordo plenamente, logica e dados andam juntos,sempre. O objeto é auto contido. Onde posso arrumar exemplos sobre o código ruim tão citado pelo Philip Shoes?[/quote]
Se quiser te mando os fontes daqui do trampo e você vai ver o que é um exemplo de código ruim…:mrgreen:

[quote=faq]
->Onde posso colocar minhas duvidas sobre OO?[/quote]
Tem um fórum aqui mesmo no GUJ que trata especificamente de Padrões, Arquiteturas e Projetos(que aliás é esse o nome do fórum

[quote=faq]
Se e somente se eu postei no local indevido: desculpas! Não programo Java então decidi colocar aqui mesmo… [/quote]
Tudo bem, mas que não se repita!!! :mrgreen: :mrgreen:

Olá,

Isso é encorajado em ambientes (emrpesas, tecnologias, faculdades, sites, livros…) que pregam análise de negócio misturada a análise de sistema.

Se você seguir uma metodologia em cascata (waterfall), onde primeiro se analisa muuuuito, depois se projeta muuuuuuuito, depois se (na teoria) codifica o especificado, geralmene a sugestão é começar com atributos e relacionamentos, depois acrescentar comportamento.

Eu discordo disso, porque para mim não é diferente de começar com um modelo relacional e depois pensar nas “funções”. Não que seja ruim, horrível ou sacrilégio, mas não acho que seja assim que se utilizam objetos de verdade.

Objetos apenas com atributos são comuns em front-end para bancos de dados. Este tipo de sistema acaba sendo mais complexo com OOP, eur ecomendo para este tipo simples de aplicação uma linguagem mais leve, menos OO ou mesmo as ferramentas do banco de dados, só cuidado com a evolução do sistema.

Faça assim: crie sua “classe de dados” e se pergunte: quem manipula esses dados?

Será que quem manipula os dados não sabe demais sobre a estrutura interna da classe? Será que realmente esta responsabilidade é dessa outra classe? E meu acoplamento, se eu mudar a “classe de dados”, mudar o nome de seus atributos ou outro detalhe bem específico… o quanto isso altera minhas outras classes?

:smiley:

Eu não tenho absolutamente nada contra get ou set, eu tenho apenas uma dúvida, qual a diferença prática entre um pseudo-JavaBean cheio de get e set e uma struct/register em uma linguagem procedural?

Se OOP age da mesma forma que ProgramaçãoProcedural, por que são paradigmas diferentes?

Se você tem um atributo (algumas vezes chamado também de dimensão) que interessa a uma outra classe, por exemplo para exibir seu valor na tela, é válido sim expôr este, só cuidado para os clientes de uma classe não conhecerem demais sobre como a classe funciona por dentro.

Recomendo os livros mais clássicos.

Coloquei uma vez uma lsita aqui e devo colcoar algo no meu blog em breve sobre isso.

Em todo lugar. Não vou citar A nem B, me soa antiético, mas basta você dar uma olhada em qualquer sisteminha que, em java, use Struts ou Servlets (neste caso não é culpa das ferramentas, muitas vezes quem usa estes dois está apenas seguindo a onda" e não possui muito conhecimento técnico, claro que isso não é uma afirmação, muita gente faz coisas legais com servlets e até com Struts, com algum esforço :smiley: ). Também tem muito exemplo de código aqui no GUJ, faz uma busca por “mvc”, “procedural” ou “responsabilidades”, geralmente tópicos com estas palavras resultam em discussões e exemplos.

Como o rafael respondeu, aqui.

Eu movi para você :wink:

Há controvérsias hehe se ActiveRecord é tão bonito, por que “ActiveWidget” não? :smiley:

[quote=LIPE]
Há controvérsias hehe se ActiveRecord é tão bonito, por que “ActiveWidget” não? :D[/quote]

E quem disse que AR é bonito? Eu não fui :stuck_out_tongue: É uma gambiarra interessante.

Note que uma coisa é AR, onde o objeto se persiste, e outra coisa (Observer) é um objeto que avisa alguém que seu estado mudou.

Assim como um AR mistura regra de negócio com persistência um AW (?) msituraria com apresentação. Claro que você pdoe usar AOP ou decorators para aliviar isso.

hehe quando persistência entra em cena o “menos-pior” é o bonito :XD:

E sua sugestão é ótima :smiley:
Antes isso
container.add( ( JComponent ) pessoa.drawYourself() );
a
field.setText( pessoa.getEndereco().getCEP() );

Mas na verdade, eu neme stava falando em representações, mas simplesmente uma aplicação sem um domínio, sem regras de negócio, não precisa da complexidade adicional de objetos.

Colocando objetos na frente ou não, tudo que você vai fazer é tirar e colocar de tabelas, com um mínimo mínimo mínimo mínimo de processamento…pra que se estressar? Oracle Forms, Rails ou PHP nele :stuck_out_tongue:

Só cuidado sempre para não achar que todas as aplicações são front-end de banco de dados. Se você tem regras de negócio, o papo é outro.

Concordo totalmente. Isso também é reforçado (mesmo que de outra maneira) pelo Rod Johnson no link que postei no fórum de Novidades.

Irei utilizar alguns quotes abreviados, para economizar espaço e leitura. Eles possuem a função de ajudar a localizar determinadas ideias e assim constextualizar o leitor.

Primeiro: sobre objetos burros:

[quote] Isso é encorajado em ambientes (emrpesas, tecnologias, faculdades, sites, livros…) que pregam análise de negócio misturada a análise de sistema.[/quote] e segue …

Recebi exatamente a reposta que esperava. Philip, poderia detalhar um pouco a parte "objetos de verdade "? Digo isto pois hoje me deparo com uma situação desse tipo, uma aplicação bota e tira no DB, que irá crescer. Hoje alguns objetos não possuem comportamento algum, são apenas set/get e persistencia, porem eles podem e irão(não todos) vir a ter comportamentos.

segunda: sobre set/get:

[quote]qual a diferença prática entre um pseudo-JavaBean cheio de get e set e uma struct/register em uma linguagem procedural? [/quote] e segue…

Que tal nenhuma? Esta questão nos leva rumo a primeira, objetos sem comportamento não são objetos. O que, pelo amor dos Deuses Hiborianos, devo fazer com objetos que por definição não possuem comportamento?

terceiro: sobre o OO do bem:

Eu li esse forum de arquiteturas de ponta a ponta, inclusive esse topico sobre Delphi e Java. Visitei os links dos livros um a um. Obrigado pela paciencia de re-re-re-re-re-informar sobre os livros, afinal eles se encontram em topico pemanente “então vc queria discutir OO”.

quarto (e talvez o mais importante): o OO do mal (maligno mesmo):

Me comprometo a não denegrir sua imagem, nem a da sua empresa :mrgreen: . Poderia mesmo me mostrar alguns exemplos bons e ruins? De preferencia algo “ruim na média”, coisa comum de se ver, o mesmo para o OO do bem.

Não sei se vocês perceberam mas a minha pratica tá saindo do zero agora. Pra piorar trabalho com php e python, linguagens boas, mas com quase zero de OO do bem.
Exemplo: um cara me faz um sisteminha de gerenciamento de projetos, coisa simples. olhando a estrutura do programa me deparo com o um form (html) que é “iniciado” no template(view) e tem os seus campos (text,submit, checkbox, select …) gerados na action, que por sua vez é um mega if alternando o pedido http, moral da estoria: ninguem pode aproveitar nada do que tava escrito! Até os camarada do dreamWeaver ficaram meio “de pé atras” com o uso do sistema.
Olha que isso foi uma coisa relativamente bem feita, em php o normal mesmo é pegar html,banco,logica, misturar tudo bem misturadinho, embalar em uma ou duas funções e botar pra rodar no apache! :mrgreen:

Pessoalmente eu faço o seguinte: Pego a descrição do problema, sento junto com meu parceiro (somos apenas 2 na parte de php) e marcamos alguns pontos, no papel mesmo. Eu tento sempre visualizar a coisa toda como um monte de gnomo trabalhando. Normalmente nos grifamos os verbos e partir deste criamos objetos, exemplo: “… postar, …” eu marco o “postar” e logo depois anoto: conteudo é postado, um usuario esta relacionado a isto e seu nome (get :mrgreen: ) será o autor do conteudo.
Algo errado? Recomendações?Evoluir lendo o que? Isso é uma metodologia? Isto é assinar sentença de morte?

[quote]Mas na verdade, eu neme stava falando em representações, mas simplesmente uma aplicação sem um domínio, sem regras de negócio, não precisa da complexidade adicional de objetos.

Colocando objetos na frente ou não, tudo que você vai fazer é tirar e colocar de tabelas, com um mínimo mínimo mínimo mínimo de processamento…pra que se estressar? Oracle Forms, Rails ou PHP nele

Só cuidado sempre para não achar que todas as aplicações são front-end de banco de dados. Se você tem regras de negócio, o papo é outro[/quote]
Muito esclarecedor (de novo…).

ActiveRecord seria uma pattern pra bota e tira no banco ligado a uma logica pobre ?
Onde exite um catalogo com estas pattern mirabolantes que vocês tanto falam?

Sites: me passem o bookmark de vocês!

O GUJ é simplesmete o lugar com a maior densidade de insteressados e estudios! Por isso Java tem a toda essa boa fama no Brasil.

Active Record pode ser encontra aqui: http://www.martinfowler.com/eaaCatalog/activeRecord.html

[quote=Shoes] Se você seguir uma metodologia em cascata (waterfall), onde primeiro se analisa muuuuito, depois se projeta muuuuuuuito, depois se (na teoria) codifica o especificado, geralmene a sugestão é começar com atributos e relacionamentos, depois acrescentar comportamento.

Eu discordo disso, porque para mim não é diferente de começar com um modelo relacional e depois pensar nas “funções”. Não que seja ruim, horrível ou sacrilégio, mas não acho que seja assim que se utilizam objetos de verdade. [/quote]

Bom, quanto a esta colocação eu fico em cima do muro!
Quando eu modelo um projeto, eu penso primeiro no relacionamento entre os objetos e seus relacionamentos, tudo isso em um papel de pão mesmo!

No entanto, quando começo a escrever os testes unitários eu começo a dar mais forma, vigor e vitalidade para meus objetos. Eu escrevo o teste do jeito que eu gostaria de brincar e manipular meus objetos de negócio, e ai eu vou lá no objeto de negócio e adiciono as pendências necessárias!

De certa forma, eu acho que dependendo de como a pessoa conduz o desenvolvimento, ainda é possível ter objetos bém modelados mesmo que o projeto inicial comece apenas com atributos e relacionamento entre os objetos.

Por acaso eu estou viajando? Seguindo esta idéia ainda há a possibilidade de se conseguir criar um péssimo exemplo de projeto OO!!???

Abraços!
Thiago Senna

Quer um exemplo simples?

procedural:

class Person {
    int age;
    public int getAge() { return age; }
} 

class Action {
    public void execute() {
        if( person.getAge() < 18 )
            System.out.println( "Fuck off, boy." );
        else
            System.out.println( "Welcome to old town." );
    }
}

oo:

class Person {
    int age;
    public boolean isUnderAge() { return age < 18; }
} 

class Action {
    public void execute() {
        if( person.isUnderAge() )
            System.out.println( "Fuck off, boy." );
        else
            System.out.println( "Welcome to old town." );
    }
}

Viu que diferente?

Procure no blog do Shoes o artigo Mestre dos Fantoches. Recomendadérrimo.

Pensar melhor neles, pq objetos, POR DEFINICAO, possuem comportamento. Se eles so tem dados, e vc nao faz nada com esses dados, os objetos nao servem pra nada - o importante de frisar aqui eh que, se vc tiver objetos estuprando uns aos outros, pra pegar dados, vc ta fazendo besteira. Por isso o odio por getters e setters :wink:

Leia mais sobre metodologias ageis de desenvolvimento (qualquer coisa do Kent Beck ou Scott Ambler sobre isso eh bacana). :smiley:

http://del.icio.us/cv ta bom? :wink:

O que é feito com os dados dos objetos sem comportamento? Pra que eles servem?

Muitas vezes você tem um atributo qualquer como nome de um usuário por exemplo, que apenas entra via um formulário, vai pro SGBD, é exibido algumas vezes, editado outras e deletado junto com o usuário. Isso é normal.

Agora ter todo um objeto que tem apenas este tipo de atributo é muito estranho.

Eu escrevi um textinho sobre isso uma vez (que rpecisa ser atualizado :stuck_out_tongue: ) : www.fragmental.com.br/arquivos/fantoches.pdf

Fala sobre “classes de dados e classes de lógica”, pode te dar uma idéia melhor sobre o que eu penso :wink:

Exato.

Dê um exemplo dum objeto sem comprotamento rpa gente trabalhar em cima.

Qualquer sistema que usa um padrão chamado VO/DTO/TO é um ótimo candidato. Esse padrão utilizado erroneamente (como em 99.999% das vezes é) é um objeto sem comportamento.

Python é um alinguagem muito boa, e a comunidade é bem focada em OOP. O problema, provavelmente, é que scripts tendem a ser rápidos e sujos.

Essa dos gnomos é ótima, é o conceito básico. Cada um faz uma parte e colabora com o todo.

Isso é sim, uma metodologia, com muitos trações de análise/projeto estruturado (Tom DeMarco/Yourdon/Parge-Jones).

Um livro muito bom sobre como “achar classes” é Domain Driven Design, de Eric Evans.

Seguindo os passos do cv:
http://del.icio.us/pcalcado :mrgreen:

Beleza as respostas!

Esse delicious é massa heim…

O Lipe postou um lance bacana. Pessoalmente eu faço assim, um exemplo bem comum aqui nas minhas classes é o “logado” do usuário, que me fala se o sujeito tá logado ou não no sistema.

Exemplo:

usuario = new Usuario("Cicrano da Silva","jornalista","por ai vai...");
usuario.salva();
//objetos são destruidos...

usuario = Usuarior::logar("Cicrano","passwd",MODO_SESSAO);//esse 
"modo_sessao" é pra guardar em um cookie no server, poderia ser outra coisa, fiz pensando no futuro. Ai dentro do atributo logado vai pra TRUE.

Em algum momento eu pergunto se o cara tá logado, o objeto da acao requer que esteja:

usuario.logado();// ? se sim retorna TRUE se não retorna uma Exception
 de segurança.

Ai o objeto da ação se vira da “melhor maneira” com esse erro, eu normalmente pego a Exception e “mando pra frente”, criando uma msg de
erro na tela do usuario.

Não sei se ajuda, mas nas minhas aplicações, que são simples, os arquivos que fazem a ponte entre visão e as classes Noticia,Usuario,Projeto,etc costumam ter miseras linhas e nenhum if/esle e tbm nunca são questionados sobre seus atributos. Eu uso os atributos sim, tipo: passo pro template uma variavel getAutor().

De acordo com o CV: sim os objetos possuem comportamento. Vendo o que o Lipe postou, e considerando isUnderAge como comportamento, me parece possivel todos os objetos possuirem comportamento. Um comportamento pode ser simples e fazer muito pouco, o importante é evitar manipular os dados do lado de fora do objeto. Certo?

Não sei o que houve com o artigo do Philip, o PDF não abre na minha versão do visualizador de PDF do gnome. To indo ler no Windows e volto aqui pra postar minha opnião/dúvidas.

Finalizando: eu fui no nó do delicius do CV e vi lá um “by Carlos Villela” .Então seu nome é Carlos Villela e você é esse camarada do forró? Heheeh :mrgreen: loucura total ! Ou tudo é só um fake? Deve ser muito bom escrever durante o dia e cantar forró durante a noite!

É um fake hehe :smiley:

Como já postei muitas vezes, evite isso:

private Pessoa pessoa;
private Viagem viagem;
private Hotel hotel;
class MasterOfPuppetsAction {
    boolean goodToGo = true;
    if( viagem.getPreco() + ( hotel.getDiaria() * viagem.getDias() ) > pessoa.getSaldo() )
        goodToGo = false;

    if( pessoa.isVegetariana() && !hotel.getCardapio().hasComidaVegetariana() )
        goodToGo = false;

    if( pessoa.getIdade() > 65 && !hotel.getAtrativos().hasAtrativosParaIdosos() )
        goodToGo = false;

    // ..n..

    if( goodToGo )
        return SUCCESS;

    return ERROR;
}

:?

Alguém sabe o qual o problema do PDF do Philip? Tentei em 2 visualizadores diferentes e em ambos eu só vejo quadradinho :frowning: . Tem em formato ASCII ???

Então Lipe, eu não sei se tu leu meus posts anteriores, em um deles eu critiquei esse senhor manipulador de objetos.

Pra falar a verdade critiquei um aplicativo php que era assim. Era menos toscão, mas era isso.

Ficaria bom se o hotel recebesse uma pessoa, e perguntanto a essa pessoa, enviasse uma resposta “sim, pode vir pra cá” ou “nem vem não”.

Ficaria assim:

class Hotel{
 public analisar(pessoa){
  //aqui tem que ter uns ifs.
  //iriamos acessar alguma coisa da pessoa e...
  //dependendo do que temos:
  return ok
 //se o cara nao se enquadra:
 return nao ok
 }
}

O hotel tem as suas caracteristicas, preço diária, comida, jogos, sei lá.
Pessoa também tem suas caracteristicas, salario,gosto para comida, sei lá

Na Action ficaria assim:

class Action{
 pessoa = new Pessoa
 hotel = new Hotel
 //alguns valores puxados de algum canto...
 hotel.analisa(pessoa);
 // trata exception não ok e finaliza tudo...
}

Assim tá ok?
Se tá ok ou não eu não sei. (humm que frase). Eu escrevo as classes desse modo pra evitar reescrever depois :mrgreen: , desse meu modo você leva a “analise do hotel” pra qualquer canto. Certo?

Cara o que você tá querendo petiscar nessa foto? Parece ser um canelone animal!

Vou deixar pro philip analisar seu código :smiley:
Como sempre digo, Eu Sei Como Não Programar Em Java :thumbup:

A explicação do avatar está aqui:
http://www.guj.com.br/posts/list/21681.java
:XD:

Sobre o PDF não sei, abre com o Adore reader, euc riei com o cute-algumacoisa, um daqueles trecos que fingem ser uma impressora postscript.

O código do Hotel parece legal, porém para evitar esse monte de ifs e garantir um poucos mais de dinamismo você pode utilizar um padrão chamado Specification (cara, você ia se amarrar no Domain Driven Design :mrgreen: ). Nesse padrão, você isolaria as condicionais em uma classe. Claro que se você tem 1 ou 2 ifs, isso é besteira, mas se você tem algumas condições mais complexas, variáveis ou coisa do tipo, é ótimo.

A sua classe Action serve apenas para essa atividade (colocar a pessoa no hotel?) Acho que você poderia trocá-la por um Façade, é mais reutilizável e testável.

Respostas:

Pro Lipe: LOL. Não tinha pensado nisso, esse lance de manter o braço travado funciona bem mesmo, usava muito quando jogava video-game.

Pro Philip:

Pelo visto,a leitura do site vai render umas discussões :mrgreen: .

Esse “parece que ficu legal” significa: continue lendo ou vá ler muito pra tirar o atraso?

Nem, o “parece” é porque avaliar um código assim sem contexto nunca pode ser nada muito exato :wink: