Reducir o eliminar la navegación del código de la GUI mediante la adición de derivados de los vínculos y, al mismo tiempo, mejorar el rendimiento.
Modelado de estructuras de clase tiene algunas ideas, y cuando termine el pensamiento y el dibujo y después de que la puesta en marcha utilizando el modelo, entonces te pasan terrible lotes de código atravesar vínculos con el fin de recuperar información trivial en un determinado objeto estructura. Navegando en la misma somtimes complicado vínculo caminos una y otra vez se potencia de CPU, y que también tiene mucho código redundante y / o expresiones para acceder a las mismas rutas de navegación una y otra vez.En el Temerario arquitectura que también redundante lugar suscripciones de muchos lugares diferentes con el mismo objetivo de la suscripción a los mismos caminos, a lo largo de más de una vez.
Pero con negrita puede dirigirse directamente a menudo innecesaria la navegación, el código redundante de navegación / OCL-expresiones y obtener disminución de la carga de la CPU mediante la adición de derivados de asociaciones en lugar de hacer algunos enlaces útiles y más "inteligentes". Y, además, hacerlo directamente en el modelo de su modelo, al mismo tiempo, reflejar, más concretamente, qué partes del modelo se utiliza realmente. Y cómo.
Un ejemplo puede mostrar una típica situación en la que añadir un gran número de derivados de los vínculos, que se extiende el modelo con más información útil, tendrá como resultado más eficiente, menos redundante y más legible el código. Si se trata tradicionales handcrafting probablemente habría pensado yo estaba bromeando, ya que no suelen salvarnos de más problemas por la adición de más las relaciones entre los objetos ...! Pero no estoy bromeando - que en realidad alcanzar todos los beneficios mencionados, añadiendo unas simples líneas a la modelo utilizando negrita.
EJEMPLO
Un vehículo camión combinación nos puede servir con un ejemplo. El ejemplo modelo constará de unidades de vehículos, algunos paquetes y un viaje objeto de mantenimiento de todo el viaje la información y los cálculos. Con estas tres categorías básicas, acabaremos escribiendo casi el 50% del código (o expresiones) en los algoritmos de navegación de la estructura básica que tiene sólo tres enlaces ... Esa codificación es trivial, lleva tiempo y no añade nada de valor para el sistema.
En primer lugar un "mundo EIR representación" de el ejemplo antes de que lo representa mediante un diagrama UML de clase ( "EIR" es mi iniciales):
Fig 1: Esta contiene un conjunto de vehículos de las parcelas, pero sólo la parte frontal mantiene la mayoría de VehicleUnit Viaje información acerca de las distancias, los acontecimientos y los cálculos económicos.
Caso omiso de las artes aspectos de la ilustración. Por varias razones, no se discute aquí, el VehicleUnits se muestra arriba siempre tiene un viaje objeto adjunto, pero sólo la parte frontal viaje más objeto es la representación de toda la combinación. El otro viaje de los objetos / calculadoras son "desmovilizados" hasta que el remolque (posiblemente) está desconectado de la camioneta y, a continuación, el remolque será una válida ( "frente a la mayoría") TripHolder por su propia cuenta.
Imagínese que usted está viendo uno de los vehículos o unidades de una de las parcelas en una interfaz de usuario y usted probablemente desea saber más acerca de la información relacionados con el viaje, tal vez distancias recorridas, las direcciones visitadas, el orden de visita, los costes o los ingresos por km etc (todos los administrados por objeto el viaje).
Sólo hay tres relaciones en este modelo, pero todavía tendría que pensar dos veces cuando se trata de navegar correctamente tratando de encontrar la "calculadora" (aquí en representación de una "clase").
Sería aún peor si desea aplicar la lógica algunos genéricos o los cálculos para la VehicleUnits porque siempre tienen que asegurarse de que usted vaya a la "primera unidad de la mayoría de los vehículos" (que permite llamar el "transportista") y desde ahí navegar directamente el viaje a info (la calculadora).
En la aplicación real hay tanta info incorporados en el presente estructura básica de que los tres enlaces se accede / navegar una y otra vez tantas veces que muchos cientos de líneas de código (y / o expresiones OCL) sería por escrito "aquí, allí y en todas partes ". Una de las cosas malas con esto es que si usted explícitamente recorrer estos enlaces cada vez que usted necesita para acceder a un objeto / atributo en el otro extremo de la estructura, tendrá que ejecutar esta lógica en la CPU cada vez.
Otra cosa mala es que su lógica de negocio básico se "ahogan" en el código y las expresiones que tratan con este trivial de navegación como "si luego los demás, para i: =" y ceder el control. Aquí es donde los vínculos derivados puede ayudar mucho para evitar un desorden lógico (basado en los atributos que también, por supuesto).
Fig 2: Un modelo simple clase de la ilustración de arriba podría verse algo como esto:

El problema de navegación es más evidente en esta clase de modelo que en el "mundo EIR ilustración".
Si he seleccionado un paquete en una lista de GUI y necesita información de viaje el objeto no podía estar seguro de exactamente la ruta de navegación a los "movilizados" viaje de objeto que es la celebración de la información de viaje válidos.Ejemplo:
Si la parcela se carga en un remolque la expresión «vehicleUnit.trip" volvería un objeto desmovilizados viaje, pero si la parcela se cargó en el transportista que desee devolver los "movilizados" viaje objeto. Esta complicación es motivo suficiente para añadir un vínculo derivados solucionar el problema directamente en el modelo de manera que un nunca más tendría que considerar esto cuando algoritmos o el diseño de la estructura de navegación. Definitivamente, me gustaría añadir un enlace llamado "EffectiveTrip" de la siguiente manera:
Fig 3: Un enlace llamado "EffectiveTrip" se añadió a la modelo. (Yo siempre trato de dejar que el color azul representan el "persistente" (= "congelación") y naranja en representación de "derivados" de enlaces).
Como ya puede prever que este enlace se accede a numerosos conjuntos de vehículos (en redes, etc) me duro código de la derivación lógica de la optimización de aquí para encontrar la "primera mayoría" de vehículos y eso significa atravesar el remolque / transportista enlace y se detendrá cuando el transportista vínculo es nula (= IsFrontMost). A partir de ahí podemos hacer referencia al viaje objeto directamente. Pero también sé que la búsqueda de la mayoría de la parte delantera del vehículo (la combinación transportista) es muy típico y que sucederá incluso más a menudo que el acceso al objeto propio viaje. Ya sé que el vínculo EffectiveTrip así como pueden utilizar derivados de ese vínculo! Permite añadir de inmediato que el nombre 'CombinationFirst ».
Me escogieron el nombre de «CombinationFirst" porque inmediatamente a continuación, realizar el típico en esta situación. Es un típico problema de manejo de la lista. Ya puedes imaginar la utilidad de una deriva eslabón otro que podemos llamar 'CombinationLast' e incluso un tercer eslabón llamado 'CombinationUnits'!
Puedo asegurar que esos vínculos se utiliza con frecuencia y, por tanto, el "costo" de evaluación de las mismas será pagado ya la segunda vez que utilice cualquiera de ellos!
Fig 4: No vínculos derivados también requieren de CPU con el fin de ser evaluados ...? usted puede preguntar. La respuesta es, sí, por supuesto - pero sólo una vez - si el suscrito los temas no cambian. Y esto no es muy probable aquí, pero el muy "hot spot" estructura será utilizada en muchos lugares en la lógica de acceso a los objetos cruzan muy a menudo y cuando hacerlo los vínculos ya directamente los casos las referencias que desea acceder. Mira el "lío" a continuación ... ! :
Esta es una solución de alto rendimiento utilizando el modelo como la herramienta para la optimización, y al mismo tiempo los nuevos enlaces se aclara / indicando directamente en el modelo de la utilización de esta estructura específica!
Para aquellos de ustedes que piensan que finalmente se molesta puedo decirle que no. En cambio el aumento de la velocidad de los cálculos y todas las actividades relacionadas con esta estructura en un mundo real aplicación con muchos miles de porcentajes en comparación con la definición explícita toda la ruta de navegación cada vez que la combinación de trayecto o una unidad específica para un vehículo (o atributo en cualquiera de ellos ) Fue visitada!
Todos los tipos de datos se almacenan en esta estructura y más de 30 atributos derivados para efectos del cálculo de los diferentes accesos a la estructura de ida y vuelta todo el tiempo proporcionar el cliente con el usuario en tiempo real los cálculos de los ingresos / km y las distancias, la distancia de las acciones totales, porcentaje de acciones de ... etc, etc
La cosa es dejar un vínculo derivados de la utilización de otros enlaces como el culo a menudo posible, incluso la necesidad de reevaluar los vínculos cambios cuando las cosas se disminuye!
La última declaración se puede verificar muy claramente con un ejemplo que muestra lo importante que es la "reutilización" todo lo que se derivan para cada nivel superior (respecto de los cuales parte de la estructura es más probable que el cambio y qué parte es más "estáticas"). Con la "reutilización" me refiero a "la CPU labor ya realizada" se derivan en el enlace. Más acerca de esto podría ser objeto de un artículo separado.
Ahora mira en el código. Tenemos que conseguir el viaje de objeto (para algunos reson), a partir de una parcela, pero no sabemos en que VehicleUnit que se cargan por lo que empezar a buscar utilizando el enlace "EffectiveTrip" que "esconde" la lógica determinar qué objeto viaje es "movilizado" (es decir, "efectiva"):
funciónTParcel.CalculateTrip_Something ...: Double; |
Fácil, este código está claro. Los detalles acerca de cómo llegamos de celebrar la correcta viaje objeto no se debe mezclar la lógica de negocio que tratan con el acceso o los cálculos en la estructura de objeto.
En nuestro mundo real aplicación tanto VehicleUnits y paquetes tienen un super clase (no mostrado aquí). Un vehículo puede ser cargado en otro vehículo, al igual que cualquier otra parcela de modo que el código anterior es aun más fácil en mi último modelo genérico que los derivados de enlace es "virtual overrided" en diferentes subclases. Mi código final va así:
|
La parcela se encuentra su viaje válido utilizar este comando, independientemente de la forma en el complicado camino podría ser. Esto se muestra en el gráfico 5, donde una nueva clase de super común en realidad es el propietario de la persistente y derivados vínculo con el viaje y la clase EffectiveTrip-Link se aplica en primer lugar en el TParcel y, a continuación, overrided para la clase VehicleUnit como se muestra a continuación.
Fig 5: Aquí el modelo modificado para ser más genéricos que permite cualquier "objeto planable" para llevar un lote de planable otros objetos - y como el modelo va más genérica el papel los nombres de hacerlo también.
Info viaje se aplica directamente para una parcela demasiado (a través de AbstractPlanPortion) porque una empresa de transporte pueden planificar una parcela que se entrega con, por ejemplo, un avión que los totales que no son de interés - pero todavía están interesados en seguir el rastro de cualquier viaje de eventos que participan en el transporte real, y la documentación adjunta y las transacciones a la parcela propia etc Pero esto también significa que cuando existe la necesidad de acceder a la "efectiva" viaje objeto también necesitan para llevar a cabo controles muy complicado todo la estructura tratando de averiguar en cuyo contexto la (correcta, "movilizado") viaje objeto se puede encontrar ... lo que realmente hacer de nuestra lógica algo complicado para un simple tal cosa como simplemente recuperar algunos datos de la estructura. Una verdadera pesadilla, de hecho, ...
Esta complicación de una simple cosa no es muy singular. ¿Qué es único es la forma en que pueden ser tratadas con el uso de la tecnología en negrita con sus vínculos derivados.
El paquete puede ser la TripHolder sí mismo, o si la parcela se ha cargado en un soporte que no sé si es cargado en la compañía aérea que realmente tiene la información de viaje. Nos gustaría realmente necesitamos hacer algunos navigatiion aquí. En una situación como esta puede fácilmente imaginar la cantidad de codificación y cómo las expresiones OCL complicado sería el acceso a la información en la estructura. Su lógica de negocio básico se "ahogan" en la navegación, simplemente cuando lógicas recuperar las cosas triviales de la estructura y la CPU se pasan mucho tiempo encontrar su camino (s) con el objetivo de objetos / datos.
Por último: Tres (3) la persistencia de vínculos celebración de la estructura de todos ellos terminaron en otros cinco (5) muy útil derivados enlaces! El resultado es que la aplicación final es mucho más rápida y lógica de negocio se mantiene más trivial, aparte de la navegación sin fin de objetos que atraviesan las estructuras.
Antes de la lista de las más eficientes para el código optimizado hardcoded derivaciones de los enlaces, me gustaría a la conclusión de que con estos enlaces se puede, desde cualquier lugar en la estructura, ir a ninguna parte - directamente - por referencias vínculo con los nombres de los miembros de esclarecer plenamente lo que la intención de acceso, y esto se hará de la manera más eficiente se puede llegar con el uso ordinario de la arquitectura en negrita.
Con "eficiente" me refiero a "siempre acceso directo a la meta deseada instancia de objeto" (excepto para la primera evaluación que, en mi caso ocurre sólo una vez por cientos de accesos ...).
Esta es sólo una parte de los conceptos que utilizan conscientemente para hacer posible lo que no era posible antes: el uso regular, pero "diseño limpio", el modelo estructurado y orientado a objetos clases el desempeño de las empresas de alto rendimiento en tiempo real (re) los cálculos de muy avanzada viaje cálculos ( no se discute aquí). En una sola CPU (servidor de aplicaciones) para varios clientes.
Derivación de código, con las observaciones
En el código que aparece a continuación subrayó que todas las referencias internas de los derivados de los vínculos ( "la reutilización eficiente de los resultados que ya han sido evaluadas").
También utiliza variables locales evitando así el interior de "buscar" en negrita los miembros de más de una vez (=> evitar la activación repetida de los acontecimientos internos en negrita, etc.)
La eficiencia de todo el concepto discutido y la codificación detallada que figura a continuación se verificó utilizando ProDelphi profiler (muy alta precisión (+ -3%) en la medición de la ejecución de código).
() TParcel |
/ / Rolf Lampa
(Actual Dirección de correo electrónico: Rolf-dot-Lampa-en-RILNET-dot-com)

Delicious
Digg
Google
Yahoo