stringtranslate.com

Clase (programación de computadoras)

En programación orientada a objetos , una clase es una plantilla de código de programa extensible para crear objetos , que proporciona valores iniciales para el estado ( variables miembro ) e implementaciones de comportamiento (funciones o métodos miembro ). [1] [2] [un]

Cuando un constructor de la clase crea un objeto, el objeto resultante se denomina instancia de la clase y las variables miembro específicas del objeto se denominan variables de instancia , para contrastar con las variables de clase compartidas en toda la clase.

En ciertos lenguajes, las clases son, de hecho, sólo una característica en tiempo de compilación (no se pueden declarar nuevas clases en tiempo de ejecución ), mientras que en otros lenguajes las clases son ciudadanos de primera clase , y generalmente son en sí mismos objetos (típicamente de tipo Clase o similar). En estos lenguajes, una clase que crea clases dentro de sí misma se llama metaclase .

Conceptos relacionados

Instancia

En programación orientada a objetos (OOP), una instancia es una ocurrencia concreta de cualquier objeto , que generalmente existe durante el tiempo de ejecución de un programa de computadora. Formalmente, "instancia" es sinónimo de "objeto", ya que cada uno de ellos tiene un valor particular (realización) y puede denominarse objeto de instancia; "instancia" enfatiza la identidad distintiva del objeto. La creación de una instancia se llama creación de instancias.

Un objeto puede variarse de muchas maneras. Cada variación realizada de ese objeto es una instancia de su clase. Es decir, es un miembro de una clase determinada que tiene valores especificados en lugar de variables . En un contexto sin programación, podría pensar en "perro" como un tipo y en su perro en particular como una instancia de esa clase. [3]

En la programación basada en clases , los objetos se crean como instancias de clases mediante subrutinas llamadas constructores y los destructores los destruyen . Un objeto es una instancia de una clase, ya que puede acceder a todos los tipos de datos (tanto primitivos como no primitivos), métodos, etc., de una clase. Por lo tanto, los objetos pueden denominarse instancias de clase u objetos de clase. La creación de instancias de objetos se conoce como construcción. No se pueden crear instancias de todas las clases: no se pueden crear instancias de las clases abstractas , mientras que las clases de las que se pueden crear instancias se denominan clases concretas . En la programación basada en prototipos , la creación de instancias se realiza copiando (clonando) una instancia de prototipo. [4]

Clase versus tipo

En su uso más informal, la gente suele referirse a la "clase" de un objeto, pero en términos estrictos los objetos tienen tipo : la interfaz, es decir, los tipos de variables miembro, las firmas de las funciones miembro (métodos) y las propiedades que satisfacen. Al mismo tiempo, una clase tiene una implementación (específicamente la implementación de los métodos), y puede crear objetos de un tipo determinado, con una implementación determinada. [5] En términos de teoría de tipos, una clase es una implementación‍—‌una estructura de datos concreta y una colección de subrutinas‍—‌mientras que un tipo es una interfaz . Diferentes clases (concretas) pueden producir objetos del mismo tipo (abstracto) (según el sistema de tipos); por ejemplo, el tipo Stack podría implementarse con dos clases: SmallStack (rápido para pilas pequeñas, pero escala mal) y ScalableStack (escalable bien pero con mucha sobrecarga para pilas pequeñas). De manera similar, una clase determinada puede tener varios constructores diferentes.

Los tipos de clase generalmente representan sustantivos, como una persona, lugar o cosa, o algo nominalizado , y una clase representa una implementación de estos. Por ejemplo, un tipo Plátano podría representar las propiedades y funcionalidad de los plátanos en general, mientras que las clases ABCBanana y XYZBanana representarían formas de producir plátanos (por ejemplo, proveedores de plátanos o estructuras de datos y funciones para representar y dibujar plátanos en un videojuego). La clase ABCBanana podría entonces producir plátanos particulares: las instancias de la clase ABCBanana serían objetos de tipo Banana . A menudo sólo se proporciona una única implementación de un tipo, en cuyo caso el nombre de la clase suele ser idéntico al nombre del tipo.

Diseño e implementación

Las clases se componen de constituyentes estructurales y conductuales. [1] Los lenguajes de programación que incluyen clases como construcción de programación ofrecen soporte para varias características relacionadas con las clases, y la sintaxis requerida para usar estas características varía mucho de un lenguaje de programación a otro.

Estructura

Notación UML para clases

Una clase contiene descripciones de campos de datos (o propiedades , campos , miembros de datos o atributos ). Suelen ser tipos de campos y nombres que se asociarán con variables de estado en el tiempo de ejecución del programa; estas variables de estado pertenecen a la clase o a instancias específicas de la clase. En la mayoría de los lenguajes, la estructura definida por la clase determina el diseño de la memoria utilizada por sus instancias. Son posibles otras implementaciones: por ejemplo, los objetos en Python usan contenedores asociativos de clave-valor. [6]

Algunos lenguajes de programación como Eiffel admiten la especificación de invariantes como parte de la definición de la clase y las aplican a través del sistema de tipos. La encapsulación del estado es necesaria para poder hacer cumplir las invariantes de la clase.

Comportamiento

El comportamiento de una clase o sus instancias se define mediante métodos . Los métodos son subrutinas con la capacidad de operar sobre objetos o clases. Estas operaciones pueden alterar el estado de un objeto o simplemente proporcionar formas de acceder a él. [7] Existen muchos tipos de métodos, pero su compatibilidad varía según el idioma. Algunos tipos de métodos se crean y se invocan mediante código de programador, mientras que otros métodos especiales (como constructores, destructores y operadores de conversión) se crean y se invocan mediante código generado por el compilador. Un lenguaje también puede permitir al programador definir y llamar a estos métodos especiales. [8] [9]

interfaz de clase

Cada clase implementa (o realiza ) una interfaz proporcionando estructura y comportamiento. La estructura consta de datos y estado, y el comportamiento consta de código que especifica cómo se implementan los métodos. [10] Existe una distinción entre la definición de una interfaz y la implementación de esa interfaz; sin embargo, esta línea es borrosa en muchos lenguajes de programación porque las declaraciones de clases definen e implementan una interfaz. Algunos lenguajes, sin embargo, proporcionan características que separan la interfaz y la implementación. Por ejemplo, una clase abstracta puede definir una interfaz sin proporcionar una implementación.

Los lenguajes que admiten la herencia de clases también permiten que las clases hereden interfaces de las clases de las que se derivan.

Por ejemplo, si la "clase A" hereda de la "clase B" y si la "clase B" implementa la interfaz "interfaz B", entonces la "clase A" también hereda la funcionalidad (declaración de métodos y constantes) proporcionada por la "interfaz B".

En los lenguajes que admiten especificadores de acceso, se considera que la interfaz de una clase es el conjunto de miembros públicos de la clase, incluidos métodos y atributos (a través de métodos getter y setter implícitos ); Los miembros privados o las estructuras de datos internas no están destinados a depender de código externo y, por lo tanto, no forman parte de la interfaz.

La metodología de programación orientada a objetos dicta que las operaciones de cualquier interfaz de una clase deben ser independientes entre sí. Da como resultado un diseño en capas donde los clientes de una interfaz utilizan los métodos declarados en la interfaz. Una interfaz no exige que los clientes invoquen las operaciones de una interfaz en un orden particular. Este enfoque tiene la ventaja de que el código del cliente puede asumir que las operaciones de una interfaz están disponibles para su uso siempre que el cliente tenga acceso al objeto. [11] [ cita necesaria ]

Ejemplo de interfaz de clase

Los botones en el frente de su televisor son la interfaz entre usted y el cableado eléctrico al otro lado de su carcasa de plástico. Presionas el botón de "encendido" para encender y apagar el televisor. En este ejemplo, su televisor particular es la instancia, cada método está representado por un botón y todos los botones juntos componen la interfaz (otros televisores que sean del mismo modelo que el suyo tendrían la misma interfaz). En su forma más común, una interfaz es una especificación de un grupo de métodos relacionados sin ninguna implementación asociada de los métodos.

Un televisor también tiene una infinidad de atributos , como el tamaño y si admite color, que en conjunto componen su estructura. Una clase representa la descripción completa de un televisor, incluidos sus atributos (estructura) y botones (interfaz).

Obtener el número total de televisores fabricados podría ser un método estático de la clase de televisores. Este método está asociado con la clase, pero está fuera del dominio de cada instancia de la clase. Otro ejemplo es un método estático que encuentra una instancia particular del conjunto de todos los objetos de televisión.

Accesibilidad para miembros

El siguiente es un conjunto común de especificadores de acceso : [12]

Aunque muchos lenguajes orientados a objetos admiten los especificadores de acceso anteriores, su semántica puede diferir.

El diseño orientado a objetos utiliza los especificadores de acceso junto con un diseño cuidadoso de implementaciones de métodos públicos para imponer invariantes de clase (restricciones sobre el estado de los objetos). Un uso común de los especificadores de acceso es separar los datos internos de una clase de su interfaz: la estructura interna se vuelve privada, mientras que los métodos de acceso públicos se pueden usar para inspeccionar o alterar dichos datos privados.

Los especificadores de acceso no necesariamente controlan la visibilidad , ya que incluso los miembros privados pueden ser visibles para el código externo del cliente. En algunos idiomas, se puede hacer referencia a un miembro inaccesible pero visible en tiempo de ejecución (por ejemplo, mediante un puntero devuelto por una función miembro), pero un intento de usarlo haciendo referencia al nombre del miembro del código del cliente ser evitado por el verificador de tipo. [13]

Los diversos lenguajes de programación orientados a objetos imponen la accesibilidad y visibilidad de los miembros en diversos grados y, según el sistema de tipos del lenguaje y las políticas de compilación, se aplican en tiempo de compilación o en tiempo de ejecución . Por ejemplo, el lenguaje Java no permite que se compile el código de cliente que accede a los datos privados de una clase.[14] En el lenguaje C++ , los métodos privados son visibles, pero no accesibles en la interfaz; sin embargo, pueden volverse invisibles declarando explícitamente clases completamente abstractas que representen las interfaces de la clase. [15]

Algunos idiomas cuentan con otros esquemas de accesibilidad:

Relaciones entre clases

Además del diseño de clases independientes, los lenguajes de programación pueden admitir diseños de clases más avanzados basados ​​en relaciones entre clases. Las capacidades de diseño de relaciones entre clases que se proporcionan comúnmente son compositivas y jerárquicas .

composicional

Las clases pueden estar compuestas de otras clases, estableciendo así una relación de composición entre la clase envolvente y sus clases integradas. La relación composicional entre clases también se conoce comúnmente como relación tiene-a . [18] Por ejemplo, una clase "Coche" podría estar compuesta y contener una clase "Motor". Por tanto, un Coche tiene un Motor. Un aspecto de la composición es la contención, que es el encerramiento de las instancias componentes por la instancia que las tiene. Si un objeto adjunto contiene instancias de componentes por valor, los componentes y su objeto adjunto tienen una vida útil similar . Si los componentes están contenidos por referencia, es posible que no tengan una vida útil similar. [19] Por ejemplo, en Objective-C 2.0:

@interfaz  Coche  : NSObject@property NSString * nombre ; @property Motor * motor @property NSArray * neumáticos ;      @fin

Esta clase Car tiene una instancia de NSString (un objeto de cadena ), Engine y NSArray (un objeto de matriz).

Jerárquico

Las clases pueden derivarse de una o más clases existentes, estableciendo así una relación jerárquica entre las clases derivadas ( clases base , clases padre osuperclases ) y la clase derivada (clase hijaosubclase). La relación de la clase derivada con las clases derivadas se conoce comúnmente como relación es-un . [20]Por ejemplo, una clase 'Botón' podría derivarse de una clase 'Control'. Por tanto, un Botónes unControl. La clase secundaria heredalos miembros estructurales y de comportamiento delas clases principales. Las clases derivadas pueden definir miembros estructurales adicionales (campos de datos) y miembros de comportamiento (métodos) además de los que heredany, por lo tanto, sonespecializacionesde sus superclases. Además, las clases derivadas puedenanularlos métodos heredados si el lenguaje lo permite.

No todos los idiomas admiten la herencia múltiple. Por ejemplo, Java permite que una clase implemente múltiples interfaces, pero solo herede de una clase. [21] Si se permite la herencia múltiple, la jerarquía es un gráfico acíclico dirigido (o DAG para abreviar), de lo contrario es un árbol . La jerarquía tiene clases como nodos y relaciones de herencia como enlaces. Es más probable que las clases del mismo nivel estén asociadas que las clases de diferentes niveles. Los niveles de esta jerarquía se denominan capas o niveles de abstracción .

Ejemplo (código Objective-C 2.0 simplificado, del SDK de iPhone):

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

En este ejemplo, UITableView es UIScrollView , es UIView , es UIResponder y es NSObject.

Definiciones de subclase

Conceptualmente, una superclase es un superconjunto de sus subclases. Por ejemplo, una jerarquía de clases común involucraría a GraphicObject como una superclase de Rectángulo y Elipse , mientras que Cuadrado sería una subclase de Rectángulo . Todas estas son relaciones de subconjuntos también en la teoría de conjuntos, es decir, todos los cuadrados son rectángulos pero no todos los rectángulos son cuadrados.

Un error conceptual común es confundir una parte de la relación con una subclase. Por ejemplo, un automóvil y un camión son ambos tipos de vehículos y sería apropiado modelarlos como subclases de una clase de vehículo. Sin embargo, sería un error modelar las partes del automóvil como relaciones de subclase. Por ejemplo, un automóvil se compone de un motor y una carrocería, pero no sería apropiado modelar un motor o una carrocería como una subclase de un automóvil.

En el modelado orientado a objetos, este tipo de relaciones normalmente se modelan como propiedades de objetos. En este ejemplo, la clase Car tendría una propiedad llamada parts . las partes se escribirían para contener una colección de objetos, como instancias de Body , Engine , Tires , etc. Los lenguajes de modelado de objetos como UML incluyen capacidades para modelar varios aspectos de "parte de" y otros tipos de relaciones: datos como el cardinalidad de los objetos, restricciones en los valores de entrada y salida, etc. Las herramientas de desarrollo pueden utilizar esta información para generar código adicional además de las definiciones de datos básicos para los objetos, como la verificación de errores en los métodos get y set . [22]

Una pregunta importante al modelar e implementar un sistema de clases de objetos es si una clase puede tener una o más superclases. En el mundo real, con conjuntos reales, sería raro encontrar conjuntos que no se cruzaran con más de un conjunto. Sin embargo, aunque algunos sistemas como Flavors y CLOS brindan la capacidad de que más de un padre lo haga en tiempo de ejecución, introduce una complejidad que muchos en la comunidad orientada a objetos consideran antitética a los objetivos de usar clases de objetos en primer lugar. Comprender qué clase será responsable de manejar un mensaje puede resultar complejo cuando se trata de más de una superclase. Si se usa descuidadamente, esta característica puede introducir parte de la misma complejidad del sistema y las clases de ambigüedad que fueron diseñadas para evitar. [23]

La mayoría de los lenguajes modernos orientados a objetos, como Smalltalk y Java, requieren herencia única en tiempo de ejecución. Para estos lenguajes, la herencia múltiple puede ser útil para modelar pero no para una implementación.

Sin embargo, los objetos de aplicaciones web semánticas tienen múltiples superclases. La volatilidad de Internet requiere este nivel de flexibilidad y los estándares tecnológicos como Web Ontology Language (OWL) están diseñados para respaldarlo.

Una cuestión similar es si la jerarquía de clases se puede modificar o no en tiempo de ejecución. Idiomas como Flavors, CLOS y Smalltalk admiten esta función como parte de sus protocolos de metaobjetos . Dado que las clases son en sí mismas objetos de primera clase, es posible hacer que alteren dinámicamente su estructura enviándoles los mensajes apropiados. Otros lenguajes que se centran más en tipos fuertes, como Java y C++, no permiten modificar la jerarquía de clases en tiempo de ejecución. Los objetos de la web semántica tienen la capacidad de realizar cambios en las clases en tiempo de ejecución. El razonamiento es similar a la justificación para permitir múltiples superclases: Internet es tan dinámica y flexible que se requieren cambios dinámicos en la jerarquía para gestionar esta volatilidad. [24]

Ortogonalidad del concepto de clase y herencia.

Aunque comúnmente se supone que los lenguajes basados ​​en clases soportan la herencia, la herencia no es un aspecto intrínseco del concepto de clases. Algunos lenguajes, a menudo denominados " lenguajes basados ​​en objetos ", admiten clases pero no admiten herencia. Ejemplos de lenguajes basados ​​en objetos incluyen versiones anteriores de Visual Basic .

Dentro del análisis orientado a objetos

En el análisis orientado a objetos y en UML , una asociación entre dos clases representa una colaboración entre las clases o sus instancias correspondientes. Las asociaciones tienen dirección; por ejemplo, una asociación bidireccional entre dos clases indica que ambas clases conocen su relación. [25] Las asociaciones podrán etiquetarse según su nombre o finalidad. [26]

Un rol de asociación recibe el final de una asociación y describe el rol de la clase correspondiente. Por ejemplo, un rol de "suscriptor" describe la forma en que las instancias de la clase "Persona" participan en una asociación de "suscripción" con la clase "Revista". Además, una "Revista" tiene el rol de "revista suscrita" en la misma asociación. La multiplicidad de roles de asociación describe cuántas instancias corresponden a cada instancia de la otra clase de la asociación. Las multiplicidades comunes son "0..1", "1..1", "1..*" y "0..*", donde "*" especifica cualquier número de instancias. [25]

Taxonomía de clases

Hay muchas categorías de clases, algunas de las cuales se superponen.

Abstracto y concreto

En un lenguaje que admite la herencia, una clase abstracta , o clase base abstracta ( ABC ), es una clase de la que no se puede crear una instancia directamente. Por el contrario, una clase concreta es una clase de la que se puede crear una instancia directamente. La creación de instancias de una clase abstracta sólo puede ocurrir indirectamente, a través de una subclase concreta .

Una clase abstracta está etiquetada como tal explícitamente o simplemente especifica métodos abstractos (o métodos virtuales ). Una clase abstracta puede proporcionar implementaciones de algunos métodos y también puede especificar métodos virtuales mediante firmas que serán implementados por descendientes directos o indirectos de la clase abstracta. Antes de que se pueda crear una instancia de una clase derivada de una clase abstracta, todos los métodos abstractos de sus clases principales deben ser implementados por alguna clase en la cadena de derivación. [27]

La mayoría de los lenguajes de programación orientados a objetos permiten al programador especificar qué clases se consideran abstractas y no permitirán que se creen instancias de ellas. Por ejemplo, en Java , C# y PHP , se utiliza la palabra clave abstract . [28] [29] En C++ , una clase abstracta es una clase que tiene al menos un método abstracto dado por la sintaxis apropiada en ese lenguaje (una función virtual pura en el lenguaje de C++). [27]

Una clase que consta únicamente de métodos virtuales puros se denomina clase base abstracta pura (o ABC puro ) en C++ y los usuarios del lenguaje también la conocen como interfaz . [15] Otros lenguajes, en particular Java y C#, admiten una variante de clases abstractas llamada interfaz a través de una palabra clave en el lenguaje. En estos lenguajes no se permite la herencia múltiple , pero una clase puede implementar múltiples interfaces. Una clase de este tipo sólo puede contener métodos abstractos de acceso público. [21] [30] [31]

Local e interior

En algunos idiomas, las clases se pueden declarar en ámbitos distintos al global. Hay varios tipos de tales clases.

Una clase interna es una clase definida dentro de otra clase. La relación entre una clase interna y su clase contenedora también puede tratarse como otro tipo de asociación de clases. Por lo general, una clase interna no está asociada con instancias de la clase adjunta ni instanciada junto con su clase adjunta. Dependiendo del idioma, puede que sea posible o no hacer referencia a la clase desde fuera de la clase adjunta. Un concepto relacionado es el de tipos internos , también conocido como tipo de datos internos o tipo anidado , que es una generalización del concepto de clases internas. C++ es un ejemplo de un lenguaje que soporta tanto clases internas como tipos internos (a través de declaraciones typedef ). [32] [33]

Otro tipo es una clase local , que es una clase definida dentro de un procedimiento o función. Esto limita las referencias al nombre de la clase dentro del ámbito donde se declara la clase. Dependiendo de las reglas semánticas del idioma, pueden existir restricciones adicionales en las clases locales en comparación con las no locales. Una restricción común es no permitir que los métodos de clase locales accedan a las variables locales de la función adjunta. Por ejemplo, en C++, una clase local puede hacer referencia a variables estáticas declaradas dentro de su función adjunta, pero no puede acceder a las variables automáticas de la función . [34]

Metaclases

Las metaclases son clases cuyas instancias son clases. [35] Una metaclase describe una estructura común de una colección de clases y puede implementar un patrón de diseño o describir tipos particulares de clases. Las metaclases se utilizan a menudo para describir marcos . [36]

En algunos lenguajes, como Python , Ruby o Smalltalk , una clase también es un objeto; por tanto, cada clase es una instancia de una metaclase única integrada en el lenguaje. [6] [37] [38] El Common Lisp Object System (CLOS) proporciona protocolos de metaobjetos (MOP) para implementar esas clases y metaclases. [39]

No subclasificable (o sellado)

Las clases no subclasificables o clases selladas permiten a los programadores diseñar clases y jerarquías de clases donde, en algún nivel de la jerarquía, se prohíbe una derivación adicional (una clase independiente también puede designarse como no subclasificable, evitando la formación de cualquier jerarquía). . Compare esto con las clases abstractas , que implican, alientan y requieren el uso de la derivación. Una clase que no se puede subclasificar es implícitamente concreta .

Una clase que no se puede subclasificar se crea declarando la clase como sealeden C# o como finalen Java o PHP. [40] [41] [42] Por ejemplo, la clase de Java Stringse designa como final . [43]

Las clases que no se pueden subclasificar pueden permitir que un compilador (en lenguajes compilados) realice optimizaciones que no están disponibles para las clases que se pueden subclasificar. [44]

Clase abierta

Una clase abierta se puede cambiar. Normalmente, los clientes no pueden cambiar un programa ejecutable . Los desarrolladores a menudo pueden cambiar algunas clases, pero normalmente no pueden cambiar las estándar o integradas. En Ruby , todas las clases están abiertas. En Python , las clases se pueden crear en tiempo de ejecución y todas se pueden modificar posteriormente. [45] Las categorías de Objective-C permiten al programador agregar métodos a una clase existente sin la necesidad de recompilar esa clase o incluso tener acceso a su código fuente.

mezclas

Algunos lenguajes tienen soporte especial para mixins , sin embargo, en cualquier lenguaje con herencia múltiple, un mixin es simplemente una clase que no representa una relación de tipo es-un. Los mixins se suelen utilizar para agregar los mismos métodos a varias clases; por ejemplo, una clase UnicodeConversionMixin podría proporcionar un método llamado unicode_to_ascii cuando se incluye en las clases FileReader y WebPageScraper que no comparten un padre común.

Parcial

En los idiomas que admiten esta característica, una clase parcial es una clase cuya definición se puede dividir en varias partes, dentro de un único archivo de código fuente o en varios archivos. [46] Las piezas se fusionan en tiempo de compilación, lo que hace que la salida del compilador sea la misma que para una clase no parcial.

La principal motivación para la introducción de clases parciales es facilitar la implementación de generadores de código , como los diseñadores visuales . [46] De lo contrario, es un desafío o compromiso desarrollar generadores de código que puedan administrar el código generado cuando se intercala dentro del código escrito por el desarrollador. Al utilizar clases parciales, un generador de código puede procesar un archivo separado o una clase parcial de grano grueso dentro de un archivo y, por lo tanto, se evita la necesidad de interponer intrincadamente el código generado mediante un análisis extenso, lo que aumenta la eficiencia del compilador y elimina el riesgo potencial de corromper el código del desarrollador. En una implementación simple de clases parciales, el compilador puede realizar una fase de precompilación donde "unifica" todas las partes de una clase parcial. Luego, la compilación puede continuar como de costumbre.

Otros beneficios y efectos del rasgo de clase parcial incluyen:

Las clases parciales han existido en Smalltalk bajo el nombre de Class Extensions durante un tiempo considerable. Con la llegada de .NET framework 2 , Microsoft introdujo clases parciales, compatibles tanto con C# 2.0 como con Visual Basic 2005 . WinRT también admite clases parciales.

No instanciable

Las clases no instanciables permiten a los programadores agrupar campos y métodos por clase a los que se puede acceder en tiempo de ejecución sin una instancia de la clase. De hecho, la creación de instancias está prohibida para este tipo de clase.

Por ejemplo, en C#, una clase marcada como "estática" no puede tener instancias, solo puede tener miembros estáticos (campos, métodos, otros), no puede tener constructores de instancias y está sellada .[47]

Sin nombre

Una clase sin nombre o una clase anónima es una clase que no está vinculada a un nombre o identificador en el momento de su definición. [48] ​​[49] Esto es análogo a funciones con nombre versus funciones sin nombre .

Beneficios

Los beneficios de organizar el software en clases de objetos se dividen en tres categorías: [50]

Las clases de objetos facilitan un desarrollo rápido porque reducen la brecha semántica entre el código y los usuarios. Los analistas de sistemas pueden hablar tanto con desarrolladores como con usuarios usando esencialmente el mismo vocabulario, hablando de cuentas, clientes, facturas, etc. Las clases de objetos a menudo facilitan un desarrollo rápido porque la mayoría de los entornos orientados a objetos vienen con poderosas herramientas de depuración y prueba. Las instancias de clases se pueden inspeccionar en tiempo de ejecución para verificar que el sistema esté funcionando como se esperaba. Además, en lugar de obtener volcados de memoria central, la mayoría de los entornos orientados a objetos han interpretado capacidades de depuración para que el desarrollador pueda analizar exactamente en qué parte del programa ocurrió el error y pueda ver qué métodos fueron llamados para qué argumentos y con qué argumentos. [51]

Las clases de objetos facilitan el mantenimiento mediante la encapsulación. Cuando los desarrolladores necesitan cambiar el comportamiento de un objeto, pueden localizar el cambio solo en ese objeto y sus componentes. Esto reduce la posibilidad de que se produzcan efectos secundarios no deseados debido a las mejoras en el mantenimiento.

La reutilización de software también es un beneficio importante del uso de clases de objetos. Las clases facilitan la reutilización a través de herencia e interfaces. Cuando se requiere un nuevo comportamiento, a menudo se puede lograr creando una nueva clase y haciendo que esa clase herede los comportamientos y datos predeterminados de su superclase y luego adaptando algún aspecto del comportamiento o datos en consecuencia. La reutilización a través de interfaces (también conocidas como métodos) ocurre cuando otro objeto quiere invocar (en lugar de crear un nuevo tipo de) alguna clase de objeto. Este método de reutilización elimina muchos de los errores comunes que pueden aparecer en el software cuando un programa reutiliza el código de otro. [52]

Representación en tiempo de ejecución

Como tipo de datos, una clase generalmente se considera una construcción en tiempo de compilación. [53] Un lenguaje o biblioteca también puede admitir metaobjetos prototipo o de fábrica que representan información en tiempo de ejecución sobre clases, o incluso representar metadatos que brindan acceso a funciones de reflexión y la capacidad de manipular formatos de estructura de datos en tiempo de ejecución. Muchos lenguajes distinguen este tipo de información en tiempo de ejecución sobre clases de una clase basándose en que la información no es necesaria en tiempo de ejecución. Algunos lenguajes dinámicos no hacen distinciones estrictas entre construcciones en tiempo de ejecución y en tiempo de compilación y, por lo tanto, es posible que no distingan entre metaobjetos y clases.

Por ejemplo, si Human es un metaobjeto que representa la clase Persona, entonces se pueden crear instancias de la clase Persona utilizando las funciones del metaobjeto Human .

Ver también

Notas

  1. ^ En muchos idiomas, el nombre de la clase se usa como el nombre de la clase (la plantilla misma), el nombre del constructor predeterminado de la clase (una subrutina que crea objetos) y como el tipo de objetos generados al crear una instancia de la clase. ; Estos conceptos distintos se combinan fácilmente. [2] Aunque, hasta el punto de combinarlo, se podría argumentar que es una característica inherente a un lenguaje debido a su naturaleza polimórfica y por qué estos lenguajes son tan poderosos, dinámicos y adaptables para su uso en comparación con los lenguajes sin polimorfismo presente. De este modo, pueden modelar sistemas dinámicos (es decir, el mundo real, el aprendizaje automático, la IA) más fácilmente.
  1. ^ ab Gamma y col. 1995, pág. 14.
  2. ^ ab Bruce 2002, 2.1 Objetos, clases y tipos de objetos, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18.
  3. ^ "¿Qué es una instancia? - Definición de WhatIs.com". Whatis.techtarget.com . Consultado el 9 de febrero de 2014 .
  4. ^ Amir, Masroor (25 de marzo de 2023). "POO - Programación orientada a objetos - Conceptos | Idiomas | Beneficios [2023]". El robot friki | Un sitio de informática para geeks . Consultado el 4 de abril de 2023 .
  5. ^ Gamma y col. 1995, pág. 17.
  6. ^ ab "3. Modelo de datos". La referencia del lenguaje Python . Fundación de software Python . Consultado el 26 de abril de 2012 .
  7. ^ Booch 1994, pág. 86-88.
  8. ^ "Clases (I)". Tutorial de lenguaje C++ . cplusplus.com . Consultado el 29 de abril de 2012 .
  9. ^ "Clases (II)". Tutorial de lenguaje C++ . cplusplus.com . Consultado el 29 de abril de 2012 .
  10. ^ Booch 1994, pág. 105.
  11. ^ Jamrich, Parsons, junio (22 de junio de 2015). Nuevas perspectivas conceptos informáticos, 2016. Integral . Boston, MA. ISBN 9781305271616. OCLC  917155105.{{cite book}}: CS1 maint: location missing publisher (link) CS1 maint: multiple names: authors list (link)
  12. ^ ab "Control del acceso a los miembros de una clase". Los tutoriales de Java . Oráculo . Consultado el 19 de abril de 2012 .
  13. ^ "OOP08-CPP. No devolver referencias a datos privados". Estándar de codificación segura CERT C++ . Universidad de Carnegie mellon. 2010-05-10. Archivado desde el original el 3 de octubre de 2015 . Consultado el 7 de mayo de 2012 .
  14. ^ Ben-Ari, Mordejai (24 de enero de 2007). "2.2 Identificadores" (PDF) . Errores de compilación y tiempo de ejecución en Java . Archivado (PDF) desde el original el 18 de octubre de 2011 . Consultado el 7 de mayo de 2012 .
  15. ^ ab Salvaje, Fred. "Interfaces C ++". Dr. Dobb . Web técnica de la UBM . Consultado el 2 de mayo de 2012 .
  16. ^ Tomás; Caza. "Clases, objetos y variables". Programación Ruby: la guía pragmática del programador . Ruby-Doc.org . Consultado el 26 de abril de 2012 .
  17. ^ "Amistad y herencia". Tutorial de lenguaje C++ . cplusplus.com . Consultado el 26 de abril de 2012 .
  18. ^ Booch 1994, pág. 180.
  19. ^ Booch 1994, pág. 128-129.
  20. ^ Booch 1994, pág. 112.
  21. ^ ab "Interfaces". Los tutoriales de Java . Oráculo . Consultado el 1 de mayo de 2012 .
  22. ^ Berfeld, Marya (2 de diciembre de 2008). "Transformación de UML a Java en las ediciones de IBM Rational Software Architect y software relacionado". IBM . Consultado el 20 de diciembre de 2013 .
  23. ^ Jacobsen, Ivar; Magnus Christerson; Patrik Jonsson; Gunnar Overgaard (1992). Ingeniería de Software Orientada a Objetos. Prensa Addison-Wesley ACM. págs. 43–69. ISBN 0-201-54435-0.
  24. ^ Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Wallace, Evan (9 de marzo de 2006). "Una introducción a la web semántica para desarrolladores de software orientado a objetos". W3C . Consultado el 30 de julio de 2008 .
  25. ^ ab Bell, Donald. "Conceptos básicos de UML: el diagrama de clases". Obras del desarrollador . IBM . Consultado el 2 de mayo de 2012 .
  26. ^ Booch 1994, pág. 179.
  27. ^ ab "Polimorfismo". Tutorial de lenguaje C++ . cplusplus.com . Consultado el 2 de mayo de 2012 .
  28. ^ "Clases y métodos abstractos". Los tutoriales de Java . Oráculo . Consultado el 2 de mayo de 2012 .
  29. ^ "Abstracción de clase". Manual PHP . El grupo PHP . Consultado el 2 de mayo de 2012 .
  30. ^ "Interfaces (Guía de programación de C#)". Guía de programación de C# . Microsoft . Consultado el 15 de agosto de 2013 .
  31. ^ "Herencia (Guía de programación de C#)". Guía de programación de C# . Microsoft . Consultado el 2 de mayo de 2012 .
  32. ^ "Clases anidadas (solo C++)". XL C/C++ V8.0 para AIX . IBM . Consultado el 7 de mayo de 2012 .
  33. ^ "Nombres de tipos locales (solo C++)". XL C/C++ V8.0 para AIX . IBM . Consultado el 7 de mayo de 2012 .
  34. ^ "Clases locales (solo C++)". XL C/C++ V8.0 para AIX . IBM . Consultado el 7 de mayo de 2012 .
  35. ^ Booch 1994, pág. 133-134.
  36. ^ "13 clases y metaclases". pharo.gforge.inria.fr . Archivado desde el original el 24 de febrero de 2021 . Consultado el 31 de octubre de 2016 .
  37. ^ Tomás; Caza. "Clases y Objetos". Programación Ruby: la guía pragmática del programador . Ruby-Doc.org . Consultado el 8 de mayo de 2012 .
  38. ^ Booch 1994, pág. 134.
  39. ^ "MOP: Conceptos". El protocolo MetaObject del sistema de objetos Common Lisp . Asociación de Usuarios de Lisp. Archivado desde el original el 15 de noviembre de 2010 . Consultado el 8 de mayo de 2012 .
  40. ^ "sellado (referencia C#)". Referencia de C# . Microsoft . Consultado el 8 de mayo de 2012 .
  41. ^ "Métodos y clases finales de redacción". Los tutoriales de Java . Oráculo . Consultado el 8 de mayo de 2012 .
  42. ^ "PHP: palabra clave final". Manual PHP . El grupo PHP . Consultado el 21 de agosto de 2014 .
  43. ^ "Cadena (Plataforma Java SE 7)". Plataforma Java, edición estándar 7: especificación API . Oráculo . Consultado el 8 de mayo de 2012 .
  44. ^ Brand, Sy (2 de marzo de 2020). "Los beneficios de rendimiento de las clases finales". Blog del equipo de Microsoft C++ . Microsoft . Consultado el 4 de abril de 2020 .
  45. ^ "9. Clases". El tutorial de Python . Python.org . Consultado el 3 de marzo de 2018 . Como ocurre con los módulos, las clases participan de la naturaleza dinámica de Python: se crean en tiempo de ejecución y se pueden modificar aún más después de la creación.
  46. ^ ab mairaw; Bill Wagner; tompratt-AQ (19 de septiembre de 2015), "Clases y métodos parciales", Guía de programación de C# , Microsoft , consultado el 8 de agosto de 2018
  47. ^ "Clases estáticas y miembros de clases estáticas (Guía de programación de C#)". Guía de programación de C# . Microsoft . Consultado el 8 de mayo de 2012 .
  48. ^ "Clases anónimas (Tutoriales de Java™ > Aprendizaje del lenguaje Java > Clases y objetos)". docs.oracle.com . Consultado el 13 de mayo de 2021 .
  49. ^ "PHP: Clases anónimas - Manual". www.php.net . Consultado el 11 de agosto de 2021 .
  50. ^ "¿Qué es un objeto?". oracle.com . Corporación Oráculo . Consultado el 13 de diciembre 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álisis y Diseño Orientado a Objetos con Aplicaciones. Profesional de Addison-Wesley. págs. 1–28. ISBN 978-0-201-89551-3. Consultado el 20 de diciembre de 2013 . Existen factores limitantes fundamentales de la cognición humana; Podemos abordar estas limitaciones mediante el uso de descomposición, abstracción y jerarquía.
  52. ^ Jacobsen, Ivar; Magnus Christerson; Patrik Jonsson; Gunnar Overgaard (1992). Ingeniería de Software Orientada a Objetos. Prensa Addison-Wesley ACM. ISBN 0-201-54435-0.
  53. ^ "Estándar internacional C++" (PDF) . Borrador de trabajo, estándar para el lenguaje de programación C++ . ISO/IEC JTC1/SC22 WG21. Archivado (PDF) desde el original el 9 de diciembre de 2017 . Consultado el 5 de enero de 2020 .

Referencias

Otras lecturas