Digitação de pato

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

A digitação do pato na programação de computadores é uma aplicação do teste do pato — "Se ele anda como um pato e grasna como um pato, então deve ser um pato" — para determinar se um objeto pode ser usado para um propósito específico. Com a tipagem nominativa , um objeto é de um determinado tipo se for declarado (ou se a associação de um tipo com o objeto for inferida por meio de mecanismos como herança de objeto ). Na tipagem de pato, um objeto é de um determinado tipo se tiver todos os métodos e propriedades exigidos por esse tipo. [1] [2]A tipagem Duck pode ser vista como uma equivalência estrutural baseada no uso entre um determinado objeto e os requisitos de um tipo. Veja tipagem estrutural para mais explicações sobre equivalência de tipo estrutural.

Exemplo

Este é um exemplo simples em Python 3 que demonstra como qualquer objeto pode ser usado em qualquer contexto, até que seja usado de uma forma que não suporta.

class  Duck : 
    def  nadar ( self ): 
        print ( "Duck nadando" )

    def  fly ( self ): 
        print ( "Pato voando" )

class  Whale : 
    def  swim ( self ): 
        print ( "Whale swiming" )

para  animal  em  [ Pato (),  Baleia ()]: 
    animal . nadar () 
    animal . voar ()

Resultado:

Pato nadando 
Pato voando 
Baleia nadando 
AttributeError: objeto 'Whale' não tem atributo 'fly'

Então, se assumirmos que tudo que pode nadar é um pato porque os patos podem nadar, consideraremos uma baleia um pato, mas, se também assumirmos que ela deve ser capaz de voar, a baleia não será considerada um pato.

Em linguagens digitadas estaticamente

Em algumas linguagens de tipagem estática , como Boo [3] e D , [4] [5] a verificação de tipo de classe pode ser especificada para ocorrer em tempo de execução em vez de em tempo de compilação.

Comparação com outros sistemas de tipo

Sistemas de tipo estrutural

A tipagem Duck é semelhante, mas distinta da tipagem estrutural . A tipagem estrutural é um sistema de tipagem estático que determina a compatibilidade e equivalência de tipo pela estrutura de um tipo, enquanto a tipagem de pato é dinâmica e determina a compatibilidade de tipo apenas pela parte da estrutura de um tipo que é acessada durante o tempo de execução .

As linguagens TypeScript , [6] e Elm , [7] suportam a tipagem estrutural em vários graus.

Protocolos e interfaces

Protocolos e interfaces fornecem uma maneira de declarar, explicitamente, que alguns métodos, operadores ou comportamentos precisam ser definidos (por exemplo, deve ter um método quack() ). Se uma biblioteca de terceiros implementar uma classe que não pode ser modificada, um cliente não poderá usar uma instância dela com uma interface desconhecida para essa biblioteca, mesmo que a classe, de fato, satisfaça os requisitos da interface. Uma solução comum para esse problema é o padrão Adapter . Em contraste, na tipagem de pato, o objeto seria aceito diretamente, sem a necessidade de um adaptador.

Modelos ou tipos genéricos

Template , ou funções ou métodos genéricos aplicam o teste de pato em um contexto de tipagem estática ; isso traz todas as vantagens e desvantagens da verificação de tipo estática versus dinâmica em geral. A tipagem Duck também pode ser mais flexível, pois apenas os métodos realmente chamados em tempo de execução precisam ser implementados, enquanto os modelos exigem implementações de todos os métodos que não podem ser provados inacessíveis em tempo de compilação .

Em linguagens como Java, Scala e Objective-C, a reflexão pode ser usada para inspecionar se os objetos implementam métodos ou até mesmo adicionam métodos necessários em tempo de execução.

Por exemplo, a API MethodHandle do Java pode ser usada dessa maneira. [8]

Veja também

Referências

  1. ^ "Glossário — Documentação do Python 3.7.1" . docs.python.org . Recuperado 2018-11-08 .
  2. ^ "Digitação de pato Python - Exemplo" . Horas Técnicas . 2020-06-28 . Recuperado 2020-07-26 .
  3. ^ Boo: Duck Typing Arquivado em 6 de outubro de 2008, no Wayback Machine
  4. ^ "Aulas dinâmicas e digitação de pato" .
  5. ^ "Metaprogramação - digitação de pato em D" .
  6. ^ "SE Radio Episódio 384: Boris Cherny em TypeScript" . se-radio.net . Recuperado 2019-10-25 .
  7. ^ Czaplicki, Evan. "Linguagem Central · Uma Introdução ao Elm" . Recuperado em 30 de janeiro de 2017 .
  8. ^ "StackOverflow: Implemente a tipagem de pato usando java MethodHandles" . Recuperado em 13 de junho de 2020 .