2012-07-02 15 views
8

Recientemente escribí una biblioteca de clases que incluye algunos objetos que modelan ciertos tipos de archivos. Por ejemplo, no es una clase abstracta Document, con las clases derivadas PdfDocument (hormigón) y OfficeDocument (abstracto, con clases concretas derivadas tales como WordDocument y ExcelDocument), etc.¿Quién debería ser responsable de seleccionar la clase derivada apropiada?

actualmente la forma clientes crear un nuevo objeto es mediante la selección de la clase derivada apropiada y pasándola la matriz de bytes. Así, por ejemplo, si tengo una matriz de bytes de un PdfDocument y una WordDocument, me gustaría hacer algo como:

var wordDocument = new WordDocument(wordDocumentByteArray); 
var pdfDocument = new PdfDocument(pdfDocumentByteArray); 

Es este diseño aceptable, que el cliente debe saber qué clase deriva de usar? ¿O sería mejor ocultar todas las clases salvo la abstracta Document y usar algo como un patrón abstracto de fábrica para devolver el tipo derivado correcto? ej .:

var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx"); 
// pass file extension so we know what the file is 

Tenga en cuenta que los tipos derivados no añadir propiedades/métodos adicionales para la clase abstracta, que acaba de poner en práctica los métodos abstractos de diferentes maneras.

+0

Definitivamente la 2da opción. Permite una extensibilidad mucho más fácil en el futuro y significa que las personas pierden menos tiempo actualizando las declaraciones de clase cuando se agregan tipos nuevos y más apropiados. –

+0

¿La clase 'Document' tiene todo lo que el usuario final tendrá que hacer con un' Documento' determinado, o de vez en cuando (o con frecuencia) necesitará acceso a la funcionalidad que es específica para un tipo más derivado? – Servy

+0

@Servy Sí, la clase 'Document' tiene un método de resumen público. Todas las clases derivadas consisten solo en métodos de ayuda protegidos y privados (más el método público anulado) con el único propósito de implementar el único método público. – Andrew

Respuesta

9

El segundo enfoque es mucho mejor que el primero, porque oculta el hecho mismo de la existencia de documentos Word y PDF de los usuarios de su biblioteca. Esto se vuelve especialmente importante cuando decide agregar más tipos de documentos, p. Rtf, Html, etc.: los usuarios obtendrían los beneficios de los tipos recién agregados sin tener que volver a compilar su código. De hecho, ni siquiera notarían que ha cambiado algo: si se hace bien, su código "solo funcionará" con los documentos de tipo que nunca supieron que existían.

P.S. Si puede escanear el conjunto de bytes y averiguar el tipo correcto de él, su API puede "ganar algunos puntos por estilo" al eliminar el segundo parámetro.

+0

Gracias. Definitivamente voy a ver si puedo averiguar el tipo de la matriz de bytes, la única razón por la que agregué la extensión en mi ejemplo fue porque a partir de una investigación muy breve parecía que no había un método seguro para determinar el archivo escriba desde la representación binaria todo el tiempo. – Andrew

3

Si los tipos derivados no agregan ninguna propiedad/método y tiene la capacidad técnica de determinar qué tipo usar para un byte dado [], ni siquiera haría que las clases derivadas sean públicas ... simplemente aumentan la superficie de las cosas que el consumidor tendrá que analizar al aprender su biblioteca. Solo tiene un método de fábrica estático como public static Document OpenDocument(byte[] data) en la clase de documento.

+0

Gracias. Iré con el método de fábrica en lugar de una fábrica abstracta (lo que parece exagerado por lo que necesito lograr). – Andrew

+0

* "Si los tipos derivados no agregan ninguna propiedad/método" * Eso es bastante grande "si". Hay muchas cosas que posiblemente podrían hacerse con un tipo de archivo conocido que no se puede hacer con un "Documento" genérico. – Servy

+0

@Servy Estoy de acuerdo, pero para el propósito de mi biblioteca, que no mencioné en la pregunta, todo lo que hace es hacer algunas modificaciones a los datos binarios.La funcionalidad es bastante específica, así que en este caso creo que la suposición es correcta (la única necesidad para las clases derivadas en primer lugar es porque los cambios y su implementación varían según el tipo de archivo). – Andrew

Cuestiones relacionadas