Como calças de pára-quedas e Pac-Man, OOP (programação orientada a objetos) teve o seu início nos anos 80. Mas ao contrário das modas da moda e dos personagens de videojogos, este modelo de programação continua forte depois destes muitos anos.
OOP tornou-se uma parte fundamental do desenvolvimento de software. Graças à ubiqüidade de linguagens como Java e C++, você não pode desenvolver software para celular a menos que você entenda a abordagem orientada a objetos. O mesmo vale para o desenvolvimento web sério, dada a popularidade das linguagens OOP como Python, PHP e Ruby.
Dar a volta à idéia de programação orientada a objetos pode ser um desafio para alguns profissionais de TI. Você pode estar se perguntando porque você precisa de objetos quando você poderia usar a abordagem top-down da programação estruturada tradicional em linguagens como Visual Basic.
Se você escreveu este tipo de software, você provavelmente está acostumado a dividir grandes problemas em sub-problemas e resolvê-los em unidades de código separadas. Ou você pode ter experiência com programação funcional, que trata elementos de código como funções matemáticas precisas, e evita que eles afetem outros elementos, ou seja, sem efeitos colaterais.
Colocar-se em OOP, no entanto, e você verá que é uma maneira totalmente nova de resolver problemas. O conceito básico é que ao invés de escrever um programa, você cria uma classe, que é um tipo de template contendo variáveis e funções. Os objetos são instâncias autónomas dessa classe, e você pode fazê-los interagir de forma divertida e excitante.
As vantagens da programação orientada a objetos residem neste tipo de encapsulamento. Aqui está uma visão detalhada de alguns dos principais benefícios do OOP:
Modularidade para facilitar a resolução de problemas
Algo correu mal, e você não tem idéia de onde procurar. O problema está no arquivo Widget, ou é o WhaleFlumper? Você vai ter que procurar no arquivo “sewage.c”? Espero que tenha comentado o seu código!
Ao trabalhar com linguagens de programação orientadas a objectos, você sabe exactamente onde procurar. “Oh, o objecto do carro avariou-se? O problema deve estar na classe “Carro”!” Não tens de sujar mais nada.
Essa é a beleza do encapsulamento. Os objetos são auto-contidos, e cada pedaço de funcionalidade faz sua própria coisa enquanto deixa os outros pedaços sozinhos. Além disso, esta modalidade permite que uma equipe de TI trabalhe em múltiplos objetos simultaneamente enquanto minimiza a chance de que uma pessoa possa duplicar a funcionalidade de outra pessoa.
Nós podemos ajudá-lo a encontrar seu próximo trabalho de programação:
Reutilização de código por herança
Suponha que além do seu objeto Carro, um colega precise de um objeto RaceCar, e outro precise de um objeto Limousine. Todos constroem seus objetos separadamente, mas descobrem pontos em comum entre eles. Na verdade, cada objeto é apenas um tipo diferente de Carro. É aqui que a técnica da herança poupa tempo: Criar uma classe genérica (Carro), e depois definir as subclasses (RaceCar e Limousine) que vão herdar os traços da classe genérica.
Obtendo o curso, Limousine e RaceCar ainda têm os seus atributos e funções únicos. Se o objeto RaceCar precisa de um método para “dispararApós Queimadores” e o objeto Limousine requer um Chauffeur, cada classe poderia implementar funções separadas apenas para si mesma. Entretanto, como ambas as classes herdam aspectos chave da classe Car, por exemplo os métodos “drive” ou “fillUpGas”, suas classes herdadas podem simplesmente reutilizar o código existente ao invés de escrever essas funções novamente.
E se você quiser fazer uma alteração em todos os objetos Car, independentemente do tipo? Esta é outra vantagem da abordagem OO. Simplesmente faça uma alteração na sua classe Car, e todos os objetos Carro simplesmente herdarão o novo código.
Flexibilidade através de polimorfismo
Riffing neste exemplo, você agora precisa apenas de alguns pilotos, ou funções, como “driveCar”, “driveRaceCar” e “DriveLimousine”. RaceCarDrivers compartilham algumas características com LimousineDrivers, mas outras coisas, como RaceHelmets e BeverageSponsorships, são únicas.
É aqui que o doce polimorfismo da programação orientada a objetos entra em jogo. Como uma única função pode mudar de forma para se adaptar a qualquer classe em que estiver, você poderia criar uma função na classe “drive” – não “driveCar” ou “driveRaceCar”, mas apenas “drive”. Esta função funcionaria com o RaceCarDriver, LimousineDriver, etc. Na verdade, você poderia até ter “raceCar.drive(myRaceCarDriver)” ou “limo.drive(myChauffeur)”
Effective problem solving
Uma linguagem como o C tem um legado incrível na história da programação, mas escrever software em uma linguagem top-down é como jogar Jenga enquanto usa luvas. Quanto mais complexo ele for, maior a chance de colapso. Entretanto, escrever um programa de estilo funcional em uma linguagem como Haskell ou ML pode ser uma tarefa.
Object-oriented programming is often the most natural and pragmatic approach, once you get the hang of it. As linguagens OOP permitem-lhe decompor o seu software em problemas do tamanho de uma mordida que depois pode resolver – um objecto de cada vez.
Isto não quer dizer que OOP seja o único e verdadeiro caminho. Entretanto, as vantagens da programação orientada a objetos são muitas. Quando você precisa resolver desafios complexos de programação e quer adicionar ferramentas de código ao seu conjunto de habilidades, OOP é seu amigo – e tem longevidade e utilidade muito maiores do que Pac-Man ou calças de pára-quedas.