POO e a performace

12 respostas
rafaspimenta

Boa noite pessoal, eu trabalho com Delphi e como a empresa que trabalho esta migrando a camada de negócio para java devido a portabilidade, começei a trocar ideia com o arquiteto de sistemas da empresa sobre OO e Java.
Nessa conversa ele me disse que apesar de usar em certos momentos não gosta muito de OO. Seu argumento se fundamenta no seguinte:
Digamos que eu eu tenha uma classe cliente(atributos: codigo, nome, cidade, bairro e etc) e preciso apenas do nome.
Segundo a POO eu terei q instaciar um objeto cliente(consequentimente trarei todas informacoes do cliente) e apartir desse objeto pegar o nome.

O argumento dele é que isso não é bom no ponto de vista performatico, pois, ele só precisa do nome.
Sem orientacao a objetos ele simplismente vai na tabela e busca a descrição e retorna o campo Nome atraves de algum método.

E ae pessoal, realmente é isso, ou teria uma forma de fazer isso melhor usando boa pratica de POO?

Obrigado.

12 Respostas

ViniGodoy

De maneira simplista, ele está certo.
Mas se considerar arquiteturas mais avançadas, nem tanto.

Existem técnicas como lazy loading, caches e outras que minimizam esse impacto.

discorpio

Boa noite Rafaspimenta.

Me permite a sinceridade, acho que o seu amigo engenheiro está com uma certa preguiça de migrar para o Java.

Em primeiro lugar, voce não precisa trazer todos os dados do cliente de uma tabela para popular todo um Objeto de entidade de dados, basta tão somente popular o atributo nome.

Em segundo lugar, desde quando voce trazer um único registro contendo todos os dados do cliente e populando o todo Objeto entidade de dados reduz a performance do banco e da aplicação :?:

Se ele dissesse que trazer todos os dados da tabela que contém mais de 500.000 registros para o lado do cliente para se fazer uma única pesquisa de um nome, ai sim, eu concordaria com ele, pois é justamente isso que reduz a performance da sua aplicação.

Além disso, como voce vai trafegar dados, principalmente em rede, se não possuir um objeto que possa contê-los, pois até onde eu sei, RecordSet (Microsoft - ADO), DataSet(Borland - Delphi - Pascal) e ResultSet (Java), são puramente objetos que contém um conjunto de dados que vai trazer dados da tabela dependendo da instrução SQL que voce executa.

Também nunca soube de alquém que trafegasse dados através de DLLs, ou qualquer outro dispositivo que possua métodos e atributos sem que se estruture alguma classe.

Mesmo que voce cria Stored Procedures na banco, voce terá que criar objetos para acessá-lo. Até mesmo linguagens interpretadas como o ASP.Net e PHP utilizam a orientação a objetos para trafegar dados na rede.

Portanto não há como fugir da Orientação a Objetos para isso, que a meu ver não é tão ruim assim.

douglaskd

cara aonde eu trabalho temos um servidor de app em delphi

toda a transição entre o view e o controler é feita através de XML.

e será criada uma view em .net c# para web usando acessos ao servidor de app

não seria possivel fazer o mesmo com java ?

rafaspimenta

ViniGodoy,

irei pesquisar sobre lazy loading e caches. obrigado

discorpio,

Ta nada amigo, estamos super empolgados com o fato de estamos migrando novos serviços para java! =)

eu até argumentei isso com ele, contudo ele refutou dizendo o seguindo: ae amanha eu vou precisar de trazer o sexo do cliente, vou ter que fazer outra classe para trazer o sexo? ae preciso da cidade, vou fazer outra classe para trazer a cidade? entendeu?

“Em segundo lugar, desde quando voce trazer um único registro contendo todos os dados do cliente e populando o todo Objeto entidade de dados reduz a performance do banco e da aplicação”

Não consegui argumentar isso para ele, pois ele diz que criar uma classe com um atributo é uma coisa, agora criar uma com 30 atributos sendo que só precise de um é outra coisa.

"Além disso, como voce vai trafegar dados, principalmente em rede, se não possuir um objeto que possa contê-los, pois até onde eu sei, RecordSet (Microsoft - ADO), DataSet(Borland - Delphi - Pascal) e ResultSet (Java), são puramente objetos que contém um conjunto de dados que vai trazer dados da tabela dependendo da instrução SQL que voce executa.
Também nunca soube de alquém que trafegasse dados através de DLLs, ou qualquer outro dispositivo que possua métodos e atributos sem que se estruture alguma classe. "

Trafegando os dados em formato xml, utilizando protocolo soap.
Como desenvolvemos serviços delphi e cobol, essa arquitetura permite a comunicação entre os dois ambientes, pois, o xml é suportado por ambos.
Agora em java vou procurar saber como será essa arquitetura, posso adiantar que ele esta utilizando o tomcat.


"Mesmo que voce cria Stored Procedures na banco, voce terá que criar objetos para acessá-lo. Até mesmo linguagens interpretadas como o ASP.Net e PHP utilizam a orientação a objetos para trafegar dados na rede. "

Não utizamos SPs no banco, pois, nossos clientes podem utizar bancos como o firebird e oracle. Estamos verificando a possibilidade de suportar tb mysql ou postgre.

Eu tb não acho que seja ruim, só nao consegui convence-lo que utilizar uma classe Cliente com 30 ou mais atributos não será ruim, mesmo que só precisemos de um atributo.

Obrigado pessoal.

rafaspimenta

douglaskd:
cara aonde eu trabalho temos um servidor de app em delphi

toda a transição entre o view e o controler é feita através de XML.

e será criada uma view em .net c# para web usando acessos ao servidor de app

não seria possivel fazer o mesmo com java ?

Não entendi sua pergunta amigos… =S

Nossos clientes utilizam servidores linux e INFELIZMENTE para um serviço feito em delphi rodar em linux só compilando o mesmo no finado kylix.
Como usar o kylix é um retrocesso imensuravel que nos gera dor de cabeça a anos, estamos deixando de desenvolver nossa camada de negocio em delphi(kylix) e passando a desenvolve-la em java.

Veja bem, a interface(roda no windows) feita em delphi continua, o que mudara será a camada de negocio(roda no linux).

JoaoBluSCBR

Me desculpe, mas esse teu engenheiro não fez a tarefa dele direito.

Ele não entendeu OO.

Se ele acha que OO é só criar classes separadas com atributos private e
que por isso eu tenho que chamar o objeto inteiro com 30 atributos toda
vez, ele provavelmente perdeu ou não entendeu a aula sobre encapsulação.

Ter de criar mais uma classe é uma das maiores bençãos num sistema.
Não importa se um sistema precisar de 600 classes de modelagem, importa
que essa encapsulação vai tornar o software flexível e fácil de manter e reutilizar.

Se nos 30 atributos há alguns que são mais utilizados, separe-os em um novo
objeto e encapsule, generalize, reduza os processos de pesquisa a esses atributos.

Tem algo muito errado nessa sua discussão, realmente ela dá a nítida impressão
do “não sei então não gosto”.

JoaoBluSCBR

E além disso há uma confusão nessa história entre banco e OO.

Já vi muito aluno que acha que a modelagem das tabelas é a mesma dos objetos.

Não é por que o objeto tem 30 atributos que vc vai colocar todos eles na
mesma tabela.

Quer um jeito fácil de entender a flexibilidade que a encapsulação produz?

Pegue o livro "Use a Cabeça: Analise e Desenvolvimento Orientado a Objetos. (é algo assim, não lembro o titulo exato)

O livro é bem leve, mas seu primeiro exemplo, mostra um software que faz
uma pesquisa em uma lista e tem um momento em que ele encapsula uma parte
da classe criando uma nova para que a pesquisa só utilize aqueles atributos que
serão pesquisados.

Talvez te ajude a modificar essa idéia.

douglaskd

rafaspimenta:
douglaskd:
cara aonde eu trabalho temos um servidor de app em delphi

toda a transição entre o view e o controler é feita através de XML.

e será criada uma view em .net c# para web usando acessos ao servidor de app

não seria possivel fazer o mesmo com java ?

Não entendi sua pergunta amigos… =S

Nossos clientes utilizam servidores linux e INFELIZMENTE para um serviço feito em delphi rodar em linux só compilando o mesmo no finado kylix.
Como usar o kylix é um retrocesso imensuravel que nos gera dor de cabeça a anos, estamos deixando de desenvolver nossa camada de negocio em delphi(kylix) e passando a desenvolve-la em java.

Veja bem, a interface(roda no windows) feita em delphi continua, o que mudara será a camada de negocio(roda no linux).

putzzzz, viajei…

você vai mudar a camada de negocios nao a view…arhh

malz

discorpio

Bom dia a todos.

douglaskd:
cara aonde eu trabalho temos um servidor de app em delphi

toda a transição entre o view e o controler é feita através de XML.

e será criada uma view em .net c# para web usando acessos ao servidor de app

não seria possivel fazer o mesmo com java ?

Sim, o java utiliza muito o XML, principalmente em ambiente Web, contudo ele apenas o utiliza para configurar ambientes de conexão e outros afins no que tange ao ambiente da aplicação.

Mais uma vez vou ser sincero com vocês, não sei se trafegar dados na rede com XML é uma boa, eis que XML são tags de marcação que contém dados engessados, enquanto que um objeto, além de poder conter dados, pode muito bem manipulá-los no que tange a formatação de um dado tipo data, texto e etc., ou seja tem mais dinamização.

discorpio

Olá Rafaspimenta.

Voce, ou seu amigo engenheiro já ouviram falar sobre persistência de dados :?: Pois é, um dos princípios básicos da Orientação a Objetos é justamente resolver este problema, ou seja, voce ter um objeto persistido em cache de memória, contendo todos os dados de um cliente, voce pode pesquisar qualquer um dos seus atributos, sem precisar ir buscá-lo no banco a toda hora.

discorpio:
"Além disso, como voce vai trafegar dados, principalmente em rede, se não possuir um objeto que possa contê-los, pois até onde eu sei, RecordSet (Microsoft - ADO), DataSet(Borland - Delphi - Pascal) e ResultSet (Java), são puramente objetos que contém um conjunto de dados que vai trazer dados da tabela dependendo da instrução SQL que voce executa.
Também nunca soube de alquém que trafegasse dados através de DLLs, ou qualquer outro dispositivo que possua métodos e atributos sem que se estruture alguma classe. "

Se não me falhe a memória o SOAP (Simple Object Access Protocol ou Objeto Simples de Protocolo de Acesso), como o próprio nome já diz, ele é um Objeto, que muito embora utilize o XML para trafegar dados na rede, contudo o SOAP é um Objeto encapsulado com métodos específicos de envio de requisição e resposta. Já viu então que não dá para fugir do Paradigma de Orientação a Objetos.

O Tomcat, utiliza XML para configurar ambientes de conexão, tais como JNDI DataSorces (JNDI - Java Name Directory Interface).

Se voce está empolgado com o Java, vai ficar muito mais, quanto a possibilidade de trabalhar com vários Frameworks, tais como Java Server Faces, Hibernate, Spring entre muito outros, ou seja, o java abre um variado leque de possibilidades de trabalhar com Web - Servlet, e tudo graças a Orientação a Objetos, que permite encapsular as regras de negócio.

Além disso o nosso amigo JoãoBlusSCBR também definiu muito bem a análise do que pode ser feito.

Rodrigo_Sasaki

Acho que o ponto aqui é que em nenhum momento ele falou que era impossível fazer…

simplesmente disse que pela maneira como é feito, nesse caso específico (não to falando mal de OO nem de java, mas em certo ponto até concordo com o arquiteto), ele tem que achar meios para conseguir aquilo que ele quer, que em outros sistemas talvez fosse mais fácil.

E com certeza dependendo do tamanho do sistema, carregar objetos desnecessários em memória causam um impacto palpável na performance e tempo de resposta.

Mais uma vez digo. Com certeza pode ser feito algo para reduzir esse impacto como o ViniGodoy disse… mas o arquiteto tem certa razão

WellingtonRamos

Há duas coisas que gostaria de citar:
Primeiramente, é que uma classe com 30 atributos pode não estar corretamente modelada.

Por exemplo:
class Cliente
-------------------------
- nome: String
- endereco: Endereco
-------------------------

class Endereco
-------------------------
- logradouro: String
- numero: int
- cep: int
- bairro: String
-------------------------
Veja que a classe Endereco está encapsulando 4 atributos que ficariam em Cliente. É bom analisar os demais pois pode ser que fiquem mais claros em outros objetos.

Quanto a performance: Qual seria a diferença entre buscar um atributo ou diversos (em termos de tempo) gasto?

Criado 18 de agosto de 2011
Ultima resposta 19 de ago. de 2011
Respostas 12
Participantes 7