Quando um recurso é considerado um “cidadão de primeira classe” em uma linguagem / plataforma de programação?

60

Eu já vi muitas vezes declarações como "Por favor, torne este recurso um cidadão de primeira classe em um idioma e plataforma". Por exemplo, é dito sobre enums em C # / .net. Então, quando um recurso é considerado um "cidadão de primeira classe" em uma linguagem / plataforma de programação?

    
por Gulshan 25.01.2011 / 05:53
fonte

5 respostas

39

Definition

An object is first-class when it:

  • can be stored in variables and data structures
  • can be passed as a parameter to a subroutine
  • can be returned as the result of a subroutine
  • can be constructed at runtime
  • has intrinsic identity (independent of any given name)

The term "object" is used loosely here, not necessarily referring to objects in object-oriented programming. The simplest scalar data types, such as integer and floating-point numbers, are nearly always first-class.

link

    
por 25.01.2011 / 08:43
fonte
33

A noção de "cidadão de primeira classe" ou "elemento de primeira classe em uma linguagem de programação foi introduzida pelo cientista britânico de computação Christopher Strachey nos anos 60, no contexto de funções de primeira classe. A formulação mais famosa deste princípio está provavelmente em Estrutura e Interpretação de Programas de Computador por Gerald Jay Sussman e Harry Abelson:

  • They may be named by variables.
  • They may be passed as arguments to procedures.
  • They may be returned as the results of procedures.
  • They may be included in data structures.

Basicamente, isso significa que você pode fazer com este elemento de linguagem de programação tudo o que você pode fazer com todos os outros elementos na linguagem de programação.

É tudo sobre "direitos iguais": você pode fazer todos os itens acima, com, por exemplo, inteiros, então por que qualquer outra coisa deveria ser diferente?

A definição acima é um pouco restritiva no sentido de que ela só fala sobre o aspecto da primeira classe como relacionado a ser objetos do programa. Uma definição mais geral seria que uma coisa é de primeira classe, se você pode fazer tudo com ela, você também pode fazer com outras coisas do mesmo tipo.

Por exemplo, os operadores Java e os métodos Java são de tipo semelhante. Você pode definir novos métodos, você pode escolher (um pouco) livremente os nomes de seus próprios métodos, você pode substituir métodos, você pode sobrecarregar métodos. James Gosling pode fazer tudo isso com os operadores também, mas você e eu não conseguimos. Quero dizer, ao contrário da crença popular, o Java suporta a sobrecarga do operador: por exemplo, o operador + está sobrecarregado para byte , short , int , long , float , double e String , e IIRC no Java 7 também para BigInteger e BigDecimal (e provavelmente um casal que eu esqueci), é só que você não tem nenhuma influência acima dele. Isso claramente torna os operadores de segunda classe de acordo com essa segunda definição. Note que os métodos ainda não são objetos de primeira classe de acordo com a primeira definição. (Isso torna os operadores de terceira classe?)

    
por 25.01.2011 / 15:32
fonte
6

Normalmente, isso se refere a uma construção passável como parâmetro, pode ser definida como um tipo de retorno de uma função ou pode receber um valor. Normalmente você precisa ser capaz de construí-los em tempo de execução. Por exemplo, uma instância de uma classe seria um cidadão de primeira classe em c ++ ou java, mas uma função em C não seria.

    
por 25.01.2011 / 06:11
fonte
1

Eu diria que um recurso é um cidadão de primeira classe, se implementado exclusivamente pela linguagem.
isto é, não requer vários recursos de idioma ou uma biblioteca padrão para implementar esse recurso.

Exemplo:

Em C / C ++, não considero que as funções sejam um cidadão de primeira classe (outras podem).
Isso ocorre porque existem maneiras de manipular funções que são suportadas diretamente pela linguagem, mas requerem o uso de outros recursos de linguagem. Parâmetros de ligação para uma função não são suportados diretamente e você deve construir um functor para implementar este recurso.

    
por 25.01.2011 / 09:24
fonte
-1

Para adicionar um exemplo às respostas já fornecidas:

No WCF / C #, você tem que marcar um objeto de classe com um atributo de contrato de serviço para que ele funcione como um serviço. Não existe tal coisa:

public **service** MyService (in relation public **class** MyClass). 

Uma classe é um cidadão de primeira classe em c #, onde um serviço não é.

Espero que isso ajude

    
por 25.01.2011 / 10:59
fonte