¿Por qué no prefijos Enums, clases abstractas y estructuras?

11

La comunidad C # ha utilizado de manera tan ubicua el prefijo "I" para denotar una interfaz que incluso los programadores más inexpertos saben usar.

¿Por qué entonces no prefijamos enumeraciones, clases abstractas o estructuras (posiblemente con "E", "A" y "S" respectivamente)?

Por ejemplo, si marcamos todas las clases abstractas con una "A", proporcionaría información valiosa sobre ese tipo que, aunque podría inferirse, no es inmediatamente obvio.

Tenga en cuenta que no estoy abogando por este cambio, solo estoy tratando de entender por qué no hacemos las cosas de esta manera.

Este hilo responde por qué usamos el prefijo "I" pero no responde por qué no usamos otros prefijos.

Stephen
fuente
3
Votaría por el cierre duplicado, pero la respuesta está en SO stackoverflow.com/questions/111933/…
Euphoric
1
@Euphoric: esta pregunta es mucho más específica.
reinierpost
Las enumeraciones de la OMI deben evitarse (reemplazadas por miembros públicos de solo lectura estática (patrón de enumeración)), las clases abstractas deben tener el sufijo "base" y las estructuras deben tener minúsculas como convención de nomenclatura, pero como .NET no hace eso, simplemente se vuelve confuso si hace que las estructuras sean minúsculas, ya que nunca serán consistentes.
Dave Cousineau el
¿Por qué evitarías usar enumeraciones a favor de crear enumeraciones psuedo?
Stephen

Respuestas:

27

El objetivo de la convención de nomenclatura para las interfaces es proporcionar una decisión rápida y sin cerebro sobre cómo llamar a la interfaz que implementa su clase. Si tiene un Frobnicator, pero tiene que declarar una interfaz para desacoplarse o por cualquier motivo, entonces la decisión de llamarlo no IFrobnicatorrequiere un pensamiento consciente, y esto es bueno.

El mismo problema no se aplica a las otras construcciones que nombre. Las enumeraciones y las estructuras son útiles, pero no es necesario encontrar un segundo nombre corto, transparente y obviamente relacionado, además del nombre en sí. Por lo tanto, no hay presión para colocar una 'E' en el nombre de una enumeración o estructura.

(Las clases abstractas son algo similares a las interfaces, ya que debe proporcionar una segunda clase concreta para hacer cualquier cosa, por lo que podrían haber adquirido una convención de comenzar con 'A', pero por cualquier razón, no lo hicieron. Se me permite especular, creo que 'yo' siendo una carta particularmente estrecha podría haber tenido algo que ver con eso).

Kilian Foth
fuente
55
+1 Esta es la respuesta que hubiera escrito. Me señalar sin embargo que las clases abstractas ya tienen un convenio de denominación perfectamente cromulent, donde la clase abstracta es nombrado AnimalBasey sabores distintos son AnimalGiraffe, AnimalLionetc
binario Worrier
Vale la pena mencionar que muchas interfaces Java no usan 'I' List, ya que son muy técnicamente nombradas ArrayListy LinkedListson los nombres de las implementaciones. (C #, creo, tiene IListcomo interfaz y Listcomo la lista de matriz)
Katana314
Me pregunto si podría haber sido útil, cuando Microsoft recomendó que las variables de tipos de estructura "mutable" recibieran un prefijo particular, para evitar confusiones sobre si Point p = myPoints[3]; p.X += 3;afectaría myPoints[3].X. Retrospectivamente, hubiera preferido que C # se usara var->fieldpara acceso de campo de clase y var.fieldpara acceso de campo de estructura, pero obviamente no es así. Aún así, parecería que algunos medios a simple vista para distinguirlos serían útiles.
supercat
1

Creo que no se usa mucho porque:

  • la mayoría de las veces no importa mucho si es una enumeración, o una clase abstracta o una estructura
  • si lo hace, probablemente pueda verlo por el uso y descubrirlo bastante rápido
  • si lo cambio como una enumeración, clase abstracta o estructura, también tengo que cambiarle el nombre
  • Para las personas que no conocen la convención, es puro ruido.
  • la gente podría simplemente descartar toda la idea porque se les ha enseñado a no usar la notación húngara. Ha habido y aún hay personas que dicen que no debe usar la notación Hungarion, sin hacer la distinción entre Apps Hungarian y Systems Hungarian. Una buena discusión se puede encontrar en esta pregunta SO . No solo la primera respuesta es interesante sino que hay excelentes respuestas y comentarios. De esa misma pregunta surge este artículo de Joel Spolsky (vaya al párrafo "Soy Hungría")

en resumen: en general, el valor agregado no se suma al costo.

De ese último punto y de alguna interpretación que podría concluir. El sistema húngaro (tipo de prefijo) es malo y no debe usarse. Apps húngaro (tipo de prefijo) tiene usos.

Retomando su pregunta, creo que su notación propuesta es una forma de aplicaciones húngaras y si cree que el valor agregado se suma a los costos y lo implementa consistentemente en su base de código, está bien. Pero como debe considerarlo por proyecto, no debería ser una regla general.

Supongo que la gente notó que era más importante para las interfaces y es por eso que se ha convertido en una regla general para las interfaces.

KeesDijk
fuente
-1

Solo un pensamiento (con suerte aplicable):

Hay una tendencia obvia hacia la "codificación de interfaces" en lugar de clases concretas. "Hoy en día" casi parece más beneficioso tener una convención de nomenclatura para las clases, como comenzar con una 'C', en lugar de tener la letra 'I' para la interfaz.

Acabo de terminar un proyecto Java en el que todas las interfaces se llamaban realmente Modelo ... Sí, la convención del nombre de la interfaz era terminar el nombre con 'Modelo' ... luego tener algún tipo de 'DataTransferObject / DTO' implementar la interfaz como :

public interface SomethingModel{
}

public class Something implements SomethingModel{
    //lets not line up braces and make it hard to read
    //at least it saves one line
}

mientras que en C #

public interface ISomething{}

public class SomethingModel : ISomething
{
   //i can read this
}

Cambié el cableado de mi cerebro para mantener ese dolor directo, pero puedo ver cómo podría ayudar pensar en términos de programación en la interfaz.

Judson
fuente