Prévia do material em texto
Programação Orientada a Objetos (Mobile) Leopoldo França Introdução ao Coding (Mobile) Aumento da complexidade dos programas. Programação estruturada - anos 60 Atualmente o tratamento estruturado não mais funciona. Para resolver esse problema, a programação orientada a objetos foi criada. A Programação Orientada a Objetos utiliza os conceitos que aprendemos no jardim de infância. Introdução à orientação a objetos. Desenvolvimento Orientado a Objetos Visualiza e representa o mundo real como um conjunto de objetos que interagem entre si para que determinadas operações sejam realizadas. Introdução à orientação a objetos. Parar Motorista Carro 4 Desenvolvimento Orientado a Objetos Visão contemporânea adota perspectiva OO. Forma de construir software que difere bastante dos enfoques tradicionais. Programação orientada a objetos é frequentemente referenciada como um “novo” paradigma de programação. 5 Desenvolvimento Orientado a Objetos Programação implementada pelo envio de mensagens. A solução de um problema consiste em identificar os objetos, mensagens e sequências de mensagens para efetuar a solução. Cada objeto do mundo real transforma-se em um “objeto” de software. 6 Desenvolvimento Orientado a Objetos Viabiliza a montagem de sistemas a partir de componentes. Sensível redução no custo de manutenção do software; Aumento na reutilização de código. 7 Linguagens típicas orientadas a objetos A primeira linguagem: SIMULA (Noruega, 1966) Smalltalk – pura (Xerox, década de 70) C++, Objective-C, Object Pascal (Delphi), JAVA e C# Orientação Objeto depende mais da mentalidade do programador do que da linguagem de programação. 8 Programação Orientada a Objeto em Java JAVA – criada na Sun Microsystems em junho de 1991. Estilo e sintaxe semelhantes as linguagens C / C ++. Atualmente mantida pela Oracle. Em nossa disciplina iremos utilizar a linguagem Java. Os princípios da orientação a objetos são os mesmos, podendo ser aplicados em várias linguagens. Objetos Classes Atributos Métodos Construtores Sobrecarga Conceitos básicos de POO Um objeto é qualquer coisa, real ou abstrata, sobre a qual armazenamos dados e operações que manipulam tais dados Unidade básica de modularização do sistema na abordagem OO Um objeto é um ente independente, composto por: atributos, isto é, características ou propriedades que definem o objeto comportamento, isto é, um conjunto de ações pré-definidas (denominada métodos), através das quais o objeto responderá à demanda de processamento por parte de outros objetos Objetos Classes Uma classe é um gabarito para a definição de objetos Classes: “fábricas” de objetos. Exemplificando, temos que Pessoa é uma classe e João é um objeto (instância) da classe Pessoa. Um carro é uma classe; “meu carro” é um objeto. Objetos similares são agrupados em classes Diagrama de Classes (UML) Nome da Classe Atributos Métodos Nome visibilidade nomeAtrib 1 : tipo1 = valor_default visibilidade nomeAtrib 2 : tipo2 = valor_default . . . visibilidade nomeMetodo 1 ( lista args ) : tipo1 visibilidade nomeMetodo 2 ( lista args ) : tipo2 . . . Classes e objetos em Java [acesso] class NomeDaClasse { Atributos Construtores Métodos } Definição da classe O conteúdo da classe Estrutura de uma classe em Java public class LivroNotas { private String nomeCurso; Construtor e métodos omitidos. } private String nomeCurso; Modificador de visibilidade Tipo Nome da variável Atributos de uma classe em Java Atributos Atributos armazenam valores para um objeto. Eles também são conhecidos como variáveis de instâncias. Atributos definem o estado de um objeto. Normalmente são definidos como privados e vêm acompanhados de dois métodos: •set<nomeAtributo> •get<nomeAtributo> Sobre os métodos Set e Get • Métodos set: • Também conhecidos como métodos modificadores. • Atribuem valores a variáveis de instância. • Devem validar novos valores para variáveis de instância. • Podem retornar um valor para indicar dados inválidos. • Métodos get: • Também conhecidos como métodos de acesso ou métodos de consulta. • Obtêm os valores das variáveis de instância. • Podem controlar o formato dos dados que retornam. Exemplo: public class Produto { private int codigo; private String nome; public String getNome() { return nome; } public void setNome(String nome_produto) { nome = nome_produto; } } •Realizada com a palavra reservada new. •Processo conhecido como criação de uma instância de uma classe. •Tipo da variável pode diferir do objeto realmente criado (desde que estejam relacionados por herança). Produto p = new Produto(); Declaração do tipo da variável Variável Objeto real criado Construção de objetos em Java Construtores Construtores •Construtores inicializam um objeto. •Eles têm o mesmo nome das suas classes. •Eles armazenam valores iniciais nos atributos do objeto. •Eles frequentemente recebem valores de parâmetros externos para definir os atributos. EX: public Produto(int cod, String nome_prod) { codigo = cod; nome = nome_prod; } Construtores Pode existir mais de um construtor em uma classe; Caso não seja definido nenhum construtor, o compilador cria o construtor padrão, sem parâmetros; O construtor padrão inicializa os atributos de classe para seus valores padrões. Caso seja definido qualquer construtor, o construtor padrão não será adicionado pelo compilador; Caso deseje-se que a classe ainda possua um construtor sem parâmetros, é necessário declará-lo explicitamente. Exemplo do uso de construtores em JAVA: Exemplo do uso de construtores em JAVA: Sobrecarga • Chamamos de sobrecarga de métodos quando temos na mesma classe métodos com o mesmo nome, contanto que tenham diferentes conjuntos de parâmetros (assinatura diferente). • Diferentes tipos, números e ordem dos parâmetros. • Quando os métodos com sobrecarga são chamados o compilador JAVA avalia seus parâmetros (ordem, quantidades, tipos) para saber qual método correto deve executar. INSTANCIAÇÃO E REFERÊNCIA DE OBJETOS ENVIO DE MENSAGENS •Objetos se comunicam através de trocas de mensagens. •As mensagens são compostas por um nome e por parâmetros (opcional). •Os objetos interagem entre si enviando mensagens uns para os outros. ENVIO DE MENSAGENS CICLO DE VIDA DE UM OBJETO • Temos então a seguinte sequência do ciclo de vida de um objeto: 1 – Criação: Envolve as etapas de declaração e construção do objeto. 2 – Utilização: Uso do objeto para sua função no programa. 3 – Destruição: Finalização do objeto, liberando a memória utilizada por esse objeto. • Ciclo de vida (exemplo da classe Pessoa ): 1 – Criação: Pessoa p1 , p2 , p3 ; p2 = new Pessoa ( ) ; 2 – Utilização: p2.setNome ( "Maria" ) ; p2.setIdade ( 18 ) ; 3 – Destruição: p2 = null ; • Java é uma das linguagens mais usadas para desenvolvimento Android. • Originalmente desenvolvida pela SUN para ser utilizada em pequenos dispositivos, está presente em diversas plataformas computacionais, desde celulares e palmtops a computadores; • Devido as suas vantagens, é hoje largamente adotada pela indústria no desenvolvimento de software. A tecnologia Java Máquina Virtual Java (JVM) • Executa bytecodes que são independentes da plataforma onde o programa será executado; • Pode ser implementada em software ou hardware. • Provê definições para: • Conjunto de instruções;• Conjunto de registradores; • Pilha; • Heap; • Formato de arquivos .class. Processo de produção de uma aplicação Android • Classes Java são compiladas para bytecode. • Um Android Application Package (APK) é produzido. O APK inclui as classes java compiladas bem como qualquer biblioteca ou recurso utilizado pela aplicação. • Um APK é o equivalente do arquivo JAR do Java (um arquivo zip com todo o conteúdo da aplicação). Activity • Classe Java que compõe uma aplicação Android; • Atividades podem ser usadas para ajudar o usuário a fazer coisas como: • Escrever um e-mail; • Tirar uma foto; • Encontrar um contato etc. • São normalmente associadas com uma tela. Activity • Uma classe Java Activity decide qual layout será utilizado e diz a aplicação como reagir as ações do usuário. • Ex: Se o layout tiver um botão, a classe Activity terá o código que será executado ao pressionar esse botão. • Uma aplicação Android é composta por um conjunto de telas, e cada tela está associada a um arquivo de layout e uma Activity. View • Classe que dá suporte a criação de componentes de interface com o usuário no Android. • Ocupa uma área retangular na tela e é responsável por gerenciar eventos e desenhar o visual do componente. • Montamos o layout da interface com o usuário utilizando subclasses da classe View. • Algumas subclasses que iremos utilizar: Button, Textview, Imageview, Spinner.... View • A interface com o usuário pode ser visualizada como um conjunto de componentes, cada um deles com um retângulo definindo sua área de atuação. XML • (eXtensible Markup Language) pode ser pensado como um padrão para gerar linguagens de marcação para necessidades especiais. • Capaz de descrever diversos tipos de dados, facilita o compartilhamento de informações por intermédio da internet. • Entre as linguagens baseadas em XML temos: XHTML (formato para páginas Web), RDF, SDMX, SMIL, MathML (formato para expressões matemáticas), SVG (formato gráfico vetorial)… • No Android utilizamos para definir o layout da interface gráfica. Exemplo com interação com o usuário • Podemos modificar a interface usando o Design Editor ou editando diretamente o código XML. • Ao adicionarmos componentes via Design Editor, o código XML é alterado instantaneamente. • Se adicionarmos um botão em nossa tela, teremos um código semelhante ao visto a seguir. Exemplo com interação com o usuário <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" android:layout_below="@+id/textView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="43dp" /> Activity • Uma aplicação Android é formada por um conjunto de activities. • Uma Activity pode iniciar a execução de outra activity, o que fará com que a primeira activity seja paralisada, mas seu estado será preservado, sendo retomado quando ela voltar ao foco. • Para cada tela de nossa aplicação uma classe Activity. A classe R.java • Classe Java que é produzida / atualizada quando você cria ou compila seu projeto. • Reside na pasta app/build/generated/source/r/debug do seu projeto em um pacote com o mesmo nome do pacote do seu projeto. • É utlizada pelo Android para registrar os recursos utilizados pelo software, e entre outras coisas, permite a obtenção de referências para os componentes da interface de dentro do nosso código. • Não precisamos alterar o código dessa classe. Toast • No Android, Toast é uma mensagem de notificação que aparece, é exibida por um certo período de tempo e desaparece. • Este recurso não tem interação com o usuário, serve somente para dar informações rápidas. • Entre seus usos está o debug de aplicações. Exemplo Toast • // Exibe a mensagem por um período curto de tempo • Toast.makeText(getApplicationContext(), "mensagem com exibição curta", Toast.LENGTH_SHORT).show(); • // Exibe a mensagem por um período longo de tempo • Toast.makeText(getApplicationContext(), "mensagem com exibição longa", Toast.LENGTH_LONG).show(); Exemplo de uma activity com toast import android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class Primeira_Activity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_primeira_); Toast.makeText(Primeira_Activity.this, "Esta é a nossa Activity Principal", Toast.LENGTH_LONG).show(); } } Exemplo •Embora o método onCreate não tenha essa finalidade, podemos usá-lo em conjunto com o Toast para fazer testes rápidos com algoritmos. •Vamos ver um exemplo disso. Exemplo public class Primeira_Activity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_primeira_); int v[ ] = {1,2,3,4,5}; int soma = 0; for(int i = 0; i < v.length; i++) { soma = soma +v[i]; } Toast.makeText(Primeira_Activity.this, "Soma: " + soma, Toast.LENGTH_LONG).show(); } } soma = 1 Valor de i Soma: soma = 3 soma = 6 soma = 10 soma = 15 i = 0 i = 1 i = 2 i = 3 i = 4 Exemplo – Jogo do Marciano • O Jogo do Marciano consiste de uma brincadeira de adivinhação. O jogador deve descobrir em que árvore o marciano está escondido. Ele deve tentar acertar digitando o número da árvore onde o marciano estaria escondido. Esse número varia de 1 a 100. A cada tentativa, o jogo informa se o marciano está naquela árvore ou em uma árvore de número menor ou maior. Cada tentativa é computada para que no final seja exibido o número total de tentativas até encontrar o marciano. • Vamos ver esse exemplo usando uma interface gráfica (GUI) do Java e depois a versão para Android. Jogo do Marciano GUI Android Jogo do Marciano - GUI import java.util.Random; import javax.swing.JOptionPane; public class Jogo extends javax.swing.JFrame { public static int arvore, cont=0; public Jogo() { initComponents(); initJogo(); } private void initJogo(){ Random s = new Random(); arvore = s.nextInt(100) + 1; mensagem.setText(""); tentativa.setText("Tentativa:"); entrada.setText(""); cont = 0; } Jogo do Marciano - GUI /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { titulo = new javax.swing.JLabel(); digite = new javax.swing.JLabel(); entrada = new javax.swing.JTextField(); entra = new javax.swing.JButton(); tentativa = new javax.swing.JLabel(); mensagem = new javax.swing.JLabel(); jLabel1 = new javax.swing.JLabel(); menuBar = new javax.swing.JMenuBar(); fileMenu = new javax.swing.JMenu(); inicioAsMenuItem = new javax.swing.JMenuItem(); exitMenuItem = new javax.swing.JMenuItem(); helpMenu = new javax.swing.JMenu(); aboutMenuItem = new javax.swing.JMenuItem(); ... Jogo do Marciano – GUI private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {System.exit(0); } private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: JOptionPane.showMessageDialog(null,"Jogo do Marciano\n2017"); } private void inicioAsMenuItemActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: initJogo(); } Jogo do Marciano – GUI private void entraActionPerformed(java.awt.event.ActionEvent evt) { String res=""; int n = Integer.parseInt( entrada.getText() ); cont++; tentativa.setText("Tentativa: "+cont); if (n > arvore) res = "Está em uma árvore menor!"; else if (n< arvore) res = "Está em uma árvore maior!"; else{ res = "Parabéns! Acertou em "+cont+" tentativas!"; cont=0; Random s = new Random(); arvore = s.nextInt(100) + 1; } mensagem.setText(res); } Jogo do Marciano – GUI public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(Jogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(Jogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(Jogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(Jogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Jogo().setVisible(true); } }); } Jogo do Marciano – Android Jogo do Marciano – Android - MainActivity.java package com.example.leopoldo.jogomarciano; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.util.Random; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView tentativa, mensagem; private EditText entrada; public static int arvore, cont=0; public void initJogo(View v){ Random s = new Random(); arvore = s.nextInt(100) + 1; mensagem.setText(""); tentativa.setText("Tentativa:"); entrada.setText(""); cont = 0; } Jogo do Marciano – Android @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tentativa = (TextView) findViewById(R.id.tentativa); mensagem = (TextView) findViewById(R.id.mensagem); entrada = (EditText) findViewById(R.id.entrada); Random s = new Random(); arvore = s.nextInt(100) + 1; mensagem.setText(""); tentativa.setText("Tentativa:"); entrada.setText(""); cont = 0; } Jogo do Marciano – Android public void entraActionPerformed(View v) { String res=""; String e = String.valueOf(entrada.getText()); entrada.setText(""); int n = Integer.parseInt( e ); cont++; tentativa.setText("Tentativa: "+cont); if (n > arvore) res = "Está em uma árvore menor!"; else if (n< arvore) res = "Está em uma árvore maior!"; else{ res = "Parabéns! Acertou em "+cont+" tentativas!"; cont=0; Random s = new Random(); arvore = s.nextInt(100) + 1; } mensagem.setText(res); } } Jogo do Marciano – Android - activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/tentativa" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tentativa:" android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.165" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.073" /> <TextView android:id="@+id/digite" android:layout_width="162dp" android:layout_height="41dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="272dp" android:text="Digite sua tentativa:" android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.038" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/entrada" android:layout_width="155dp" android:layout_height="41dp" android:layout_marginBottom="208dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:ems="10" android:hint="número de 1 a 100" android:inputType="textPersonName" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.962" app:layout_constraintStart_toStartOf="parent" /> Jogo do Marciano – Android <TextView android:id="@+id/mensagem" android:layout_width="335dp" android:layout_height="83dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="100dp" android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/b_entra" android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="28dp" android:onClick="entraActionPerformed" android:text="ENTRA" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.939" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/entrada" /> <Button android:id="@+id/b_reset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="24dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:onClick="initJogo" android:text="reset" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </android.support.constraint.ConstraintLayout> Jogo do Marciano – Android - string.xml <resources> <string name="app_name">Jogo Marciano</string> </resources> DÚVIDAS ?