generics - mexico - norma fda
¿Por qué los genéricos se llaman genéricos? (9)
A riesgo de convertirse en el idiota de la aldea, ¿alguien me puede explicar por qué los genéricos se llaman genéricos? Entiendo su uso y beneficios, pero si la definición de genérico es "general" y las colecciones genéricas son de tipo seguro, ¿por qué no es este un nombre inapropiado?
Por ejemplo, una ArrayList puede contener cualquier cosa que sea un objeto:
ArrayList myObjects = new ArrayList();
myObjects.Add("one");
myObjects.Add(1);
mientras que una colección genérica de tipo cadena solo puede contener cadenas:
var myStrings = new List<string>();
myStrings.Add("one");
myStrings.Add("1");
No tengo claro por qué se llama "genérico". Si la respuesta es "... que permite diseñar clases y métodos que difieren la especificación de uno o más tipos hasta que la clase o el método se declara e instancia por código de cliente". desde aquí , entonces supongo que tiene sentido. Tal vez estoy teniendo este lapso mental porque solo comencé a programar después de que Java introdujo los genéricos, así que no recuerdo un momento antes que ellos. Pero aún...
Cualquier ayuda es apreciada.
"Genérico" está hablando de la implementación. Usted escribe una única implementación de lista "genérica" que funciona con cualquier tipo, en lugar de tener que escribir implementaciones específicas para cada tipo que desee utilizar.
Bien, tómenlo con un grano de sal, porque estoy totalmente adivinando, pero me pregunto si podría ser una bastardización de "Tipos generativos".
Conceptualmente, cuando especializas una Lista en una Lista <String>, genera un nuevo tipo. Al menos, así es como funciona en las plantillas C ++ y en los genéricos C #.
En Java, dado que el compilador descarta las parametrizaciones mediante borrado de tipo, en realidad no genera un nuevo tipo especializado, así que, ¿quién sabe?
Supongo que se podría decir que Java implementa una versión genérica de tipos generativos :)
EN EDITAR:
Aquí hay otro punto de vista ...
El tipo List <String> no es de lo que están hablando cuando se refieren a un tipo "genérico". Creo que la terminología se está refiriendo realmente al tipo List <T>, que es como el tipo existe en su forma genérica. List <String> es una especialización de la Lista genérica <T>.
No quiero entrar en la semántica del lenguaje (inglés, no java), y a riesgo de responderte con una tautología; un método genérico se llama genérico porque, como dijiste, se puede usar en sentido general, no tiene un tipo específico, se puede usar en general
No soy un hablante de inglés "nativo", así que podría estar equivocado, pero el objetivo de los "genéricos" es que defina los tipos de genéricos, ¿no?
Porque está creando un código "genérico" que podrá operar en cualquier tipo (dentro de las restricciones que especifique) de la misma manera ...
un buen ejemplo con el que está familiarizado es que el operador Agregar es casi cualquier idioma ... puede "Agregar" enteros, flotantes, dobles, decimales, binarios, hexadecimales, independientemente de si están firmados, no seleccionados, cuántos bits son , etc ...
Si lo llamaran "tipo de parámetro (s)", la gente lo confundiría con parámetros del tipo Tipo.
Además, ArrayList no es "genérico". SÓLO funciona con tipos de objetos. Si le pide algo, le dará una referencia de objeto. Ese es un comportamiento muy específico.
Una clase que toma objetos NO es genérica, está tomando específicamente un tipo que es en sí mismo un tipo genérico. Una clase genérica, por otro lado, se puede usar con cualquier tipo específico.
Creo que la respuesta correcta a preguntas como esta casi siempre es "razones históricas, en su mayoría". Los genéricos también podrían haber sido llamados "esquemas" o "clases" o "familias de tipos" o "géneros" o "funciones tipo" o "estáticas" o "tipos griegos" o cualquiera de un millón de otras cosas. Hace mucho tiempo, alguien decidió usar la palabra "genérico", y se estancó.
"Genérico" en el sentido de Java se remonta al menos hasta mediados de la década de 1970. El Departamento de Defensa de EE. UU. Estaba perfeccionando un documento de requisitos para su nuevo lenguaje de programación (lo que se convertiría en ADA). Un primer borrador ( "Woodenman" , agosto de 1975) dice:
Los parámetros de tiempo de compilación son necesarios en los lenguajes extensibles para permitir la especificación de procedimientos genéricos y estructuras de datos como apilamientos y colas sin repetir la definición para cada tipo de elemento.
Este es el único uso de "genérico" en el documento. No está claro para mí cómo se pretendía. Pero en julio de 1977 ( "Tinman" ) había un párrafo completo sobre genéricos, y el término claramente había llegado a significar algo específico:
12D. DEFINICIONES GENÉRICAS
Deberá ser posible definir funciones, procedimientos y tipos con parámetros que se instancian durante la traducción en cada llamada. Dichos parámetros pueden ser cualquier identificador definido (incluidos los de variables, funciones o tipos), una expresión o una declaración. Estos parámetros, como todos los demás parámetros, se evaluarán en el contexto de la llamada.
En junio de 1978 ( "Steelman" ) se estableció la jerga; hubo otros usos del término "genérico" en otras secciones del documento, haciendo referencia clara a esta característica. En el lenguaje terminado, generic
era una palabra reservada.
Los autores de estos documentos se enumeran en el sitio y, presumiblemente, la mayoría todavía existen. Sería estupendo llamarlos y preguntarles qué recuerdan.
El primer uso plausiblemente relacionado de "genérico" que encontré en la academia fue en Robin Milner "Una teoría del tipo de polimorfismo en la programación" (1978) (y se siente obligado a explicar lo que quiere decir con "genérico", por lo que no puede sido de uso común en la academia en ese momento):
Entonces este es el tipo genérico de mapa , es decir, a cualquier ocurrencia de mapa dentro del alcance de esta declaración se le debe asignar alguna instancia de sustitución de este tipo.
"Variable de tipo genérico" se convirtió en jerga de CS.
bool Equals(int x, int y)
El método anterior solo puede comparar números enteros, por lo que podemos decir que está especializado para comparar números enteros.
bool Equals<T>(T x, T y);
El método anterior puede comparar valores de cualquier tipo, por lo que podemos decir que no está especializado para ningún tipo en particular, es genérico .