Você programa orientado a objetos?
De vez em quando alguem me pergunta se eu programo orientado a objetos.
Isso sempre me faz refletir: Afinal, o que é programar orientado a objetos? Existe uma divisão clara entre o que é considerado código OO e o que não é? Basta escrever código em classes? Francamente, eu não sei qual o limiar entre código OO e não OO. Alias, creio que isso seja bastante subjetivo, o que eu considero como OO, outra pessoa pode não considerar.
Outra frase que frequentemente chega aos meus ouvidos é que “em Java você sempre programa OO, não tem como fugir”. Ah, então programar orientado a objetos é isso? Basta enfiar tudo dentro de classes? Eu particularmente me recuso a considerar um projeto como sendo OO apenas por que usa classes.
Então o que eu considero como OO, afinal de contas? Para responder a essa pergunta, antes devemos responder a outra: Que vantagens você espera ao programar orientado a objetos? Parecer cool não conta, por favor…
Vamos lá: Melhorar o reuso de código, design mais limpo, facilidade de manutenção, testabilidade, etc.
(Apenas para deixar claro, não acho que orientação a objetos seja a única forma de escrever código limpo, reutilizavel, etc).
Então agora posso responder àquela outra pergunta: Considero um código como sendo OO se ele foi escrito de forma a deliberadamente utilizar os conceitos de orientação a objetos (herança, polimorfismo, etc) tendo em vista atingir os objetivos que citei acima, e mais especificamente, quando estes objetivos de fato começam a ser alcançados.
Não adianta eu forçar a barra para enfiar todo meu código dentro de classes, bolar hierarquias de herança mirabolantes com 500 classes, se meu código continua não sendo reutilizavel, é de dificil manutenção, é de dificil entendimento, é acoplado, etc. Então voltando à questão do Java, eu digo que tem muito código procedural em Java por aí que está apenas maquiado para parecer OO. Apenas com a experiência nós iremos aprender a programar direito, não importa em qual paradigma.
Podemos decorar dúzias de design patterns, saber na ponta da lingua as definições de polimorfismo, encapsulamento, herança, conhecer UML, etc. Para quem vem de outros paradigmas, a orientação a objetos é uma forma muito diferente de pensar, então necessariamente no inicio a gente vai fazer merda!
O importante é não estacionar. Não podemos pensar que nosso design está uma maravilha só por que utilizamos heranças, padrões de projeto e coisas assim. É importante ser auto-crítico sempre, avaliar a qualidade do nosso código, ver se as nossas decisões de design estão de fato ajudando em algo. É bom tambem buscar a opinião alheia e ter humildade para recebe-la, pois temos dificuldade em enxergar nossas próprias falhas. Com o tempo nossa forma de pensar irá se aperfeiçoando, os conceitos vão sendo melhor entendidos, passamos a ter experiência para avaliar as possíveis consequencias de um determinado design, e aí sim vamos começar a fazer algo legal.
Então… Se eu programo orientado a objetos? Não sei, e não me importo com isso. Eu só me importo em utilizar os recursos que conheço (sejam de programação procedural, OO, funcional ou o que quer que seja) para facilitar a minha vida como programador.


Belo artigo! Gostei bastante. De fato, programar OO não é simplesmente colocar tudo dentro de classes. Eu gosto muito do fato de que na OO os jargões do negócio são mais facilmente localizados no código. Se existe Cliente, Contrato, Pedido, haverá classes que representem essas “entidades” no código. Por outro lado, também gosto da praticidade da programação procedural. Por exemplo, não há nada mais prático para para abrir um arquivo do que um fopen do C. Se eu quiser fazer a mesma coisa em Java, precisarei de várias classes em muitas linhas de código, apenas para usar o paradigma OO.
Como você disse no final, o importante é fazer bom uso dos recursos existentes, sejam eles procedurais, OO ou funcionais. É por isso que gosto mais das linguagens multiparadigma.
Se eu programo orientado a objetos? Também.
De fato Java é muito verboso, você digita muito para fazer qualquer coisa.
Particularmente nunca gostei muito dessa ideia de forçar o programador a utilizar classes, isso implica no surgimento de classes como java.lang.Math que de orientado a objetos não tem nada. Nesse ponto gosto muito mais do que é feito em Python ou Delphi por exemplo, que orientação a objetos, mas não forçam o programador a utilizar. É o multi-paradigma que você mencionou, o programador tem em suas mãos um conjunto de ferramentas bem mais amplo, e usa o que achar mais conveniente em cada situação.
Abraços e obrigado pela visita!
Magno, belo post; falou muito bem!
Parabéns!
Valeu meu brother… obrigado pela visita
Muito bom, meus parabéns, atualmente estou trabalhando muito com Adobe Flash Builder (Flex) e apesar dele ser OO não somos limitados que nem no Java.
abraços
ps: lhe adicionei no Blogroll do meu blog, abraços.