Como você explica OO para novos programadores?

votos
30

Meu parente está estudando programação e tem dificuldade em entender classes. Ele tem dificuldade para entender, por exemplo, que você precisa instanciar isso, que os métodos não podem acessar variáveis ​​em outros métodos e se você mudar uma variável em uma instância de uma classe que não muda para outras instâncias.

Eu tentei usar analogias como uma definição de classe é como uma planta de uma casa. E instâncias são casas feitas a partir desse modelo.

Como você explica classes e OO em geral?

Publicado 10/12/2008 em 12:44
fonte usuário
Em outras línguas...                            


17 respostas

votos
20

A melhor maneira que eu tenho isso até minha esposa (a revisor oficial de contas) é a seguinte.

Na programação 'regular' você tem dados (coisas que são manipulados) e código (coisas que manipulam) e eles são separados. Às vezes você se misturam porque um determinado pedaço de código tenta manipular a coisa errada.

No caso da minha esposa, eu disse uma factura chegou (que não envolve dinheiro físico mudando de mãos) e, acidentalmente, actualizado um saldo bancário, algo que imediatamente viu como possíveis fraudes (ela costumava fazer contabilidade forense, tudo é possível fraude a ela, incluindo a maioria de minha parte comércios :-).

Você poderia facilmente dizer que um pedaço de código significava para lavar um piso com uma enorme mop decidiu fazê-lo com sua escova de dentes.

Com a programação OO, os manipuladores e manipulatees estão intimamente entrelaçados. Você não aplicar o processo de limpar chão para o chão, em vez você comanda o chão para lavar-se. Ele sabe como fazer isso porque o código é parte do objeto, e não algo externo a ele.

No caso de contabilidade acima, acho que acabou tendo o plano de contas como o objeto e nós dissemos a ele para aplicar uma factura para si. Desde que compreendeu o processo, ele sabia que as contas foram autorizados a ser atualizado (conta de credores passivo e uma conta de despesa se bem me lembro).

Enfim, isso é irrelevante e eu estou apenas sinuoso agora. O que estou dizendo é para expressá-la em termos seu público-alvo vai entender. Suponho que é o segredo de mais ensino.

Respondeu 10/12/2008 em 13:09
fonte usuário

votos
20

Sério usar animais, ele funciona muito bem. E é isso que pregou o conceito para mim anos atrás. Só encontrei este código C #. Parece bom

    // Assembly: Common Classes
    // Namespace: CommonClasses

    public interface IAnimal
    {
        string Name
        { 
             get; 
        }
        string Talk();
    }

    // Assembly: Animals
    // Namespace: Animals

    public class AnimalBase
    {
        private string _name;
        AnimalBase(string name)
        {
           _name = name;
        }
        public string Name
        {
           get
           {
              return _name;
           }
        }
    }

    // Assembly: Animals
    // Namespace: Animals

    public class Cat : AnimalBase, IAnimal
    {
        public Cat(String name) :
            base(name)
        {
        }

        public string Talk() {
            return "Meowww!";
        }
    }

    // Assembly: Animals
    // Namespace: Animals

    public class Dog : AnimalBase, IAnimal
    {
        public Dog(string name) : 
            base(name)
        {
        }

        public string Talk() {
            return "Arf! Arf!";
        }
    }

    // Assembly: Program
    // Namespace: Program
    // References and Uses Assemblies: Common Classes, Animals

    public class TestAnimals
    {
        // prints the following:
        //
        // Missy: Meowww!
        // Mr. Bojangles: Meowww!
        // Lassie: Arf! Arf!
        //
        public static void Main(String[] args)
        {
            List<IAnimal> animals = new List<IAnimal>();
            animals.Add(new Cat("Missy"));
            animals.Add(new Cat("Mr. Bojangles"));
            animals.Add(new Dog("Lassie"));

            foreach(IAnimal animal in animals)
            {
                 Console.WriteLine(animal.Name + ": " + animal.Talk());
            }    
        }
    }

E uma vez que ele tem essa pregado, você desafiá-lo para definir Bird (mosca), e, em seguida, Penguin (voar !?)

Respondeu 10/12/2008 em 12:48
fonte usuário

votos
8

Como todos os peidos velhos, eu gostaria de responder a isso com uma história de minha própria vida.

Comecei a programação básica em um VIC-20. Não sabendo mais nada, embora isso era como todos os computadores foram programados. Eu pensei que era um pouco difícil manter o controle de quais nomes variável eu tinha usado e que ainda estavam livres, (problema de escopo). Eu também pensei que era difícil dividir o meu programa em pedaços repetíveis usando gosub-retorno e definir e ler as variáveis ​​que estes usariam, (falta de métodos).

Em seguida, obteve em Turbo C ao longo de MS-DOS. Agora eu poderia criar meus próprios métodos e funções! Eu já não estava preso com o velho conjunto finito de comandos básicos. Eu senti como se estivesse criando uma nova linguagem para cada programa que eu escrevi. C me deu o poder mais expressivo.

C ++ foi a primeira linguagem orientada a objetos que ouvi sobre. O grande momento para mim foi quando eu entendi que eu poderia criar minhas próprias tipos de dados, e até mesmo sobrecarregar os operadores. Novamente, parecia que eu poderia criar minha própria linguagem contendo ambas novas funções e tipos de dados, completo com operadores.

É assim que eu iria vender OO para um novo programador. Explique que dá poder expressivo porque eles podem definir seus próprios tipos de dados. Eu sempre pensei encapsulamento foi um melhor ponto de venda de herança.

Respondeu 15/12/2008 em 19:51
fonte usuário

votos
4

Eu segundo a abordagem 'Animal'!

Este pequeno artigo sobre JavaRanch, "Como meu cão aprendeu Polimorfismo" me ajudou muito (é praticamente independente do idioma):

http://www.javaranch.com/campfire/StoryPoly.jsp

Respondeu 10/12/2008 em 13:18
fonte usuário

votos
3

Presumo que o alvo sabe como usar interfaces gráficas de usuário. Eu encontrei a melhor maneira é descrever OOP com coisas que eles estão realmente utilizado. Dizer

Classe

Uma janela é uma classe. Ele tem métodos como

  • Mostra uma janela
  • Ativar uma janela
  • Definir título da janela

A janela tem atributos. Isso é dados a ela associados. Ele é encapsulado na classe, juntamente com as funções que operam sobre eles

  • A janela tem dimensões. Largura e altura.
  • A janela tem, possivelmente, uma janela pai, e possivelmente crianças.
  • A janela tem um título

Objeto

Há muitas janelas. Cada janela particular é um objeto da classe janela . Uma janela pai contendo 10 janelas faz 11 objetos da janela.

Deriveration

Um botão é um Window. Tem dimensões tem uma janela pai e tem um título, o rótulo de um botão. É um tipo especial de uma janela. Quando você pedir um objeto de janela, alguém pode dar-lhe um botão . Um botão pode adicionar funções e dados que são específicos para um botão:

  • Um botão tem um estado. Ele pode estar em um estado pressionado, eo estado unpressed.
  • Um botão pode ser o botão padrão em uma janela.
Respondeu 11/12/2008 em 01:34
fonte usuário

votos
3

Enquanto você está explicando OO com animais, não se esqueça de ilustrar a "é-um" relacionamento com cangurus Stinger mísseis armados ;-)

Os cangurus dispersos, como previsto, e os americanos assentiu apreciativamente. . . e depois fez um double-take como os cangurus reapareceu atrás de uma colina e lançou uma barragem de mísseis Stinger contra o helicóptero infeliz. (Aparentemente, os programadores tinham esquecido a remover "que" parte da codificação de infantaria).

A lição? Objetos são definidos com certos atributos, e qualquer novo objeto definido em termos do velho herda todos os atributos. Os programadores embaraçado tinha aprendido a ter cuidado ao reutilizar código orientado a objetos, e os ianques saiu com o maior respeito para a vida selvagem da Austrália.

Respondeu 10/12/2008 em 13:26
fonte usuário

votos
2

Leia os tutoriais Java para algumas boas ideias e exemplos do mundo real.

Respondeu 10/12/2008 em 12:48
fonte usuário

votos
1

Um objeto é uma caixa preta, que você não pode ver através. métodos públicos são botões sobre eles. métodos protegidos são botões escondidos no fundo, métodos privados são dip switches dentro.

Vamos ver uma lavadora como um objeto. Não sabemos como ele funciona. Não importa se ele é alimentado por gás natural, diesel, eletricidade ou plutônio. No entanto, o mecanismo e estrutura interna irá variar muito, dependendo da fonte de energia tal como um motor de combustão é necessária para alguns. Nós não nos importamos desde que se apertar um botão "Wash", ele lava a roupa.

Vamos transformar a máquina de lavar não orientada a objeto. Expor todos os botões, organizando-os no topo. Os clientes agora podem turbinar o motor ajustando alguns interruptores DIP. Faça o chassis transparente. Agora, você pode ver sua máquina de lavar de poupança de energia é, na verdade híbridos potência. Há alguns macacos na mesma. Você libertá-los para a vida selvagem, ea máquina consome sua conta de luz como um gás-beberrão.

Respondeu 11/12/2008 em 01:27
fonte usuário

votos
1

Acredite ou não, de esportes !

Eu tive sucesso no ensino e tutoria por falar sobre a maneira que, por exemplo, um jogo para um time de futebol é descrito em termos de como as várias posições (Centro, Quarterback, Runningback, etc.) interagem para realizar um objetivo particular. Em uma versão, as posições correspondem às classes e pessoas específicas (Tony Romo, Johnny Unitas, etc.) são instâncias da classe - indivíduos que apresentam os mesmos comportamentos, como definido pelas posições.

A segunda versão desta metáfora é para explicar que as posições podem ser as interfaces (no sentido de Java), em vez de classes. Uma interface realmente representa um papel cumprido por qualquer objeto que implementa os métodos da interface. E é perfeitamente razoável para um objeto (via sua classe, em Java) para implementar várias interfaces, assim como é possível para um indivíduo talentoso para jogar mais de uma posição em uma equipe de esportes.

Finalmente, o jogo é como um padrão, em que ele descreve como um conjunto de papéis interagem para realizar algum objetivo específico.

Respondeu 11/12/2008 em 01:02
fonte usuário

votos
1

Se tiverem idade suficiente para ter sempre preencheram um formulário de imposto, mostrar-lhes um 1040EZ e explicar que uma instância de uma classe é como um formulário preenchido-out: cada espaço em branco é uma variável membro do objeto, eo formulário também inclui instruções sobre o que fazer com as variáveis ​​de membro, e essas instruções são as funções de membro do objeto. Uma classe em si é como uma cópia mestre do formulário, a partir do qual você pode imprimir um número infinito de formulários em branco para preencher.

Uma coisa que eu gostaria conselhos para EVITAR na tentativa de comunicar os conceitos de OO para novos programadores está usando apenas exemplos onde os objetos (no sentido OO) representam objetos físicos do mundo real. Isso vai realmente fazer os alunos mais confusa quando se deparam com objetos usados para representar objetos não-físicos (como um esquema de cores, ou a maioria dos padrões de comportamento em "Design Patterns") ou objetos utilizados apenas como uma maneira útil para armazenar funções relacionadas e dados relacionados no mesmo lugar (acho que java.lang.Math de Java para um exemplo.)

Respondeu 10/12/2008 em 21:01
fonte usuário

votos
1

Como sobre "cada molde é construído usando um molde", ou "cada modelo é construído usando um modelo", e assim "cada objeto é construído usando uma classe"?

Note-se que ele funciona para OOP orientação de classe (que é o que você quer), mas não para OOP orientada para o protótipo.

Como para explicar OOP para um programador, eu acrescentaria exemplos que ilustram:

Separando estado do comportamento

Na maioria das vezes, uma instância descrever um estado, e uma classe de descrever um comportamento.

Delegação

Uma instância delegados seu comportamento para sua classe ea classe por sua vez pode delegar o seu comportamento às suas superclasses (ou mixins ou traços)

Polimorfismo

Se a classe A herda de classe B, um exemplo de A pode ser usado em qualquer lugar uma instância da classe B pode ser usado.

Mensagens & métodos

Uma mensagem (ou função genérica, ou função virtual) é como uma pergunta. Na maioria das vezes, várias classes pode responder a esta pergunta.

Um método correspondente é uma possível resposta à pergunta, que reside numa classe.

Ao enviar uma mensagem para uma instância, a instância olha para cima por um método correspondente em sua classe. Se encontrado, ele chama-lo (com a instância obrigado a 'auto' ou 'isto'. Caso contrário, ele procura por um método correspondente em seus Mixins, traços, ou superclasses, e o chama.

Respondeu 10/12/2008 em 13:28
fonte usuário

votos
0

OOP é um nível maior de abstração, um programador não pode realmente vir a compreendê-lo a menos que ele tem uma boa compreensão do normal (leia-se: processual) modo de programação, e ele deve ser capaz de escrever alguns programas que fazem algo útil.

Para mim, tomou uma série de várias palestras por um dos meus profs universitários, em que ele discutia muitos aspectos teóricos da programação, ele tentou nos convencer de que a programação é de cerca de manipulação de dados, e que esses dados é uma representação do "Estado (s )" do programa, e algumas outras coisas abstrato que eu esqueci agora! Mas o ponto é que é difícil de entender OOP sem alguma discussão abstrata teórica primeiro lugar, e esta discussão não faria qualquer sentido a uma pessoa que não tinha tido experiência de escrever algum código real.

Após a discussão teórica, você dá um exemplo de um programa moderadamente complexo, escrito em estilo processual, e, lentamente, convertê-lo, passo a passo, em estilo orientado a objetos. Após o exemplo concreto, você deve voltar para a discussão teórica e apenas resumir os pontos principais, diretamente relacionar as construções teóricas para o exemplo concreto, por exemplo, você pode falar sobre como o nome, idade e salário de um empregado representar seu estado.

Respondeu 11/12/2008 em 01:18
fonte usuário

votos
0

Jogos são bons. Há GameObjects, a partir deste paredes, inimigos e jogadores herdar. Os GameObjects deve ser renderable tem colisão lógica etc Os inimigos têm ai-lógica, enquanto o jogador está Teclado controlado.

Algumas-elementos da interface também são bons, existem botões, inputboxes etc que todos herdam alguns BaseObject que tem o código para o gerenciamento do mouse eventos etc.

Eu não gosto do animal exemplo, porque eu nunca vi um programa de "real" que já teve que usar de animais dessa forma. Ele só vai fazer as pessoas usar a herança em todo o lugar e você vai acabar com cubos herdam retângulos que herdam de linhas (por que tantos livros insistem em usar isso como exemplo?).

Respondeu 10/12/2008 em 16:43
fonte usuário

votos
0

Desde a questão é explicar para um novo programador e não para uma mãe ou uma esposa, gostaria de ir para a direita direto ao ponto. OO é cerca de três conceitos principais:

  1. Hereditariedade: um cão é um animal, pais e filhos, é-um teste de relação, etc.
  2. Encapsulation: público-privada (protegida), ocultação de informações, detalhes subjacentes internos não são importantes para os usuários da classe, proteger os usuários de mudanças futuras na implementação.
  3. Polimorfismo: ligação em tempo de execução, a ligação tardia, método que é invocado depende do tipo do objeto e não a referência ou ponteiro para o objeto.

Além disso, dependendo de quanto o novo programador tem feito uma linguagem procedural, eu precisaria para ajudar o / a desaprender que as funções ou procedimentos não são mais central.

Respondeu 10/12/2008 em 16:26
fonte usuário

votos
0

Eu explico que programa processual é construído em torno dos "verbos" do sistema, as coisas que você deseja que o sistema para fazer, enquanto que a programação orientada a objeto é construir sobre os "substantivos", as coisas no sistema, eo que eles são capazes de , e que para muitas pessoas isso permite um mapeamento mais simples do domínio do problema de software.

Para o exemplo, eu uso carros - "Honda Accord" é uma classe, ao passo que o veículo sentado no estacionamento é um objeto, uma instância de um Honda Accord. A Honda Accord é um sedan, que é um carro, que é um automóvel, que é um veículo motorizado, que é um modo de transporte, etc. eu não posso fazer nada com um carro até que eu tenha um carro física para trabalhar com - ele não me ajudar que a idéia de um Honda Accord existe.

Ele também ajuda para a discussão de interfaces e polimorfismo - o pedal do acelerador significa acelerar, independentemente do que o carro faz nos bastidores para fazer isso acontecer. Há partes "privados" do carro que eu como o usuário não tem acesso a - Eu não pode aplicar diretamente um freio individual.

Respondeu 10/12/2008 em 16:01
fonte usuário

votos
0

o melhor livro que eu já em programação orientada a objetos é de Betrand "Object-Oriented Software Construction" - se você realmente deseja obter o básico, não há maneira de contornar isso.

Respondeu 10/12/2008 em 13:30
fonte usuário

votos
0

de programação orientada a objectos é uma técnica de aumentar o nível de abstracção por meio dos quais o programador comunica com o computador: a partir do nível de sacudir os bits individuais dentro e fora, a partir do nível de furos de perfuração em cartões de papel, a partir do nível de extraordinariamente seqüências complexas de códigos de instruções básicas, desde o nível de definições menos complicados de modelos reutilizáveis, para blocos de dados e blocos reutilizáveis ​​de código (estruturas e procedimentos), para o nível de transcrever os conceitos em mente do programador em código, de modo que o que se passa no interior do computador vem a assemelhar-se, para o programador, o que se passa fora do computador no mundo de objetos físicos, ativos intangíveis e de causa e efeito.

Respondeu 10/12/2008 em 13:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more