En general, es bueno evitar palabras como "manejar" o "procesar" como parte de los nombres de rutina y nombres de clase, a menos que se trate de (por ejemplo) identificadores de archivos o (por ejemplo) procesos unix. Sin embargo, las clases abstractas a menudo no saben qué van a hacer con algo además de, por ejemplo, procesarlo. En mi situación actual, tengo un "EmailProcessor" que inicia sesión en la bandeja de entrada de un usuario y procesa los mensajes de esta. No tengo muy claro cómo darle un nombre más preciso, aunque he notado que surge la siguiente cuestión de estilo:
- ¿Es mejor tratar las clases derivadas como clientes y nombrar la clase base por la parte de la funcionalidad que implementa? Le da más significado pero violará is-a. Por ejemplo, EmailAcquirer sería un nombre razonable ya que está adquiriendo para la clase derivada, pero la clase derivada no lo estará para nadie.
- O simplemente un nombre realmente vago, ya que quién sabe lo que harán las clases derivadas. Sin embargo, "Procesador" sigue siendo demasiado general ya que está realizando muchas operaciones relevantes, como iniciar sesión y usar IMAP.
¿Alguna salida a este dilema?
El problema es más evidente para los métodos abstractos, en los que realmente no puede responder la pregunta "¿qué hace esto?" porque la respuesta es simplemente "lo que el cliente quiera".
fuente
Respuestas:
El problema no es el nombre, sino que estás poniendo demasiado en una clase.
En su clase de ejemplo, algunas partes son muy concretas (cómo se obtendrán los correos). Otras partes son muy abstractas (lo que harás con los correos).
Es mejor hacer esto con clases separadas, que con la herencia.
Yo sugiero:
un MessageIterator abstracto, subclasificado por un POPMailBoxDownloader
otra clase que posee un POPMailBoxDownloader y hace algo con los mensajes.
fuente
Si no puedo encontrar un buen nombre para una clase, escribo una documentación de código en línea para la clase. Describe el propósito de la clase en una esencia. Por lo general, puedo derivar un buen nombre para la clase de esta descripción. Esto también es útil para las clases abstractas.
Si la descripción de la clase es "Inicia sesión en la bandeja de entrada de un usuario y procesa mensajes de ella", sugeriría "InboxProcessor" como nombre de clase. Si una clase derivada tiene "Inicia sesión en la bandeja de entrada de un usuario y mueve el correo electrónico no deseado a una carpeta de correo no deseado" como descripción, elegiría "InboxSpamMover" como nombre.
No veo un problema cuando uso nombres genéricos como "procesador" si refleja el propósito genérico de una clase abstracta.
Si tiene problemas para describir el propósito de una clase en una o dos escenas, puede que tenga un problema de diseño. Tal vez la clase está haciendo demasiado y viola el Principio de responsabilidad única . Esto también se aplica a las clases abstractas.
fuente
Parafraseando a Frank Zappa, es lo que es y debe llamarse así. Su ejemplo simplemente no profundiza lo suficiente en qué tipo de procesamiento está ocurriendo. ¿Es un
EmailToTroubleTicketProcessor
, unEmailGrammarCorrector
o unEmailSpamDetector
?Eso no es exactamente cierto; la pregunta que no puede responder para algo abstracto es " ¿cómo hace lo que hace?" porque eso es específico de implementación. Si una
EmailSender
clase tiene unDeliveryStatus deliver(Email e)
método, hay un contrato implícito de que una implementación tomará un correo electrónico, tratará de entregarlo y devolverá algún estado sobre cómo fue. No le importa si se conecta a un servidor SMTP o si lo imprime para amarrarlo a una paloma mensajera, siempre que la implementación cumpla lo prometido. Los resúmenes simplemente cuantifican esa promesa para que una implementación pueda decir, "sí, hago eso".fuente
void doWhatYouDoWith(Email e)
, aún podría llamar a la clase unEmailDisposer
, que es lo suficientemente específico como para decir lo que hace, pero lo suficientemente general como que depende de la implementación. Aunque creo que @KrisVanBael lo logró: si ha recurrido a algo tan ambiguo, puede haber demasiado bajo un mismo techo.Piensa por qué es malo usar esas palabras. ¿Son descriptivos? ¿Qué palabras hay para describir las clases? EmailBaseClass? ¿Podría ser más descriptivo que decir EmailManager o algo similar? La clave es tener una idea de la clase en cuestión, así que encuentra los verbos o sustantivos adecuados. Trata tu código como si fuera poesía.
fuente
int age
"ageInteger", incluso peor, ya que esperaría obtener correos electrónicos de texto sin formato, correos electrónicos MIME, etc. No es necesario describir lo que está precedido por la palabraabstract
en primer lugar (esto es Java). ¿Tiene alguna idea particular para la parte base de esta clase? Y una mayor comprensión aún no resuelve el problema de nombrar algo que va a estar cruzando una relación is-a, puedo tener algo demasiado vago o demasiado general, no veo una salida de esto a menos que haya tenido más perspicacia para tener más perspicacia.ageInteger
o algo así es realmente apropiado. La notación húngara es una versión abreviada de un contexto en el que sucedió mucho. Ciertamente, hay momentos en los que puede necesitar algo en la misma líneaageNumeric
yageString
en el mismo ámbito, con una indicación del tipo en el nombre que es la forma más fácil y clara de desambiguar.systemController
es una clase base abstracta o una hoja en una gran jerarquía. Por supuesto, esto puede remediarse con IDE (como supongo que es el caso con la mayoría del desarrollo de Java), que puede informar inmediatamente al usuario sobre el contenido y la estructura de la clase, por lo que los nombres perspicaces no pueden justificarse de manera similar.