• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Dani

[Resolvido]Objectos

11 mensagens neste tópico

Boas

Eu tou na faculdade, e no meu curso há programação, e neste momento estamos a dar programação orientada para obejectos. :wallbash:

O problema é que em toda a minha vida(de secundário) habituei-me a resolver tudo com um main, umas quantas funções e pouco mais e assim consegui acabar com média de 17 a TLP. Agora derrepente apareçem mil e um conceitos novos, e para ser sincero estou um pouco a anhar.

O que gostaria é que me dessem umas luzes sobre este tipo de programação(vantagens e desvantagens) e se possivel, uns tuturiais, ou uns pdfs.

Desde já obrigado.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Devem-te ter dado um método para fazer e ficaste a ver navios :x

Anyway... Compra a bibliografia principal da cadeira e estuda (estudar = 1/3 ler livro + 2 / 3 fazer programas).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

epa...

POO consiste basicamente separar o tipo de dados e a forma como como são armazenados do algoritmo.

Tipo... queres um algoritmo para separar laranjas grandes de laranjas pequenas... ok... em vez disso fazes um algoritmo para separar coisas grandes de coisas pequenas... e depois podes por lá por laranjas, limões, alhos, bogalhos, cebolas... eeheheh.... claro que se quiseres usar o algoritmo para cebolas tens que saber o que é uma cebola... entao defines a classe cebola (um objecto), neste caso tinhas que dizer o que é que consideras uma cebola grande ou uma cebola pequna.

Pa.... dizem que é muito bom para organizar o códio e mais não sei o quê.... eu sou da opinião que só se deve usar POO em programação mais avaçada e para projectos de grande dimensão. Isso tem a relevância que tem devido ao facto de ser uma forma eficaz de implementar uma estrutura de dados.. tipo uma pilha ou uma BST.

Resumindo e complicando... daquelas cenas boas para dar dores de cabeça.... o pessoal que usa C nem sequer pode usar isso... e o php só suporta classes a partir acho que da versão 4.2 ou lá o que é...

por isso como vês, há vida para além das classes

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais ... bem vindo ao maravilhoso mundo de programação por objectos.

Diz adeus  :bye2: aos teus mains de 10 páginas (que foi um dos meus primeiros projectos em OO e me valeu um belo 12 na faculdade), e olá aos teus objectos são mais "espertinhos" e sabem lidar com o que é deles. De inicio podes ficar assustado :eek:, até podes achar que não vale a pena :thumbdown: ... Vais partir a cabeça MUITAS vezes  :wallbash: até que finalmente vais delirar com o conceito OO  :cheesygrin:.

O que é OO ?

Imagina que queres programar um sim-estrada  :police: (triciclos ou biciletas também funcionam). Em C (filosofia main de 10 páginas), terás algo como :

um struct com {

struct roda rodas[4];

int velocidade;

struct direccao direccao;

}

main () {

// Código para construir uma estrada, enchê-la de structs de carros e controlar a rotação de cada roda, velocidad etc.

}

Em OO, terás, em vez de structs, classes/objectos ... algo como :

class Rodas{

int diametro;

int velocidade;

int rotacao;

....

}

class Point{

int x;

int y;

}

class Carro {

  // varíaveis da class

  Rodas rodas[4];

  int velocidade;

  Point direccao;

  //funções da classe

  mudaDireccao(int x,int y) {

  //código que altera a direcção, vira as rodas etc.

  ...

  }

 

  acelera(int quanto) {

  //código para acelerar, aumentar a velocidade, verificar limite de velocidade etc.

  ...

  }

  trava(int quanto) {

  //código para travar etc

  }

}

class Estrada {

Carro carros[1024];

    void main() {

    //Código para criar uma estrada e enchê-lá com carros e mandar cada um dar uma volta.

  ...

  }

}

A diferença aqui é que sem OO tens de controlar tudo, os objectos e como eles agem dentro do teu programa. Em OO, cada objecto sabe como deve efectuar uma certa operação. Portanto o código principal só precisa de mandar o carro acelerar ou mudar de direcção que o objecto Carro sabe que tem de mandar cada uma das rodas andar mais rápido (ou devagar). Portanto quem constroi a "estrada" com os carros basta mandá-los andar que eles tratam de controlar as suas componentes.

Isto não quer dizer que os programas ficam mais espertos  :hmm:, mas quer dizer que a estrada não precisa de saber que o carro tem 4 rodas que têm de ser aceleradas. A "estrada" (imagina que a estrada é o teu main) basta dizer ao carro para andar mais rápido que o carro trata do resto. Se amanhã passar a existir um carro com 5 rodas, a estrada não precisa de saber isso, continua a mandar o carro andar, e é o carro que agora tem de controlar as 5 rodas.

Este é um exemplo um pouco colorido mas é para mostrar que o conhecimento de como as coisas funcionam passam a fazer parte das próprias coisas. Se um dia alguém criar uma classe "auto-estrada", pode simplesmente usar os objectos carro que já existiam para a "estrada" e não precisa de saber como andam, se têm 4,5, ou 7 rodas.

Mas OO não é o paraiso e a resposta para todos os problemas. Para algumas situações só vem atrapalhar e é preferivel um programa mais simples com um main de 10 páginas ... mas podes quase sempre fazer a mesma coisa com objectos.

Mais uma questão de OO é a possíbilidade de uma classe herdar de outra ... Mas isso, é outra história  :biggrin:

- Destineo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Em primeiro lugar, bem-vindo ao fórum Destineo. Goste bastante da tua explicação sobre POO e acho que finalmente compreendi a 100% o que são classes e qual a sua verdadeira função.

No final referiste que classes podem herdar outras classes...como assim? :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um dos muitos objectivos da programação orientada a objectos (como é o caso do JAVA) é facilitar a vida ao utilizador.

Uma coisa boa do java é que tens milhares de classes pré-feitas e na maior parte das vezes tens classes para fazer o programa que queres, poupando-te assim muito trabalho :D

É caso de sacares a documentação do JAVA e logo vês :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi deathseeker25,

Vamos então esclarecer um pouco a questão de herança.

A palavra herança quer dizer que há certas coisas que passam de país, para filhos, para netos etc. As classes também podem ter herança de outras classes, onde certas propriedades (variáveis ou métodos) podem ser herdados pelos filhos.

Continuando o exemplo do sim-estrada, existem vários veículos que podem circular pelas estradas, como por exemplo ambulâncias, carros de polícia  :police:, carros normais, carros tunados  8) etc. Cada uma tem uma particularidade como por exemplo ligar as luzes de emergência na ambulância e nos carros de polícia, acender as luzes neon dos carros tunados, ou até disparar com o turbo dos mesmos. No entanto todos são veiculos que obdecem às mesmas regras e têm propriedade comuns a todos, como o facto de todos terem quatro rodas, um volante, um espelho retrovisor etc. Como é que vamos implementar isto ? :hmm:

Em C normal, teriamos provavelmente um "tipo" na struct que nos dizia que tipo de veiculo é que era, e haveria uma função que tinha que ver que tipo de carro era e só permitir os carros policia e ambulâncias executar um método chamado AcendeLuzesEmergencia().

Em OO podemos usar herança para criar uma classe pai (ou mãe, é indiferente porque os compiladores não são esquezitos ;) ) que tem as variaveis e métodos comuns a todos os veiculos, como por exemplo o acelerar e travar, a velocidade a que o veiculo vai etc. E depois podemos ter classes que herdam desta classe pai mas acrescentam novas funcionalidades, como o AcendeLuzesEmergencia, ou DisparaTurbo. As funções de acelerar e travar, não precisam de ser programadas novamente na classe filho pois o filho tem acesso a tudo o que o pai tem definido (não é bem assim, mas já explico melhor) e ainda às funções que ele tem que não existem na classe pai. Mais ainda, não precisam de nenhuma variável a dizer de que tipo é o objecto, pois quando o criam, criam um objecto do tipo CarroPolicia ou CarroTunado. Usando o objecto Carro do meu último exemplo, podemos criar os seguintes objectos filho(uso notação Java, mas C++ ou C# é muito parecido) :

classe CarroPolicia extends Carro{

LuzesEmergencia luzes[2];

void AcendeLuzesEmergencia () {

  // Ligar as luzes de cima vermelha e azul

  ...

  }

}

Eu agora posso criar um objecto do tipo CarroPolicia e mesmo assim chamar as funções de acelerar e travar embora elas não estejam definidas na classe CarroPolicia mas sim na classe Carro. Esta classe extende a classe Carro adicionando novas luzes e uma nova função. Se criarmos uma classe do tipo Carro, teremos um carro simples que não tem luzes de emergência nem um metodo de acender as mesmas.

Este é o funcionamento básico da herança. Existe um conceito que ainda não falei, mas que dei a perceber acima que é, as vezes podemos querer que os nossos filhos não tenham acesso a tudo o que nós temos, ou pelo menos não permitir que seja mexido. E mais, este conceito também se extende às classes vizinhas que são nossas "amigas".

Por exemplo, não queremos que o CarroTunado consiga mexer directamente com a velocidade, porque nesta versão do sim-estradas, todos os carros só podem andar a um máximo de 50km/h. Sendo assim, queremos que qualquer alteração à velocidade seja feita somente pela chamada acelerar da classe Carro, porque inclui código que não permite acelerar mais do que os 50km/h. Para isso tornamos a variavel da velocidade com visibilidade private, mas deixar a função acelerar com uma visibilidade public. Assim todas as subclasses podem acelerar só por meio da chamada à função Acelerar da classe pai, porque não lhes é permitido mexer na variável que é private. Por o método acelerar ser public, isto que dizer que qualquer outra classe de fora pode chamar este método do objecto. Ou seja, se a estrada (outra classe) fosse um ser inteligente e queria mandar acelerar e desacelerar os carros que circulam nela, podiam simplesmente chamar a função respectiva.

Tanto os métodos como as variáveis da classe podem ter uma visibilidade diferente, o que permite ou não o acesso a essa funções ou variáveis pelos filhos ou amigos.

Existe mais um tipo de visibilidade que se chama protected, e que faz com classes fora da familia (classes que não são herdadas) não consigam aceder às funções, mas os filhos consigam.

Como sempre, existe MUITO mais para dizer, mas .. fica para uma outra vez :D

- Destineo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado Destineo. Finalmente compreendi como pode ser usadas as classes e pelo menos uma das formas de as correlacionar. ;)

Boa explicação!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É para agradecer a todos que ajudaram, a mim e não só, a compreender melhor o conceito de programação por objectos.

De facto comprovo que após algum tempo de prática, ganha-se a chamada "mecânica da coisa", e os programas ficam mais legiveis, saem mais facilemente e o facto de criarmos o nosso próprio tipo de dados ajuda e muito.

De resto é como se custuma dizer primeiro estranha-se depois entranha-se.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para quem nunca ouviu falar de classes... Quando te aparece uma classe à frente é um choque enorme... Eu lembro-me de quando me meteram um programa na primeira aula em que tivemos de fazer classes em Java... Até me passei :Z

Mas com treino e esforço... Acaba por se tornar bastante trivial :)

Força nisso [ ]'s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu lembro-me que o meu primeiro projecto em OO, eu chamava os destrutores implicitamente ... Digamos que o nosso prof não achou piada nenhuma :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora