2009-06-03 24 views
31

Descomposición funcional, ¿para qué es útil y cuáles son sus ventajas y desventajas? ¿Dónde hay algunos ejemplos trabajados de cómo se usa?¿Qué es la descomposición funcional?

+11

Lo pregunté porque todavía no hay una respuesta en SO, y hay algunas críticas de FD como método de diseño en http://stackoverflow.com/questions/250044/design-pattern-or-code-smell-denormalised -data-as-a-result-of-functional-decompo/250132 # 250132 –

+23

¿Dónde dice que no se debe hacer ninguna pregunta sobre SO a menos que tenga pocos hits en Google? –

Respuesta

54

Descomposición funcional es el proceso de tomar un proceso complejo y descomponerlo en partes más pequeñas y simples.

Por ejemplo, piense en usar un cajero automático. Se podría descomponer el proceso en:

  1. caminar hasta el cajero automático

  2. Inserte su tarjeta bancaria

  3. introduzca el PIN de

así ... se obtiene la punto.

Puede pensar en programar de la misma manera. Piense en el software que se ejecuta que ATM:

Código
  1. para la lectura de la tarjeta

  2. verificación del PIN

  3. proceso de transferencia

Cada uno de los cuales se puede dividir aún más. Una vez que ha llegado a las piezas más descompuestas de un subsistema, puede pensar cómo comenzar a codificar esas piezas. Luego, componen esas partes pequeñas en el todo mayor. Echa un vistazo a este artículo de Wikipedia:

Decomposition (programming)

El beneficio de descomposición funcional es que una vez que comience la codificación, se está trabajando en los componentes más simples que posiblemente puede trabajar para su aplicación. Por lo tanto, desarrollar y probar esos componentes se vuelve mucho más fácil (sin mencionar que es más capaz de diseñar su código y proyectarlo para satisfacer sus necesidades).

El inconveniente obvio es la inversión de tiempo. Para realizar la descomposición funcional en un sistema complejo se necesita más que una cantidad trivial de tiempo ANTES de que comience la codificación.

Personalmente, creo que la cantidad de tiempo vale la pena.

+0

Me gustaría agregar que no solo se usa para descomponer procesos en sus funciones, sino que también se puede usar para descomponer todo un sistema en sus funciones más pequeñas. Cuando se usa correctamente, una descomposición funcional puede ser una de las formas más rápidas de especificar el alcance y la funcionalidad del sistema, comunicarse y lograr un acuerdo entre los diferentes interesados. Normalmente a las personas se les enseña a hacer uso de un diagrama, similar a un WBS, pero en mi experiencia, las listas de viñetas jerárquicas se comunican con la misma eficacia y es mucho más fácil y rápido redactar y editar. –

3

Aquí hay un ejemplo: su compilador de C.

Primero está el preprocesador: maneja #include y #define y todas las macros. Le das un nombre de archivo y algunas opciones y devuelve una cadena realmente larga. Llamemos a esta función preprocess(filename).

Luego está el analizador léxico. Toma una cuerda y la divide en tokens. Llámalo lex(string). El analizador toma símbolos y los convierte en un árbol, llámalo parse(tokens). Luego hay una función para convertir un árbol a un DAG de bloques, llámalo dag(tree). Llame al emisor de código emit(dag), que toma un DAG de bloques y escupe al ensamblador.

El compilador es entonces:

emit(dag(parse(lex(preprocess(filename))))); 

Hemos descompuso un grande, difícil de entender la función (la función compile) en un montón de pequeño, más fácil de entender funciones. Usted no tiene que hacerlo como un oleoducto, se podría escribir su programa como:

process_data(parse_input(), parse_config()) 

Esto es más típico; los compiladores son programas bastante profundos, la mayoría de los programas son amplios en comparación.

6

Es la misma medida que las estructuras WorkBreakDown (WBS), y de arriba hacia abajo MindMapping desarrollo - básicamente romper un gran problema en pequeños sub-partes, más comprensibles.

Pros

  • permite un enfoque proactivo para la programación (resiting el impulso de código)
  • ayuda a identificar las áreas complejas y/o de riesgo de un proyecto (en el ejemplo ATM, la seguridad es probablemente la componente más complejo)
  • ayuda a identificar TODOS los componentes de un proyecto - la causa n. ° 1 de falla de proyecto/código (a través de Capers Jones) le faltan piezas, cosas en las que no se pensó hasta tarde en el proyecto (caramba, no me di cuenta Tuve que verificar el saldo de la persona antes de repartir $)
  • permite la disociación de los componentes para una mejor programación, el intercambio de código y distribución del trabajo

Contras - No existen CONS reales en hacer una descomposición, sin embargo hay algunos errores comunes

  • no derribar lo suficientemente lejos o rompiéndose hasta el final - cada persona necesita determinar el feliz nivel de detalle necesario para proporcionarles la información del componente sin exagerar (no desglosar en las líneas de programación de código ...)
  • no utilizando módulos de códigos/patrones preexistentes en consideración (reproceso)
  • no revisar con los clientes para asegurar el alcance es correcta
  • no usar la falla cuando en realidad la codificación (como el diseño de una casa que olvidar el plan y que acaba de empezar a clavar unas tablas juntos)
1

descomposición funcional es útil antes de crear documentos de requisitos funcionales. Si necesita software para algo, la descomposición funcional responde a la pregunta "¿Cuáles son las funciones que debe proporcionar este software?". La descomposición es necesaria para definir funciones de grano fino. "Necesito software para medir la eficiencia energética" es demasiado general. Es por eso que dividimos esto en pedazos más pequeños hasta el punto en que entendemos claramente todas las funciones que los sistemas deben proporcionar. Esto puede usarse luego como una lista de verificación para la integridad de un sistema.

Un documento de requisitos funcionales (FD) es básicamente una representación textual de la descomposición funcional. Codificar directamente desde el FD puede estar bien para lenguajes de procedimiento, pero no es lo suficientemente bueno para soluciones orientadas a objetos, porque no identifica objetos. Ninguno de los dos es bueno para la planificación y prueba de usabilidad.

Mi opinión es que debe tomarse un tiempo para crear un FD, pero no para usarlo demasiado. Consulte a cada persona que conoce el proceso que está siguiendo con su sistema para encontrar todas las funciones necesarias.

Tengo mucha experiencia en el diseño, desarrollo y venta de software, y utilizo la descomposición funcional como el primer paso del desarrollo. Lo uso como base para el contrato, por lo que el cliente sabe lo que recibirá y sé lo que debo proporcionarle.

Cuestiones relacionadas