Eu já vi muitas vezes declarações como: "Por favor, faça deste recurso um cidadão de primeira classe em um e outro idioma / plataforma". Por exemplo, é dito sobre enumerações em C # / .net. Então, quando um recurso é considerado um "cidadão de primeira classe" em uma linguagem / plataforma de programação?
language-features
Gulshan
fonte
fonte
A noção de "cidadão de primeira classe" ou "elemento de primeira classe" em uma linguagem de programação foi introduzida pelo cientista de computação britânico Christopher Strachey na década de 1960, no contexto de funções de primeira classe. A formulação mais famosa desse princípio está provavelmente em Estrutura e interpretação de programas de computador por Gerald Jay Sussman e Harry Abelson:
Basicamente, isso significa que você pode fazer com esse elemento da 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 tudo o que precede, com, digamos, números inteiros. Por que outra coisa deveria ser diferente?
A definição acima é um pouco restritiva, no sentido de que realmente fala apenas sobre o aspecto de primeira classe relacionado a ser objeto do programa. Uma definição mais geral seria que uma coisa é de primeira classe, se você pode fazer tudo com ela, também pode fazer com outras coisas de tipo semelhante.
Por exemplo, operadores e métodos Java são de tipo semelhante. Você pode definir novos métodos, pode (um pouco) escolher livremente os nomes de seus próprios métodos, pode substituir métodos, pode sobrecarregar métodos. James Gosling também pode fazer tudo isso com os operadores, mas você e eu não podemos. Quer dizer, ao contrário da crença popular, Java faz sobrecarga de operadores de apoio: por exemplo, o
+
operador é sobrecarregado parabyte
,short
,int
,long
,float
,double
eString
, e IIRC em Java 7 também paraBigInteger
eBigDecimal
(e provavelmente um casal I esqueceu), é só que vocênão tem nenhuma influência sobre isso. Isso claramente torna os operadores de segunda classe, de acordo com esta segunda definição. Observe 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?)fonte
Geralmente, 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 ser atribuído um valor. Normalmente você precisa 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.
fonte
Eu diria que um recurso é um cidadão de primeira classe se for implementado apenas pelo idioma.
isto é, não requer recursos de vários idiomas ou uma biblioteca padrão para implementar esse recurso.
Exemplo:
Em C / C ++, não considero funções um cidadão de primeira classe (outros podem).
Isso ocorre porque existem maneiras de manipular funções que são suportadas diretamente pelo idioma, mas exigem o uso de outros recursos do idioma. A ligação de parâmetros a uma função não é diretamente suportada e você deve criar um functor para implementar esse recurso.
fonte
Para adicionar um exemplo às respostas já fornecidas:
No WCF / C #, você atualmente precisa 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 como:
Uma classe é um cidadão de primeira classe em c #, onde um serviço não é.
Espero que isto ajude
fonte