Object-oriented programming (OOP) refere-se a uma metodologia de programação baseada em objetos, em vez de apenas funções e procedimentos. Os objetos contêm os dados e os métodos (ou comportamento). em conceitos Opa, aprenderemos quatro grandes princípios-abstração, encapsulação, herança e polimorfismo. Eles também são conhecidos como quatro pilares do paradigma de programação orientada a objetos.,
- Abstração é o processo de expor os detalhes essenciais de uma entidade, ignorando os detalhes irrelevantes, para reduzir a complexidade para os usuários.encapsulação é o processo de agrupar dados e Operações sobre os dados juntos em uma entidade.a herança é usada para derivar um novo tipo de um tipo existente, estabelecendo assim uma relação pai-filho.o polimorfismo permite a uma entidade assumir diferentes significados em diferentes contextos.
What is Object-oriented programming?,
in in initial days, the programs were written with binary code, and mechanical switches were used to load the programs. Mais tarde, à medida que as capacidades de hardware evoluíam, especialistas tentaram simplificar a programação usando linguagens de alto nível onde Compiladores eram usados para gerar instruções de máquina a partir do programa.com mais evolução, os especialistas criaram a programação estruturada baseada em pequenas funções. Estas funções ajudaram de muitas maneiras, por exemplo, reutilização de código, variáveis locais, depuração de código e manutenção de código.,com mais avanço computacional e demanda por aplicações mais complexas, as limitações da programação estruturada começaram a ser visíveis. As aplicações complexas precisavam ser modeladas mais de perto com o mundo real e os usos.
então especialistas desenvolveram programação orientada a objetos. No centro da OOP, temos objetos e classes., Assim como uma entidade da vida real, um objeto tem duas características principais :
- data-fala sobre os atributos e o estado do objeto
- comportamento – lhe dá a capacidade de se mudar e se comunicar com outros objetos
1.1. Classe e objeto
um objeto é uma instância de uma classe. Cada objeto tem seu próprio estado, comportamento e identidade. Uma classe é o modelo ou modelo para seus objetos. Objetos podem se comunicar com outros objetos chamando funções. É por vezes referido como passagem de mensagem.,por exemplo, se estamos trabalhando em uma aplicação de RH, então ela consiste de entidades / atores, por exemplo, empregado, gerente, departamento, payslips, férias, objetivos, rastreamento de tempo, etc. Para modelar essas entidades em programas de computador, podemos criar classes que terão atributos de dados semelhantes e comportamento como na vida real.por exemplo, uma entidade empregada pode ser representada como Employee
Classe:
A acimaEmployee
actua como um modelo. Podemos usar esta classe para criar tantos objetos de funcionários diferentes quanto precisamos na aplicação.,
Employee e = new Employee(111);e.setFirstName("Alex");....int age = e.getAge();
o campo id
ajuda a armazenar e recuperar os detalhes de qualquer empregado individual.
a identidade do objeto é geralmente mantida pelo ambiente de execução da aplicação, por exemplo, para aplicações Java, sua máquina virtual Java (JVM). Cada vez que criamos um objeto Java, JVM cria um hashcode para este objeto e atribui-o. Desta forma, mesmo que o programador se esqueça de adicionar id
campo, a JVM garante que todos os objetos são identificados de forma única.
1, 2., Os construtores
São métodos especiais sem valor de retorno. Seu nome é sempre o mesmo que o nome da classe; mas eles podem aceitar parâmetros que ajudam a definir o estado inicial do objeto, antes que a aplicação comece a usá-lo.
Se não fornecermos nenhum construtor, a JVM atribui um construtor padrão à classe. Este construtor padrão não aceita nenhum parâmetro.
lembre-se, se atribuirmos um construtor a qualquer classe então a JVM não atribui o construtor padrão a ele. Se necessário, precisamos especificar o construtor padrão explicitamente para a classe.,
public class Employee { // Default constructor public Employee() { } // Custom constructor public Employee(int id) { this.id = id; }}
Quatro Princípios da OOP
As quatro principais características da programação orientada a objeto são:
- Abstração
- Encapsulamento
- Herança
- Polimorfismo
2.1. Abstração
abstração é muito fácil de entender quando a relacionamos com o exemplo em tempo real. Por exemplo, quando conduzimos o nosso carro, não temos de nos preocupar com o funcionamento interno exacto do carro., O que nos preocupa é interagir com o carro através de suas interfaces como volante, pedal do travão, pedal do acelerador, etc. Aqui o conhecimento que temos do carro é abstrato.
na ciência da computação, abstração é o processo pelo qual os dados e programas são definidos com uma representação similar em forma ao seu significado (semântica) enquanto ocultam os detalhes de implementação.
em termos mais simples, a abstração é esconder informações que não são relevantes para o contexto ou que mostram apenas informações relevantes e simplificá-las comparando-as com algo semelhante no mundo real.,
tipicamente a abstração pode ser vista de duas maneiras:
-
a abstração de dados
a abstração de dados é a forma de criar tipos de dados complexos a partir de vários tipos de dados menores – que é mais próximo de entidades da vida real. por exemplo, uma classe
pode ser um objeto complexo de ter várias associações pequenas.,
public class Employee { private Department department; private Address address; private Education education; //So on...}
So, if you want to fetch information of a employee, you ask it from
Employee
object – as you do in real life, ask the person itself. -
abstração de controle
abstração de controle é alcançada escondendo a sequência de ações para uma tarefa complexa – dentro de uma simples chamada de método, de modo que a lógica para executar a tarefa pode ser escondida do cliente e pode ser alterada no futuro sem impactar o código do cliente.,
public class EmployeeManager{ public Address getPrefferedAddress(Employee e) { //Get all addresses from database //Apply logic to determine which address is preferred //Return address }}
No exemplo acima, amanhã, se você deseja alterar a lógica de modo que toda vez doméstica endereço é o endereço preferido, você irá alterar a lógica dentro de
getPrefferedAddress()
método de, e o cliente não será afetada.
Leia Mais : Abstração em Java
2.2. Encapsulamento
embrulhar dados e métodos dentro das classes em combinação com o esconderijo de implementação (através do controle de acesso) é muitas vezes chamado de encapsulação., O resultado é um tipo de dados com características e comportamentos.
“Tudo o que altera, encapsulá-lo” – Um famoso princípio de design
Encapsulamento, essencialmente, tem tanto i.e. esconder informações e implementação de esconder-se.
- esconder informação é feita através do uso de modificadores de controle de acesso (público, privado, protegido) e
implementation hiding
é alcançado através da criação de interface para uma classe. esconder a implementação dá ao designer a liberdade de modificar como a responsabilidade é cumprida por um objeto., Isto é especialmente valioso em pontos onde o design (ou mesmo os requisitos) são susceptíveis de mudar.
tomemos um exemplo para torná-lo mais claro.
2.2.1. Informações escondidas
class InformationHiding { //Restrict direct access to inward data private ArrayList items = new ArrayList(); //Provide a way to access data - internal logic can safely be changed in future public ArrayList getItems(){ return items; }}
2.2.2. Implementação escondendo
interface ImplemenatationHiding { Integer sumAllItems(ArrayList items);}class InformationHiding implements ImplemenatationHiding{ //Restrict direct access to inward data private ArrayList items = new ArrayList(); //Provide a way to access data - internal logic can safely be changed in future public ArrayList getItems(){ return items; } public Integer sumAllItems(ArrayList items) { //Here you may do N number of things in any sequence //Which you do not want your clients to know //You can change the sequence or even whole logic //without affecting the client }}
Leia Mais : Encapsulamento Em Java
interface ImplemenatationHiding { Integer sumAllItems(ArrayList items);}class InformationHiding implements ImplemenatationHiding{ //Restrict direct access to inward data private ArrayList items = new ArrayList(); //Provide a way to access data - internal logic can safely be changed in future public ArrayList getItems(){ return items; } public Integer sumAllItems(ArrayList items) { //Here you may do N number of things in any sequence //Which you do not want your clients to know //You can change the sequence or even whole logic //without affecting the client }}
Leia Mais : Encapsulamento Em Java
2.3. Inheritance
Inheritance is another important concept in object-oriented programming., Herança em Java é um mecanismo pelo qual uma classe adquire as propriedades e comportamentos da classe pai. Está essencialmente a criar uma relação pai-filho entre as aulas. Em Java, usaremos a herança principalmente para a reutilização e manutenção de códigos.
A Palavra-chave “extends” é usada para herdar uma classe em java. A palavra-chave”extends
” indica que estamos fazendo uma nova classe que deriva de uma classe existente.
na terminologia de Java, Uma classe que é herdada é chamada de super classe. A nova classe é chamada de subclasse.,
uma subclasse herda todos os membros não-privados (campos, métodos e classes aninhadas) de sua superclasse. Os construtores não são membros, por isso não são herdados por subclasses, mas o construtor da superclasse pode ser invocado a partir da subclasse.
2.3.1., A herança de exemplo
public class Employee { private Department department; private Address address; private Education education; //So on...}public class Manager extends Employee { private List<Employee> reportees;}
No código acima, Manager
é a versão especializada de Employee
e reutiliza department
address
e education
de Employee
classe, bem como a definição é do próprio reportees
lista.
3.2.2. Tipos de herança
- herança única-uma classe de filhos é derivada de uma classe de pais.
class Parent{ //code}class Child extends Parent{ //code}
- múltiplas heranças – uma criança pode derivar de múltiplos pais. Até JDK 1.,7, herança múltipla não foi possível em java através do uso de classes. Mas a partir de JDK 1.8 em diante, herança múltipla é possível através do uso de interfaces com métodos padrão.a herança múltipla através do uso de interfaces é sempre possível em Java.
interface MyInterface1{ }interface MyInterface2{ }class MyClass implements MyInterface1, MyInterface2{}
- herança de vários níveis – refere-se a herança entre mais de três classes de tal forma que uma classe-filho irá atuar como classe-mãe para outra classe-filho.
in Giv example,
B
is parent class as well as child class also.,class A{}class B extends A{}class C extends B{}
- herança hierárquica – refere-se à herança quando existe uma super classe e mais de uma sub-classes que estendem a super classe.
class A{}class B extends A{}class C extends A{}class D extends A{}
- herança híbrida – é uma combinação de dois ou mais tipos de herança. Então, quando a relação entre classes contém herança de dois ou mais tipos, então dizemos classes implementar herança híbrida.
interface A{}interface B extends A{}class C implements A{}class D extends C impements B{}
2.4., Polimorfismo
polimorfismo é a capacidade pela qual, podemos criar funções ou variáveis de referência que se comportam de forma diferente num contexto programático diferente. É muitas vezes referido como um nome com muitas formas.
por exemplo, na maioria das linguagens de programação, '+'
operador é usado para adicionar dois números, bem como concatenar duas cadeias de caracteres. Baseado no tipo de variáveis, o operador muda seu comportamento. É conhecido como sobrecarga de operador.
em Java, o polimorfismo é essencialmente considerado em dois tipos:
2.4.1., Polimorfismo de tempo de compilação
no polimorfismo de tempo de compilação, o compilador pode ligar os métodos apropriados aos respectivos objetos no tempo de compilação porque ele tem toda a informação necessária e sabe que método chamar durante a compilação do programa.
é muitas vezes referido como a ligação estática ou a ligação precoce.
em Java, é alcançado com o uso de sobrecarga de método. No método de sobrecarga, os parâmetros do método podem variar com um número, ordem ou os tipos de parâmetro.
2.4.2., Polimorfismo em tempo de execução
no polimorfismo em tempo de execução, a chamada para um método sobreposto é resolvida dinamicamente no tempo de execução. O objeto, no qual o método será executado, é determinado em tempo de execução – Geralmente dependendo do contexto conduzido pelo Usuário.
é muitas vezes referido como a ligação dinâmica ou o método que prevalece. Podemos tê-lo ouvido com o nome dynamic method dispatch.
no polimorfismo em tempo de execução, Geralmente temos uma classe-mãe e uma classe-criança mínima. Em uma classe, nós escrevemos uma declaração para executar um método que está presente na classe pai e na classe filho, ambos.,
a chamada de método é dada usando a variável do tipo de classe-mãe. A instância real da classe é determinada em tempo de execução porque uma variável do tipo de classe pai pode armazenar a referência à instância da classe pai, bem como a classe filho também.
Leia Mais : Polimorfismo em java
Menor Conceitos
Além do acima de 4 blocos de construção de OOP, temos mais alguns conceitos que desempenham um papel importante na construção de todo o entendimento.antes de ir mais fundo, entenderemos o termo módulo., Em geral, um módulo refere-se a uma classe ou sub-aplicação que executa uma funcionalidade única. Na aplicação HR, uma classe pode executar várias funções, tais como enviar e-mails, gerar folhas de salário, calcular a idade do empregado, etc.
3.1. Acoplamento
Acoplamento é a medida do grau de interdependência entre os módulos. Acoplamento refere-se ao quão fortemente um elemento de software é conectado a outros elementos. Um bom software terá Acoplamento baixo.significa que uma classe deve realizar uma tarefa única ou apenas tarefas independentes de outras tarefas. E. g., uma classe EmailValidator
só validará o e-mail. Similarmente, a classe EmailSender
só enviará e-mail.
se incluirmos ambas a functonalidade dentro de uma única classe EmailUtils
então é um exemplo de acoplamento apertado.
3, 2. Coesão
coesão é a cola interna que mantém o módulo Unido. Um bom design de software terá uma elevada coesão.
significa que uma classe / módulo deve incluir toda a informação necessária para que possa desempenhar a sua função sem qualquer dependência., Por exemplo, uma classe EmailSender
deve ser capaz de configurar o servidor SMTP, Aceitar e-mail do remetente, assunto e conteúdo. Basicamente, deve concentrar-se apenas no envio de E-mails.
a aplicação não deve utilizar para qualquer outra função que não o envio de E-mail. A baixa coesão resulta em classes monolíticas difíceis de manter, entender e reduzir a reutilização.
3, 3. Associação
Associação refere-se à relação entre objetos que têm um ciclo de vida independente sem propriedade., tomemos um exemplo de professor e estudante. Vários alunos podem se associar com um único professor, e um único aluno pode se associar com vários professores, mas ambos têm seus próprios ciclos de vida.
ambos podem ser criados e excluídos de forma independente, de modo que quando um professor deixa a escola, não precisamos excluir nenhum aluno, e quando um estudante deixa a escola, não precisamos excluir nenhum professor.
3, 4. Agregação
Associação refere-se à relação entre objetos que têm um ciclo de vida independente com propriedade., É entre classes de filhos e pais onde os objetos filhos não podem pertencer a outro objeto pai.tomemos um exemplo de um telemóvel e uma bateria de telemóvel. Uma única bateria pode pertencer a apenas um telefone de cada vez. Se o telefone parar de funcionar, e nós excluí-lo de nossa base de dados, a bateria de telefone não será excluído porque ainda pode ser funcional. Assim, na agregação, enquanto há Propriedade, os objetos têm seu próprio ciclo de vida.
3, 5. Composição
composição refere-se a relações quando os objetos não têm um ciclo de vida independente., Se o objeto pai for excluído, todos os objetos filhos também serão excluídos.por exemplo, a relação entre perguntas e Respostas. Perguntas individuais podem ter múltiplas respostas, mas as respostas não podem pertencer a várias perguntas. Se excluirmos uma pergunta, todas as suas respostas serão automaticamente apagadas.melhores práticas Favor a composição sobre a herança e a composição, ambos os tipos de promover a reutilização do Código. Mas o uso da composição é preferido à herança.,
uma implementação da composição sobre a herança normalmente começa com a criação de várias interfaces representando os comportamentos que o sistema deve exibir. As Interfaces permitem o comportamento polimórfico. As Classes que implementam as interfaces identificadas são construídas e adicionadas às classes do domínio de negócios, conforme necessário. Assim, os comportamentos do sistema são realizados sem herança.
4.2. Programa para uma interface, não para a implementação
isto leva a um código flexível que pode trabalhar com qualquer nova implementação da interface., Devemos procurar usar interfaces como variáveis, como tipos de retorno de um método ou como tipo de argumento de métodos.as Interfaces
actuam como tipos de superclasse. Desta forma, podemos criar mais especializações da interface no futuro sem modificar o código existente.
4. 3. DRY (Don’t Repeat Yourself)
Don’t write duplicate code, instead use Abstraction to abstract common things in one place.
Como regra geral, se você escrever a mesma peça de código em dois lugares – considere extrair em uma função separada e chamar a função em ambos os lugares.
4.4., Encapsular as alterações
todos os programas têm alterações ao longo do tempo. Então, encapsule o código que espera ou suspeita que seja alterado no futuro.
em Java, use private
métodos para esconder tais implementações de clientes de modo que, quando você faz uma alteração, o cliente não é forçado a fazer alterações em seu código.
O uso de padrões de design também é reiniciado para encapsulação de aceivas. Por exemplo, o padrão de design de fábrica encapsula o código de criação de objetos e fornece flexibilidade para introduzir um novo tipo mais tarde, sem impacto nos clientes existentes.
4, 5., Princípio da responsabilidade única
é um dos princípios sólidos da concepção da classe OOP. Ela enfatiza que uma classe deve ter uma e apenas uma responsabilidade.
em outras palavras, devemos escrever, mudar e manter uma classe para apenas um propósito. Isso nos dará a flexibilidade para fazer mudanças no futuro sem nos preocuparmos com os impactos das mudanças para outra entidade.
4, 6. Open Closed Principle
It emphasis that software components should be open for extension, but closed for modification.,
Isto significa que nossas aulas devem ser projetados de tal forma que, sempre que os colegas desenvolvedores quer mudar o fluxo de controle em condições específicas de aplicação, tudo o que eles precisam estender a nossa classe e substituir algumas funções e é isso.
Se outros desenvolvedores não são capazes de projetar o comportamento desejado devido a restrições colocadas por nossa classe, então devemos reconsiderar a mudança de nossa classe.
existem muitos outros conceitos e definições em todo o paradigma OOPs que aprenderemos em outros tutoriais.feliz aprendizagem !!este post foi útil?,
Deixe uma resposta