Aula (programação de computadores)

Na programação orientada a objetos , uma classe é um modelo de código de programa extensível para criação de objetos , fornecendo valores iniciais para estado ( variáveis-membro ) e implementações de comportamento (funções ou métodos- membro ). [1] [2] [a]

Quando um objeto é criado por um construtor da classe, o objeto resultante é chamado de instância da classe, e as variáveis ​​de membro específicas do objeto são chamadas de variáveis ​​de instância , para contrastar com as variáveis ​​de classe compartilhadas pela classe.

Em certas linguagens, as classes são, na verdade, apenas um recurso de tempo de compilação (novas classes não podem ser declaradas em tempo de execução ), enquanto em outras linguagens as classes são cidadãos de primeira classe e geralmente são objetos (normalmente do tipo Classe ou similar). Nessas linguagens, uma classe que cria classes dentro de si é chamada de metaclasse .

Conceitos relacionados

Instância

Na programação orientada a objetos (OOP), uma instância é uma ocorrência concreta de qualquer objeto , existindo geralmente durante o tempo de execução de um programa de computador. Formalmente, "instância" é sinônimo de "objeto", pois cada um deles tem um valor específico (realização) e pode ser chamado de objeto de instância; "instância" enfatiza a identidade distinta do objeto. A criação de uma instância é chamada de instanciação.

Um objeto pode ser variado de muitas maneiras. Cada variação realizada desse objeto é uma instância de sua classe. Ou seja, é um membro de uma determinada classe que possui valores especificados em vez de variáveis . Em um contexto de não programação, você poderia pensar em "cachorro" como um tipo e em seu cachorro específico como uma instância dessa classe. [3]

Na programação baseada em classes , os objetos são criados como instâncias de classes por sub-rotinas chamadas construtores , e destruídos por destruidores . Um objeto é uma instância de uma classe, pois pode acessar todos os tipos de dados (primitivos e não primitivos) e métodos, etc., de uma classe. Portanto, os objetos podem ser chamados de instâncias de classe ou objetos de classe. A instanciação de objetos é conhecida como construção. Nem todas as classes podem ser instanciadas – classes abstratas não podem ser instanciadas, enquanto as classes que podem ser instanciadas são chamadas de classes concretas . Na programação baseada em protótipo , a instanciação é feita copiando (clonando) uma instância do protótipo. [4]

Classe versus tipo

Em seu uso mais casual, as pessoas geralmente se referem à "classe" de um objeto, mas, em termos restritos, os objetos têm tipo : a interface, ou seja, os tipos de variáveis-membro, as assinaturas das funções-membro (métodos) e as propriedades que elas satisfazem. Ao mesmo tempo, uma classe possui uma implementação (especificamente a implementação dos métodos), e pode criar objetos de um determinado tipo, com uma determinada implementação. [5] Nos termos da teoria dos tipos, uma classe é uma implementação‍—‌uma estrutura de dados concreta e uma coleção de sub-rotinas‍—‌enquanto um tipo é uma interface . Diferentes classes (concretas) podem produzir objetos do mesmo tipo (abstrato) (dependendo do sistema de tipos); por exemplo, o tipo Stack pode ser implementado com duas classes – SmallStack (rápido para pilhas pequenas, mas escalonável mal) e ScalableStack (escala bem, mas alta sobrecarga para pilhas pequenas). Da mesma forma, uma determinada classe pode ter vários construtores diferentes.

Os tipos de classe geralmente representam substantivos, como pessoa, lugar ou coisa, ou algo nominalizado , e uma classe representa uma implementação destes. Por exemplo, um tipo Banana pode representar as propriedades e funcionalidades das bananas em geral, enquanto as classes ABCBanana e XYZBanana representariam formas de produzir bananas (digamos, fornecedores de bananas ou estruturas de dados e funções para representar e desenhar bananas em um videogame). A classe ABCBanana poderia então produzir bananas específicas: as instâncias da classe ABCBanana seriam objetos do tipo Banana . Freqüentemente, apenas uma única implementação de um tipo é fornecida; nesse caso, o nome da classe geralmente é idêntico ao nome do tipo.

Design e implementação

As aulas são compostas por constituintes estruturais e comportamentais. [1] Linguagens de programação que incluem classes como uma construção de programação oferecem suporte para vários recursos relacionados a classes, e a sintaxe necessária para usar esses recursos varia muito de uma linguagem de programação para outra.

Estrutura

Notação UML para classes

Uma classe contém descrições de campos de dados (ou propriedades , campos , membros de dados ou atributos ). Geralmente são tipos e nomes de campos que serão associados a variáveis ​​de estado em tempo de execução do programa; essas variáveis ​​de estado pertencem à classe ou a instâncias específicas da classe. Na maioria das linguagens, a estrutura definida pela classe determina o layout da memória utilizada por suas instâncias. Outras implementações são possíveis: por exemplo, objetos em Python usam contêineres associativos de valores-chave. [6]

Algumas linguagens de programação, como Eiffel, suportam a especificação de invariantes como parte da definição da classe e os aplicam por meio do sistema de tipos. O encapsulamento do estado é necessário para poder impor os invariantes da classe.

Comportamento

O comportamento de uma classe ou de suas instâncias é definido por meio de métodos . Métodos são sub-rotinas com a capacidade de operar em objetos ou classes. Estas operações podem alterar o estado de um objeto ou simplesmente fornecer formas de acessá-lo. [7] Existem muitos tipos de métodos, mas o suporte para eles varia entre os idiomas. Alguns tipos de métodos são criados e chamados pelo código do programador, enquanto outros métodos especiais — como construtores, destruidores e operadores de conversão — são criados e chamados pelo código gerado pelo compilador. Uma linguagem também pode permitir ao programador definir e chamar esses métodos especiais. [8] [9]

Interface de classe

Cada classe implementa (ou realiza ) uma interface fornecendo estrutura e comportamento. A estrutura consiste em dados e estado, e o comportamento consiste em código que especifica como os métodos são implementados. [10] Existe uma distinção entre a definição de uma interface e a implementação dessa interface; entretanto, essa linha é confusa em muitas linguagens de programação porque as declarações de classe definem e implementam uma interface. Algumas linguagens, entretanto, fornecem recursos que separam interface e implementação. Por exemplo, uma classe abstrata pode definir uma interface sem fornecer uma implementação.

As linguagens que suportam herança de classe também permitem que as classes herdem interfaces das classes das quais são derivadas.

Por exemplo, se a "classe A" herda da "classe B" e se a "classe B" implementa a interface "interface B", então a "classe A" também herda a funcionalidade (declaração de constantes e métodos) fornecida pela "interface B".

Em linguagens que suportam especificadores de acesso, a interface de uma classe é considerada o conjunto de membros públicos da classe, incluindo métodos e atributos (via métodos getter e setter implícitos ); quaisquer membros privados ou estruturas de dados internas não se destinam a depender de código externo e, portanto, não fazem parte da interface.

A metodologia de programação orientada a objetos determina que as operações de qualquer interface de uma classe devem ser independentes umas das outras. Isso resulta em um design em camadas onde os clientes de uma interface usam os métodos declarados na interface. Uma interface não exige que os clientes invoquem as operações de uma interface em qualquer ordem específica. Essa abordagem tem a vantagem de que o código do cliente pode assumir que as operações de uma interface estão disponíveis para uso sempre que o cliente tiver acesso ao objeto. [11] [ carece de fontes ]

Exemplo de interface de classe

Os botões na parte frontal do seu aparelho de televisão são a interface entre você e a fiação elétrica do outro lado da caixa de plástico. Você pressiona o botão “liga / desliga” para ligar e desligar a televisão. Neste exemplo, sua televisão específica é a instância, cada método é representado por um botão, e todos os botões juntos compõem a interface (outros televisores do mesmo modelo que o seu teriam a mesma interface). Na sua forma mais comum, uma interface é uma especificação de um grupo de métodos relacionados sem qualquer implementação associada dos métodos.

Um aparelho de televisão também possui uma infinidade de atributos , como tamanho e suporte a cores, que juntos compõem sua estrutura. Uma classe representa a descrição completa de uma televisão, incluindo seus atributos (estrutura) e botões (interface).

Obter o número total de televisores fabricados poderia ser um método estático da classe de televisão. Este método está associado à classe, mas está fora do domínio de cada instância da classe. Um método estático que encontra uma instância específica fora do conjunto de todos os objetos de televisão é outro exemplo.

Acessibilidade dos membros

A seguir está um conjunto comum de especificadores de acesso : [12]

  • Private (ou class-private ) restringe o acesso à própria classe. Somente métodos que fazem parte da mesma classe podem acessar membros privados.
  • Protected (ou class-protected ) permite que a própria classe e todas as suas subclasses acessem o membro.
  • Público significa que qualquer código pode acessar o membro pelo seu nome.

Embora muitas linguagens orientadas a objetos suportem os especificadores de acesso acima, sua semântica pode ser diferente.

O design orientado a objetos usa os especificadores de acesso em conjunto com o design cuidadoso de implementações de métodos públicos para impor invariantes de classe – restrições no estado dos objetos. Um uso comum dos especificadores de acesso é separar os dados internos de uma classe de sua interface: a estrutura interna torna-se privada, enquanto métodos de acesso público podem ser usados ​​para inspecionar ou alterar esses dados privados.

Os especificadores de acesso não controlam necessariamente a visibilidade , pois mesmo membros privados podem ser visíveis para o código externo do cliente. Em algumas linguagens, um membro inacessível, mas visível, pode ser referido em tempo de execução (por exemplo, por um ponteiro retornado de uma função-membro), mas uma tentativa de usá-lo referindo-se ao nome do membro do código do cliente irá ser evitado pelo verificador de tipo. [13]

As várias linguagens de programação orientadas a objetos impõem acessibilidade e visibilidade aos membros em vários graus e, dependendo do sistema de tipo da linguagem e das políticas de compilação, aplicadas em tempo de compilação ou tempo de execução . Por exemplo, a linguagem Java não permite a compilação do código do cliente que acessa os dados privados de uma classe. [14] Na linguagem C++ , os métodos privados são visíveis, mas não acessíveis na interface; entretanto, eles podem se tornar invisíveis declarando explicitamente classes totalmente abstratas que representam as interfaces da classe. [15]

Alguns idiomas apresentam outros esquemas de acessibilidade:

  • Acessibilidade de instância versus classe : Ruby suporta especificadores de acesso de instância privada e protegida por instância em vez de classe privada e classe protegida, respectivamente. Eles diferem porque restringem o acesso com base na própria instância, e não na classe da instância. [16]
  • Amigo : C++ suporta um mecanismo onde uma função declarada explicitamente como função amiga da classe pode acessar os membros designados como privados ou protegidos. [17]
  • Baseado em caminho : Java suporta a restrição de acesso a um membro dentro de um pacote Java , que é o caminho lógico do arquivo. No entanto, é uma prática comum ao estender uma estrutura Java implementar classes no mesmo pacote que uma classe de estrutura para acessar membros protegidos. O arquivo de origem pode existir em um local completamente diferente e pode ser implementado em um arquivo .jar diferente, mas ainda assim estar no mesmo caminho lógico no que diz respeito à JVM. [12]

Relações entre classes

Além do design de classes independentes, as linguagens de programação podem suportar designs de classes mais avançados baseados em relacionamentos entre classes. Os recursos de design de relacionamento entre classes comumente fornecidos são composicionais e hierárquicos .

Composicional

As classes podem ser compostas por outras classes, estabelecendo assim um relacionamento composicional entre a classe envolvente e suas classes incorporadas. O relacionamento composicional entre classes também é comumente conhecido como relacionamento tem-um . [18] Por exemplo, uma classe "Carro" poderia ser composta e conter uma classe "Motor". Portanto, um carro tem um motor. Um aspecto da composição é a contenção, que é o fechamento de instâncias de componentes pela instância que os possui. Se um objeto envolvente contiver instâncias de componente por valor, os componentes e seu objeto envolvente terão um tempo de vida semelhante . Se os componentes estiverem contidos por referência, eles podem não ter vida útil semelhante. [19] Por exemplo, em Objective-C 2.0:

@interface  Carro  : NSObject

@property NSString * nome ; @property Motor * motor @property NSArray * pneus ;  
  
  

@fim

Esta classe Car possui uma instância de NSString (um objeto string ), Engine e NSArray (um objeto array).

Hierárquico

As classes podem ser derivadas de uma ou mais classes existentes, estabelecendo assim um relacionamento hierárquico entre as classes derivadas ( classes base , classes pai ousuperclasses ) e a classe derivada (classe filhaousubclasse). O relacionamento da classe derivada com as classes derivadas é comumente conhecido como relacionamento é-um . [20]Por exemplo, uma classe 'Button' poderia ser derivada de uma classe 'Control'. Portanto, um botãoé umcontrole. Os membros estruturais e comportamentais das classes pai sãoherdadospela classe filha. As classes derivadas podem definir membros estruturais adicionais (campos de dados) e membros comportamentais (métodos) além daqueles queherdame são, portanto,especializaçõesde suas superclasses. Além disso, as classes derivadas podemsubstituirmétodos herdados se a linguagem permitir.

Nem todas as linguagens suportam herança múltipla. Por exemplo, Java permite que uma classe implemente múltiplas interfaces, mas apenas herde de uma classe. [21] Se herança múltipla for permitida, a hierarquia é um gráfico acíclico direcionado (ou DAG, para abreviar), caso contrário, é uma árvore . A hierarquia possui classes como nós e relacionamentos de herança como links. É mais provável que turmas do mesmo nível estejam associadas do que turmas de níveis diferentes. Os níveis desta hierarquia são chamados de camadas ou níveis de abstração .

Exemplo (código Simplificado Objective-C 2.0, do iPhone SDK):

@interface  UIResponder  : NSObject //... @interface UIView  : UIResponder //... @interface UIScrollView  : UIView //... @interface UITableView  : UIScrollView //... 
  
  
  

Neste exemplo, um UITableView é um UIScrollView é um UIView é um UIResponder é um NSObject.

Definições de subclasse

Conceitualmente, uma superclasse é um superconjunto de suas subclasses. Por exemplo, uma hierarquia de classes comum envolveria GraphicObject como uma superclasse de Rectangle e Ellipse , enquanto Square seria uma subclasse de Rectangle . Todas essas relações também são de subconjuntos na teoria dos conjuntos, ou seja, todos os quadrados são retângulos, mas nem todos os retângulos são quadrados.

Um erro conceitual comum é confundir uma parte da relação com uma subclasse. Por exemplo, um carro e um caminhão são ambos tipos de veículos e seria apropriado modelá-los como subclasses de uma classe de veículos. Contudo, seria um erro modelar as partes do carro como relações de subclasses. Por exemplo, um carro é composto de motor e carroceria, mas não seria apropriado modelar um motor ou carroceria como uma subclasse de um carro.

Na modelagem orientada a objetos, esses tipos de relações são normalmente modelados como propriedades de objetos. Neste exemplo, a classe Car teria uma propriedade chamada parts . parts seriam digitadas para conter uma coleção de objetos, como instâncias de Body , Engine , Tires , etc. Linguagens de modelagem de objetos como UML incluem recursos para modelar vários aspectos de "parte de" e outros tipos de relações - dados como o cardinalidade dos objetos, restrições nos valores de entrada e saída, etc. Essas informações podem ser utilizadas pelas ferramentas do desenvolvedor para gerar código adicional além das definições básicas de dados para os objetos, como verificação de erros nos métodos get e set . [22]

Uma questão importante ao modelar e implementar um sistema de classes de objetos é se uma classe pode ter uma ou mais superclasses. No mundo real, com conjuntos reais, seria raro encontrar conjuntos que não se cruzassem com mais de um outro conjunto. No entanto, embora alguns sistemas como Flavors e CLOS forneçam a capacidade para mais de um pai fazer isso em tempo de execução, introduz uma complexidade que muitos na comunidade orientada a objetos consideram antitética aos objetivos do uso de classes de objetos em primeiro lugar. Entender qual classe será responsável por tratar uma mensagem pode ser complexo ao lidar com mais de uma superclasse. Se usado de forma descuidada, esse recurso pode introduzir algumas das mesmas classes de complexidade e ambiguidade do sistema que foram projetadas para evitar. [23]

A maioria das linguagens modernas orientadas a objetos, como Smalltalk e Java, requerem herança única em tempo de execução. Para essas linguagens, a herança múltipla pode ser útil para modelagem, mas não para implementação.

No entanto, os objetos de aplicativos da web semântica possuem múltiplas superclasses. A volatilidade da Internet exige este nível de flexibilidade e os padrões tecnológicos, como a Web Ontology Language (OWL), são concebidos para apoiá-lo.

Uma questão semelhante é se a hierarquia de classes pode ou não ser modificada em tempo de execução. Linguagens como Flavors, CLOS e Smalltalk suportam esse recurso como parte de seus protocolos de metaobjetos . Como as classes são objetos de primeira classe, é possível fazer com que alterem dinamicamente sua estrutura, enviando-lhes as mensagens apropriadas. Outras linguagens que se concentram mais em tipagem forte, como Java e C++, não permitem que a hierarquia de classes seja modificada em tempo de execução. Os objetos da web semântica têm a capacidade de alterar as classes em tempo de execução. A lógica é semelhante à justificação para permitir múltiplas superclasses, que a Internet é tão dinâmica e flexível que são necessárias mudanças dinâmicas na hierarquia para gerir esta volatilidade. [24]

Ortogonalidade do conceito de classe e herança

Embora comumente se presuma que as linguagens baseadas em classes suportam herança, a herança não é um aspecto intrínseco do conceito de classes. Algumas linguagens, muitas vezes chamadas de " linguagens baseadas em objetos ", suportam classes, mas não suportam herança. Exemplos de linguagens baseadas em objetos incluem versões anteriores do Visual Basic .

Dentro da análise orientada a objetos

Na análise orientada a objetos e na UML , uma associação entre duas classes representa uma colaboração entre as classes ou suas instâncias correspondentes. As associações têm direção; por exemplo, uma associação bidirecional entre duas classes indica que ambas as classes estão cientes de seu relacionamento. [25] As associações podem ser rotuladas de acordo com o seu nome ou finalidade. [26]

Uma função de associação é dada ao final de uma associação e descreve a função da classe correspondente. Por exemplo, uma função "assinante" descreve a maneira como as instâncias da classe "Pessoa" participam de uma associação "assinante" com a classe "Revista". Além disso, uma “Revista” tem a função de “revista assinada” na mesma associação. A multiplicidade de funções de associação descreve quantas instâncias correspondem a cada instância da outra classe da associação. Multiplicidades comuns são "0..1", "1..1", "1..*" e "0..*", onde "*" especifica qualquer número de instâncias. [25]

Taxonomia de classes

Existem muitas categorias de classes, algumas das quais se sobrepõem.

Abstrato e concreto

Em uma linguagem que suporta herança, uma classe abstrata , ou classe base abstrata ( ABC ), é uma classe que não pode ser instanciada diretamente. Por outro lado, uma classe concreta é uma classe que pode ser instanciada diretamente. A instanciação de uma classe abstrata pode ocorrer apenas indiretamente, por meio de uma subclasse concreta .

Uma classe abstrata é rotulada explicitamente como tal ou pode simplesmente especificar métodos abstratos (ou métodos virtuais ). Uma classe abstrata pode fornecer implementações de alguns métodos e também especificar métodos virtuais por meio de assinaturas que serão implementadas por descendentes diretos ou indiretos da classe abstrata. Antes que uma classe derivada de uma classe abstrata possa ser instanciada, todos os métodos abstratos de suas classes pai devem ser implementados por alguma classe na cadeia de derivação. [27]

A maioria das linguagens de programação orientadas a objetos permite ao programador especificar quais classes são consideradas abstratas e não permitirão que elas sejam instanciadas. Por exemplo, em Java , C# e PHP , a palavra-chave abstract é usada. [28] [29] Em C++ , uma classe abstrata é uma classe que possui pelo menos um método abstrato dado pela sintaxe apropriada naquela linguagem (uma função virtual pura na linguagem C++). [27]

Uma classe que consiste apenas em métodos virtuais puros é chamada de classe base abstrata pura (ou ABC puro ) em C++ e também é conhecida como interface pelos usuários da linguagem. [15] Outras linguagens, notadamente Java e C#, suportam uma variante de classes abstratas chamada interface por meio de uma palavra-chave na linguagem. Nessas linguagens, a herança múltipla não é permitida, mas uma classe pode implementar múltiplas interfaces. Tal classe só pode conter métodos abstratos acessíveis ao público. [21] [30] [31]

Local e interno

Em algumas linguagens, as classes podem ser declaradas em escopos diferentes do escopo global. Existem vários tipos dessas aulas.

Uma classe interna é uma classe definida dentro de outra classe. O relacionamento entre uma classe interna e a classe que a contém também pode ser tratado como outro tipo de associação de classe. Uma classe interna normalmente não está associada a instâncias da classe envolvente nem instanciada junto com sua classe envolvente. Dependendo do idioma, pode ou não ser possível referir-se à classe de fora da classe anexa. Um conceito relacionado são os tipos internos , também conhecidos como tipo de dados interno ou tipo aninhado , que é uma generalização do conceito de classes internas. C++ é um exemplo de linguagem que suporta classes internas e tipos internos (por meio de declarações typedef ). [32] [33]

Outro tipo é uma classe local , que é uma classe definida dentro de um procedimento ou função. Isso limita as referências ao nome da classe dentro do escopo onde a classe é declarada. Dependendo das regras semânticas da linguagem, pode haver restrições adicionais nas classes locais em comparação com as não locais. Uma restrição comum é proibir que métodos de classe local acessem variáveis ​​locais da função envolvente. Por exemplo, em C++, uma classe local pode referir-se a variáveis ​​estáticas declaradas dentro de sua função envolvente, mas não pode acessar as variáveis ​​automáticas da função . [34]

Metaclasses

Metaclasses são classes cujas instâncias são classes. [35] Uma metaclasse descreve uma estrutura comum de uma coleção de classes e pode implementar um padrão de design ou descrever tipos específicos de classes. Metaclasses são frequentemente usadas para descrever frameworks . [36]

Em algumas linguagens, como Python , Ruby ou Smalltalk , uma classe também é um objeto; portanto, cada classe é uma instância de uma metaclasse exclusiva incorporada à linguagem. [6] [37] [38] O Common Lisp Object System (CLOS) fornece protocolos de metaobjetos (MOPs) para implementar essas classes e metaclasses. [39]

Não subclassável (ou selado)

Classes não subclassáveis ​​ou classes seladas permitem que os programadores projetem classes e hierarquias de classes onde, em algum nível da hierarquia, derivações adicionais são proibidas (uma classe autônoma também pode ser designada como não subclassável, evitando a formação de qualquer hierarquia) . Compare isso com classes abstratas , que implicam, incentivam e exigem que a derivação seja usada. Uma classe não subclassável é implicitamente concreta .

Uma classe não subclassável é criada declarando a classe como sealedem C# ou como finalem Java ou PHP. [40] [41] [42] Por exemplo, a classe Java Stringé designada como final . [43]

Classes não subclassíveis podem permitir que um compilador (em linguagens compiladas) execute otimizações que não estão disponíveis para classes subclassáveis. [44]

Aula aberta

Uma classe aberta pode ser alterada. Normalmente, um programa executável não pode ser alterado pelos clientes. Muitas vezes, os desenvolvedores podem alterar algumas classes, mas normalmente não podem alterar as classes padrão ou integradas. Em Ruby , todas as classes são abertas. Em Python , as classes podem ser criadas em tempo de execução e todas podem ser modificadas posteriormente. [45] As categorias Objective-C permitem ao programador adicionar métodos a uma classe existente sem a necessidade de recompilar essa classe ou mesmo ter acesso ao seu código-fonte.

Mixins

Algumas linguagens têm suporte especial para mixins , porém, em qualquer linguagem com herança múltipla, um mixin é simplesmente uma classe que não representa um relacionamento é-um-tipo-de. Mixins são normalmente usados ​​para adicionar os mesmos métodos a múltiplas classes; por exemplo, uma classe UnicodeConversionMixin pode fornecer um método chamado unicode_to_ascii quando incluída nas classes FileReader e WebPageScraper que não compartilham um pai comum.

Parcial

Nas linguagens que suportam o recurso, uma classe parcial é uma classe cuja definição pode ser dividida em várias partes, dentro de um único arquivo de código-fonte ou em vários arquivos. [46] As partes são mescladas em tempo de compilação, tornando a saída do compilador igual à de uma classe não parcial.

A principal motivação para a introdução de classes parciais é facilitar a implementação de geradores de código , como designers visuais . [46] Caso contrário, é um desafio ou compromisso desenvolver geradores de código que possam gerenciar o código gerado quando ele é intercalado no código escrito pelo desenvolvedor. Usando classes parciais, um gerador de código pode processar um arquivo separado ou uma classe parcial de granulação grossa dentro de um arquivo e, portanto, é aliviado da interjeição complexa do código gerado por meio de análise extensiva, aumentando a eficiência do compilador e eliminando o risco potencial de corromper o código do desenvolvedor. Numa implementação simples de classes parciais, o compilador pode realizar uma fase de pré-compilação onde “unifica” todas as partes de uma classe parcial. Então, a compilação pode prosseguir normalmente.

Outros benefícios e efeitos do recurso de classe parcial incluem:

  • Permite a separação da interface de uma classe e do código de implementação de uma forma única.
  • Facilita a navegação através de grandes classes dentro de um editor .
  • Permite a separação de interesses , de forma semelhante à programação orientada a aspectos , mas sem usar nenhuma ferramenta extra.
  • Permite que vários desenvolvedores trabalhem em uma única classe simultaneamente, sem a necessidade de mesclar códigos individuais em um arquivo posteriormente.

Classes parciais existem em Smalltalk sob o nome de Extensões de Classe há um tempo considerável. Com a chegada do .NET framework 2 , a Microsoft introduziu classes parciais, suportadas tanto no C# 2.0 quanto no Visual Basic 2005 . WinRT também oferece suporte a classes parciais.

Ininstanciável

Classes não instanciáveis ​​permitem aos programadores agrupar campos e métodos por classe que são acessíveis em tempo de execução sem uma instância da classe. Na verdade, a instanciação é proibida para esse tipo de classe.

Por exemplo, em C#, uma classe marcada como "estática" não pode ser instanciada, só pode ter membros estáticos (campos, métodos, outros), não pode ter construtores de instância e é selada . [47]

Sem nome

Uma classe sem nome ou classe anônima é uma classe que não está vinculada a um nome ou identificador na definição. [48] ​​[49] Isso é análogo a funções nomeadas versus funções não nomeadas .

Benefícios

Os benefícios de organizar software em classes de objetos se enquadram em três categorias: [50]

  • Desenvolvimento rápido
  • Facilidade de manutenção
  • Reutilização de código e designs

As classes de objetos facilitam o desenvolvimento rápido porque diminuem a lacuna semântica entre o código e os usuários. Os analistas de sistema podem conversar com desenvolvedores e usuários usando essencialmente o mesmo vocabulário, falando sobre contas, clientes, faturas, etc. As classes de objetos geralmente facilitam o desenvolvimento rápido porque a maioria dos ambientes orientados a objetos vem com poderosas ferramentas de depuração e teste. Instâncias de classes podem ser inspecionadas em tempo de execução para verificar se o sistema está funcionando conforme o esperado. Além disso, em vez de obter despejos de memória central, a maioria dos ambientes orientados a objetos tem recursos de depuração interpretada para que o desenvolvedor possa analisar exatamente onde ocorreu o erro no programa e ver quais métodos foram chamados para quais argumentos e com quais argumentos. [51]

As classes de objetos facilitam a manutenção por meio de encapsulamento. Quando os desenvolvedores precisam alterar o comportamento de um objeto, eles podem localizar a alteração apenas nesse objeto e em seus componentes. Isso reduz o potencial de efeitos colaterais indesejados decorrentes de melhorias de manutenção.

A reutilização de software também é um grande benefício do uso de classes Object. As classes facilitam a reutilização por meio de herança e interfaces. Quando um novo comportamento é necessário, muitas vezes isso pode ser conseguido criando uma nova classe e fazendo com que essa classe herde os comportamentos e dados padrão de sua superclasse e, em seguida, adapte algum aspecto do comportamento ou dos dados de acordo. A reutilização via interfaces (também conhecidas como métodos) ocorre quando outro objeto deseja invocar (em vez de criar um novo tipo de) alguma classe de objeto. Este método de reutilização remove muitos dos erros comuns que podem aparecer no software quando um programa reutiliza código de outro. [52]

Representação em tempo de execução

Como tipo de dados, uma classe é geralmente considerada uma construção em tempo de compilação. [53] Uma linguagem ou biblioteca também pode suportar protótipos ou metaobjetos de fábrica que representam informações em tempo de execução sobre classes, ou mesmo representar metadados que fornecem acesso a recursos de reflexão e capacidade de manipular formatos de estrutura de dados em tempo de execução. Muitas linguagens distinguem esse tipo de informação de tempo de execução sobre classes de uma classe com base no fato de que a informação não é necessária em tempo de execução. Algumas linguagens dinâmicas não fazem distinções estritas entre construções em tempo de execução e em tempo de compilação e, portanto, podem não distinguir entre metaobjetos e classes.

Por exemplo, se Human for um metaobjeto que representa a classe Person, então instâncias da classe Person poderão ser criadas usando os recursos do metaobjeto Human .

Veja também

Notas

  1. ^ Em muitas linguagens, o nome da classe é usado como o nome da classe (o próprio modelo), o nome do construtor padrão da classe (uma sub-rotina que cria objetos) e como o tipo de objetos gerados pela instanciação da classe ; esses conceitos distintos são facilmente confundidos. [2] Embora, ao ponto de confusão, possa-se argumentar que essa é uma característica inerente a uma linguagem por causa de sua natureza polimórfica e por que essas linguagens são tão poderosas, dinâmicas e adaptáveis ​​para uso em comparação com linguagens sem polimorfismo presente. Assim, podem modelar sistemas dinâmicos (ou seja, o mundo real, aprendizagem automática, IA) com mais facilidade.
  1. ^ ab Gama e outros. 1995, pág. 14.
  2. ^ ab Bruce 2002, 2.1 Objetos, classes e tipos de objetos, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18.
  3. ^ "O que é instância? - Definição de WhatIs.com" . Whatis.techtarget. com . Recuperado em 9 de fevereiro de 2014 .
  4. ^ Amir, Masroor (25 de março de 2023). "OOP - Programação Orientada a Objetos - Conceitos | Linguagens | Benefícios [2023]" . O bot geeks | Um site de ciência da computação para geeks . Recuperado em 04/04/2023 .
  5. ^ Gama e outros. 1995, pág. 17.
  6. ^ ab "3. Modelo de dados". A referência da linguagem Python . Fundação de Software Python . Recuperado em 26/04/2012 .
  7. ^ Booch 1994, pág. 86-88.
  8. ^ “Aulas (I)” . Tutorial da linguagem C++ . cplusplus. com . Recuperado em 29/04/2012 .
  9. ^ “Aulas (II)” . Tutorial da linguagem C++ . cplusplus. com . Recuperado em 29/04/2012 .
  10. ^ Booch 1994, pág. 105.
  11. ^ Jamrich, Parsons, junho (22/06/2015). Novas perspectivas de conceitos de informática, 2016. Abrangente . Boston, MA. ISBN 9781305271616. OCLC  917155105.{{cite book}}: Manutenção CS1: local ausente do editor ( link ) Manutenção CS1: vários nomes: lista de autores ( link )
  12. ^ ab "Controlando o acesso aos membros de uma classe" . Os tutoriais Java . Oráculo . Recuperado em 19/04/2012 .
  13. ^ "OOP08-CPP. Não retorne referências a dados privados" . Padrão de codificação segura CERT C++ . Universidade Carnegie Mellon. 10/05/2010. Arquivado do original em 03/10/2015 . Recuperado em 07/05/2012 .
  14. ^ Ben-Ari, Mordechai (24/01/2007). "2.2 Identificadores" (PDF) . Erros de compilação e tempo de execução em Java . Arquivado (PDF) do original em 18/10/2011 . Recuperado em 07/05/2012 .
  15. ^ ab Selvagem, Fred. "Interfaces C++". Do Dr. UBM Techweb . Recuperado em 02/05/2012 .
  16. ^ Tomás; Caçar. "Classes, objetos e variáveis". Programando Ruby: O Guia Pragmático do Programador . Ruby-Doc.org . Recuperado em 26/04/2012 .
  17. ^ “Amizade e herança” . Tutorial da linguagem C++ . cplusplus. com . Recuperado em 26/04/2012 .
  18. ^ Booch 1994, pág. 180.
  19. ^ Booch 1994, pág. 128-129.
  20. ^ Booch 1994, pág. 112.
  21. ^ ab "Interfaces". Os tutoriais Java . Oráculo . Recuperado em 01/05/2012 .
  22. ^ Berfeld, Marya (2 de dezembro de 2008). "Transformação de UML para Java nas edições do IBM Rational Software Architect e software relacionado" . IBM . Recuperado em 20 de dezembro de 2013 .
  23. ^ Jacobsen, Ivar; Magnus Christerson; Patrick Jonsson; Gunnar Overgaard (1992). Engenharia de Software Orientada a Objetos. Imprensa Addison-Wesley ACM. págs. 43–69. ISBN 0-201-54435-0.
  24. ^ Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Wallace, Evan (09/03/2006). "Uma cartilha da Web Semântica para desenvolvedores de software orientado a objetos". W3C . Recuperado em 30/07/2008 .
  25. ^ ab Bell, Donald. "Noções básicas de UML: o diagrama de classes". desenvolvedor funciona . IBM . Recuperado em 02/05/2012 .
  26. ^ Booch 1994, pág. 179.
  27. ^ ab "Polimorfismo". Tutorial da linguagem C++ . cplusplus. com . Recuperado em 02/05/2012 .
  28. ^ "Métodos e classes abstratas" . Os tutoriais Java . Oráculo . Recuperado em 02/05/2012 .
  29. ^ "Abstração de Classe" . Manual PHP . O Grupo PHP . Recuperado em 02/05/2012 .
  30. ^ "Interfaces (Guia de Programação C#)" . Guia de programação C# . Microsoft . Recuperado em 15/08/2013 .
  31. ^ "Herança (Guia de Programação C #)" . Guia de programação C# . Microsoft . Recuperado em 02/05/2012 .
  32. ^ "Classes aninhadas (somente C++)" . XL C/C++ V8.0 para AIX . IBM . Recuperado em 07/05/2012 .
  33. ^ "Nomes de tipos locais (somente C++)" . XL C/C++ V8.0 para AIX . IBM . Recuperado em 07/05/2012 .
  34. ^ "Classes locais (somente C++)" . XL C/C++ V8.0 para AIX . IBM . Recuperado em 07/05/2012 .
  35. ^ Booch 1994, pág. 133-134.
  36. ^ “13 Classes e metaclasses” . pharo.gforge.inria.fr . Arquivado do original em 24/02/2021 . Recuperado em 31/10/2016 .
  37. ^ Tomás; Caçar. “Classes e Objetos”. Programando Ruby: O Guia Pragmático do Programador . Ruby-Doc.org . Recuperado em 08/05/2012 .
  38. ^ Booch 1994, pág. 134.
  39. ^ "MOP: Conceitos" . O protocolo MetaObject do sistema de objetos Common Lisp . Associação de Usuários Lisp. Arquivado do original em 15/11/2010 . Recuperado em 08/05/2012 .
  40. ^ "selado (referência C #)" . Referência C# . Microsoft . Recuperado em 08/05/2012 .
  41. ^ "Escrevendo aulas e métodos finais" . Os tutoriais Java . Oráculo . Recuperado em 08/05/2012 .
  42. ^ "PHP: palavra-chave final" . Manual PHP . O Grupo PHP . Recuperado em 21/08/2014 .
  43. ^ "String (Plataforma Java SE 7)" . Plataforma Java, Standard Edition 7: Especificação de API . Oráculo . Recuperado em 08/05/2012 .
  44. ^ Marca, Sy (2 de março de 2020). “Os benefícios de desempenho das aulas finais”. Blog da equipe Microsoft C++ . Microsoft . Recuperado em 4 de abril de 2020 .
  45. ^ "9. Aulas" . O Tutorial Python . Python.org . Recuperado em 3 de março de 2018 . Assim como acontece com os módulos, as classes participam da natureza dinâmica do Python: elas são criadas em tempo de execução e podem ser modificadas posteriormente após a criação.
  46. ^ ab mairaw; Bill Wagner; tompratt-AQ (19/09/2015), "Classes e métodos parciais", Guia de programação C# , Microsoft , recuperado em 08/08/2018
  47. ^ "Classes estáticas e membros de classes estáticas (Guia de programação C#)" . Guia de programação C# . Microsoft . Recuperado em 08/05/2012 .
  48. ^ "Classes anônimas (tutoriais Java™ > Aprendendo a linguagem Java > Classes e objetos)" . docs.oracle.com . Recuperado em 13/05/2021 .
  49. ^ “PHP: Aulas anônimas - Manual” . www.php.net . Recuperado em 11/08/2021 .
  50. ^ "O que é um objeto?". oracle. com . Corporação Oracle . Recuperado em 13 de dezembro de 2013 .
  51. ^ Booch, Grady; Robert A. Maksimchuk; Michael W. Engle; Bobbi J. Young Ph.D.; Jim Conallen; Kelli A. Houston (30 de abril de 2007). Análise e Design Orientado a Objetos com Aplicativos. Addison-Wesley Profissional. páginas 1–28. ISBN 978-0-201-89551-3. Recuperado em 20 de dezembro de 2013 . Existem fatores limitantes fundamentais da cognição humana; podemos resolver essas restrições por meio do uso de decomposição, abstração e hierarquia.
  52. ^ Jacobsen, Ivar; Magnus Christerson; Patrick Jonsson; Gunnar Overgaard (1992). Engenharia de Software Orientada a Objetos. Imprensa Addison-Wesley ACM. ISBN 0-201-54435-0.
  53. ^ "Padrão internacional C++" (PDF) . Rascunho de trabalho, padrão para linguagem de programação C++ . ISO/IEC JTC1/SC22 WG21. Arquivado (PDF) do original em 09/12/2017 . Recuperado em 5 de janeiro de 2020 .

Referências

  • Booch, Grady (1994). Objetos e Design com Aplicativos, Segunda Edição . Benjamim/Cummings.
  • Gama; Leme; Johnson; Vlissides (1995). Padrões de Projeto: Elementos de Software Orientado a Objetos Reutilizáveis . Addison Wesley. ISBN 9780201633610.
  • Bruce, Kim B. (2002). Fundamentos de Linguagens Orientadas a Objetos: Tipos e Semântica. Cambridge, MA: MIT Press. ISBN 978-0-262-02523-2.

Leitura adicional

  • Abadi; Cardelli: uma teoria dos objetos
  • Linguagem de programação ISO/IEC 14882:2003 C++, padrão internacional
  • Guerra de Classes: Classes vs. Protótipos, por Brian Foote
  • Meyer, B.: "Construção de software orientada a objetos", 2ª edição, Prentice Hall, 1997, ISBN 0-13-629155-4 
  • Rumbaugh et al.: "Modelagem e design orientado a objetos", Prentice Hall, 1991, ISBN 0-13-630054-5 
Obtido em "https://en.wikipedia.org/w/index.php?title=Class_(computer_programming)&oldid=1209892882"