Bueno, estábamos viendo el diseño detallado de cada caso de uso en concreto. Ya llevamos establecidas un montón de cosas. Y, bueno, de todas estas, unas, las que estamos haciendo, se apoyan en todas las anteriores que he dicho. El problema es que no se puede tomar solo un elemento, digamos, de la base para construir todo lo demás. Hay que tenerlo todo en cuenta conjuntamente. Y eso es uno de los grandes problemas de todo esto. El otro es que salvaguardar estas características que queremos conseguir de independencia funcional en los elementos de código que trabajan en el funcionamiento que estamos definiendo, pues... Se complica bastante, cada vez más, llevar a rajatabla todas estas cuestiones que estamos indicando en el momento que aparece otro nuevo elemento de información que estamos manejando. De todas formas, quería hacer hincapié en determinados... No sé, desviaciones, malentendidos y cuestiones que aparecen desde el principio. Y, por no considerarlas, pues todo se va enmarañando y complicando cada vez más. Casi al principio comenté que las palabras aquí son muy importantes. Estamos manejando inicialmente... Los conceptos que responden a elementos de información. Y esos conceptos, pues para manejarlos, igual que hacemos con el código, utilizamos una palabra, una referencia. Y por más que muchas veces le damos vuelta a lo que es el concepto, olvidándonos un poco de lo que significa esa referencia, la palabra con la que lo estamos designando, pues llegamos a situaciones que al final no se pueden manejar. Un elemento... Bueno, esto viene a colación por determinadas cuestiones que me están diciendo con respecto a la PEC, el PUF, el ejercicio de este año, de GESAMA. Y que hemos visto, y del que también ya he hablado, pues por ejemplo en procesar venta. Por ejemplo, el coste de la venta de los productos. Ese coste no es un elemento, un atributo especificado de manera... de manera expedita. Sin embargo, el elemento de venta está constituido, puesto ya la relación en diagrama de clases, por una colección de lo que el libro lo llama líneas de venta. Vale. Aquí se está metiendo... Los elementos de especificación del producto. Esto que hay aquí, pues puede tener el mismo tipo como componente, pero no es lo mismo que el elemento... No es lo mismo para nada el elemento de la colección del catálogo de productos. No sé cómo se llama. Entonces, llega un momento en que empiezo a escribir mal. Bueno. Vamos a ver. Este elemento de aquí se puede meter tal cual si no necesitamos hacerle ningún cambio, pero no tiene por qué ser exactamente el mismo tipo, una instancia de esta clase. En general. Además, esto tiene la cantidad. No sé por qué estoy empezando a escribir mal. A lo que iba. Eh... Un elemento de estos, como método, pues tiene la capacidad de, con esta cantidad y con el precio del producto que me estoy... Eh... Que estoy comprando, pues calcular... El coste subtotal, o coste... Lo mismo. Este objeto de aquí puede tener un método que puede ir recontando, haciendo recuento, quiero decir, de los costes de cada uno de estos elementos y obtener el coste total. Es más, cuando se calcula el coste total, no sólo tiene que hacer un recuento de los costes de los subtotales correspondientes a las líneas de venta de los productos que se han llevado, sino es que resulta que este coste total, pues tiene... Es más complejo que todo esto. Tiene una base imponible y tiene una parte de impuestos, con lo cual en este cálculo va a tener que invocar a un elemento, puesto que el calculador de impuestos es un... actor de apoyo, es un módulo que está fuera del sistema que estamos desarrollando, pues va a tener, pues como voy a explicar más adelante, a través de un mecanismo adecuado para que lo desvincule, lo desacople de este elemento externo, pues va a tener que invocar a calcular los impuestos de estos elementos para... para que me vea desglosado en este coste total la base imponible y los impuestos. Bien, esto ya es una pequeña complicación, pero a lo que quiero ir es que el coste de la venta no es un atributo ni un elemento explícito, es una palabra que no me salía antes, del objeto venta. Bien, vayamos con... digamos, este marco conceptual, vayamos a lo que quería hablar con respecto a el PUF. Vamos a ver... Una máquina, una cosechadora, o como queráis llamarlo, maneja determinada información, como es la matrícula, o podéis ponerle el nombre, o lo que sea. Bueno, pues venga, también nombre. El tipo de cosecha. Que realiza, el trabajo, o el tipo de trabajo que realiza. La capacidad... de cosecha. En las indicaciones pongo que esto será en hectáreas día. Capacidad. El precio del alquiler por día. La ubicación. La velocidad de traslado. Vale. Con estos elementos de información, sin tener que resolver específicamente, esto puede tener métodos, de hecho debería tenerlos, para, asignado a un determinado trabajo, determinar duración de una cosecha. ¿Qué va a necesitar? Efectivamente, pues la extensión. ¿Qué va a necesitar? Algo que no es ningún objeto que esté perteneciendo. O sea, es un valor que no es de un tipo derivado, de una clase construida ad hoc para el funcionamiento del ámbito de GESAMA. Es decir, por introducir aquí... Aquí, una extensión. Un determinado valor que no pertenece a un objeto, digamos, derivado, sería una magnitud primitiva. No estamos acoplándolo con nada que nos esté prohibido. Quiero decir, pues, por ejemplo, con una finca. Esto no está accediendo a la información, a la información de la finca para hacer un determinado cálculo. Así que ese acoplamiento no existe. Y lo mismo que un elemento, una instancia de esto, puede saber lo que le va a durar la cosecha en un trabajo, pues por lo mismo, con esta magnitud, en días, esto se obtendrá en días, pues puede obtener el coste del trabajo, o de la cosecha introduciéndole el número de días. Esto me puede decir perfectamente esto. Y sin meterme en, digamos, sin acceder a ningún valor de un elemento que esté prohibido ese acceso, que no tenga que tener, sobre el que no tenga visibilidad, o accesibilidad a acceso, ¿vale? No sé si me explico. Que, digamos, de darle vueltas a los conceptos, pues se pueden empezar a construir o a elaborar modelos en los que, bueno, pues una reserva que debe tener una determinada información, pues resulta que voy a calcular el coste de esa reserva, ¿vale? Pues como concepto, la reserva no tiene coste alguno. Lo que tiene coste es el alquiler de una máquina, el trabajo que realiza la máquina. Una reserva no es un alquiler. Una reserva es un asiento en el que se especifica que el trabajo de esa máquina para una determinada finca, pues está reservado en un periodo de días. Pero eso, en principio, no tiene coste. Si pudiéramos que hay una comisión especial por hacer una reserva y mantener bloqueada, digámoslo así, esa máquina, en tiempo, pues ya sería otra historia. Pero, en principio, la reserva no tiene coste. Lo que tiene coste es el alquiler, es decir, el trabajo de una máquina. Y ese coste, efectivamente, con la información que tiene la máquina, lo puede calcular sin que tenga un atributo explícito en la información que estamos manejando de esa máquina. Así que, a ver si somos o es importante ser más preciso en los conceptos que estamos manejando y la información que contienen, de manera que ese funcionamiento lo vamos a concebir precisamente entendiendo qué información me puede aportar cada uno de esos elementos, cada uno de esos... objetos, ¿de acuerdo? Objetos que se van a convertir en clases cuando hagamos el diseño y con ellos vamos a especificar el funcionamiento del código. De manera que es muy importante ese modelo conceptual que nos tenemos que hacer antes en el modelo de dominio para no asignar, digamos, capacidades y atributos que no deberían tener a elementos conceptuales, como son las reservas, antes del tiempo. Porque cuando eso lo implementemos, pues va a resultar, digamos, primero, muy difícil de entender y segundo, seguramente se transgreden esas cuestiones que estamos intentando no realizar. No sé si hay alguna duda o alguna cuestión con respecto a esto que estoy planteando y que, bueno, más o menos recibo en las cuestiones en los foros e incluso algunos de correos particulares. Vale, esta pregunta la mantengo y también me interesaría saber otra. Claro, esto luego con las grabaciones se puede revisar por quien quiera, pero lo que me gustaría con respecto a esta realimentación que pueda obtener ahora es si los que están conectados están siguiendo las respuestas en los foros. Y las aclaraciones que se están dando en los foros. Vale, bien, pues por eso estoy haciendo estas preguntas porque por las cosas que salen ahí en los foros, por si se entienden mis explicaciones o se entiende por qué estoy haciendo estas aclaraciones aparte de ello. Insisto, en venta el coste total no es un atributo ni el subtotal de una venta. Aunque resulta que, no sé cómo llamarlo esto, bueno, registro que es el controlador del caso de uso. Una vez que se, digamos, incorpora uno de los productos en la cantidad que sea a la colección esta de líneas de venta el retorno que, insisto, aquí hay una U. Aquí hay una separación entre las capas del negocio y la capa de presentación. Lo que se muestra a este lado es un resumen del producto comprado. Es decir, pues la descripción del producto qué cantidad se ha llevado, cuál es su precio unitario y cuál es su precio de la compra de ese producto. Eso no aparece aquí. Es decir, lo que estoy diciendo de que el elemento con la información necesaria se emparrula a la capa de presentación es que esta información que se está manejando o ese objeto el del resultado que se está manejando en la parte del negocio ya tiene toda la información y los métodos correspondientes para obtener eso que estamos mostrando ahí. Ahora, cómo se hace esto para que una cosa que no tiene explícitamente no es un object to text. La cosa no funciona así tan directamente y ese object to text no lo hace el controlador cuando se lo pasa a la interfaz de usuario. El controlador lo que hace es cuando ha terminado le envía... En fin, no estamos manejando un desarrollo basado en eventos ni con observadores ni registros de eventos ni nada de eso. Lo estamos simplificando todo muchísimo. El caso es que lo que le envía es una invocación para que lo presente al usuario. En esa invocación correspondiente a un adaptador que lo conecta con la interfaz de usuario en ese adaptador recoge la información que tenga que recoger en este caso, pues ese objeto o la parte de ese objeto que le interese hace las transformaciones que sean necesarias y lo pasa a la interfaz para que presente en el punto que la interfaz de usuario esté necesitando presente lo que tiene que presentar lo que le importa y de eso se encarga un método que hay en el adaptador. El controlador no tiene esos métodos específicos para presentarlo. Con lo cual, digamos esa controversia respecto a que una vez las máquinas que tienen que tener o la colección de máquinas no sé cómo llamarlas aptas para ese cultivo para que la seleccione el... el actor pues tienen que tener cuál es el coste que le va a salir del... pues no tiene por qué tener ese resultado explícitamente en ese objeto sino que tienen que tener toda la información para que se pueda derivar y a saber quién lo tiene que derivar como os he dicho con la información que tiene la máquina se puede calcular perfectamente con determinados parámetros que no son objetos complejos o derivados o utilizados aquí sino que son magnitudes de un tipo pues genérico utilizado por todos como podría ser en venta en procesar venta el tipo dinero es un... es un objeto, es una clase que utilizan todos pero no tiene una asignación de divisa concreta conviene esto porque si se hace digamos la aplicación de manera que sea versátil para que se utilice en cualquier sitio en el momento digamos del arranque es cuando se asigna la divisa concreta a esta clase y se sabe de qué especialización de dinero estamos hablando con qué divisa ¿de acuerdo? pues esto es prácticamente lo mismo de lo que estoy hablando es que una vez que los elementos tengan la capacidad de calcular lo que tienen que calcular lo hacen con los atributos explícitos que sí que tienen pero una vez que tengan esa capacidad como digo con el método correspondiente pues la parte de presentación lo puede presentar en el momento que el controlador defina que ya se puede presentar y lo pone a disposición de la presentación y no hay que hacer absolutamente nada más esto se ha entendido o no se ha entendido vale entonces nos habíamos quedado en el ejemplo de gesflota bien en este ejemplo de gesflota os había planteado el de la operación a carga del tanque es decir la iteración en la que una vez digamos definido el buque y una vez definido el puerto y los productos que hay si os acordáis con este ejemplo había extraído de infobuque la información del buque había extraído las características de los tanques la colección de características de cada uno de los tanques que tenía precisamente para hacer la carga y poderlos manejar adecuadamente que no sé dónde están bueno aparecerían en la anterior bien no sé si tenéis alguna duda con respecto a esto lo que hago es seleccionar el producto que voy a a cargar en el tanque que corresponda y entonces obtengo pues como hacemos en procesar venta de la colección de especificaciones de ese producto obtengo la información del producto que quiero manejar bien el, el siguiente paso esto lo de get no es adecuado porque no sabemos qué estructura ni le hemos asignado en este modelo una estructura suponiendo que fuera un hashmap pues podría ser un get pero en principio es más adecuado dejarlo buscar por ejemplo un un nombre de un método que no tiene por qué ser el primitivo de la estructura específica que estamos utilizando en este multiobjeto en este en esta colección bien pues como decía obtengo la información de ese producto y lo que hago es invocar a un método que está en el mismo registro de carga buque que es preguntarle si cabe en el tanque correspondiente a este producto a ver esto como otras cosas que luego a raíz de algunas preguntas de los estudiantes pues a me he planteado o se me habían pasado por alto esto cabe en tanque no debería ser una rutina un método que estuviera en quien están manejando los tanques pues es posible pero es que anteriormente a esto no sé si os habéis acordado os acordáis a ver esto es bueno ya estamos aquí en ventas no sé si va a estar aquí sí aquí está en el inicio de el caso de uso yo había extraído una cosa que denomino manifiesto y que he puesto como componente de la especificación de cada de cada buque efectivamente esto está produciendo un acoplamiento porque no es lo mismo los tanques aunque digamos estén asociados a ellos si tenemos el buque con distintos tanques no es lo mismo los tanques su capacidad que lo que estoy manejando del buque mezclar una cosa con otra ya me está creando y un acoplamiento que es de lo que estamos huyendo estamos intentando evitarlo cómo se resolvería esto pues que cada tanque lo que tuviera es una lista de referencias cada una de las cuales apuntara a una colección completa de eh propiedades de cada uno de los tanques pero de todos los barcos o sea cada cada tanque tiene un identificador que le que establece esas propiedades correspondientes a un determinado buque y un determinado tanque dentro de ese buque esta es una forma de tenerlo así desacoplado pero evidentemente si lo hago así es es lo que os estaba diciendo antes empieza a complicarse todavía mucho más aparte de que aquí estoy utilizando tres tipos de colecciones diferentes y por eso se está montando este cacao estupendo eh a diferencia que es más o menos repetir tres veces lo de procesar venta con esas otras tres colecciones vale eh por eso lo que he hecho es decir bueno pues este conjunto de digamos de tanques que resulta que corresponden en esta colección digamos global general para desacoplarlo de mediante estas referencias que esto sí que es del buque mediante estas referencias que esto sí que es de este buque pues lo que hago es sustituir cada una de estas referencias por esas propiedades y estoy digamos acortando un paso es decir estoy quitando ese mecanismo que os estoy hablando que es tan socorrido para evitar el acoplamiento que es el de la indirección interponer una referencia para desacoplarlo pues lo estoy quitando y lo estoy acoplando simplemente vale entonces habéis visto que el controlador resulta que ya está manejando directamente una colección de propiedades del tanque de ese buque que es lo que llamo manifiesto y un conjunto de propiedades de los depósitos del puerto que es lo que estoy denominando productos productos productos disponibles productos disponibles bien a cada uno le he dado una estructura otra de las cosas no hace falta poner no es necesario y si lo pongo aquí el estereotipo de cada uno de estas estructuras es para que digamos ayudaros a daros una idea y el por qué utilizo en una un array list o sea un una organización matricial o vectorial y en otra una asociativa como un hash map es simplemente pues al manejarme pues que me resulta más cómodo hacer búsquedas en el hash map más directo y en el array list pues simplemente con recorrer un determinado digamos elementos del vector o de la matriz pues me resulta suficiente pero esto es irrelevante y no hay por qué ponerlo vale el caso es que estoy utilizando dos colecciones ya directamente desde el controlador del caso de uso por eso es por lo que digamos en determinado momento he tenido la duda de decir bueno y esto lo de cabe producto no sería un método que debería tener el manejador del buque el elemento spec del buque concreto y bueno eso es una de las cosas que me quería ahorrar lo de cabe producto igual a info en este caso sería si sería infobuque punto cabe en tanque y le meto el producto id o el identificador de ese producto para saber en qué tanque me tengo que dirigir la cantidad de producto que estoy intentando introducir en ese tanque y le pasó el manifiesto el manifiesto que es precisamente esa colección de acuerdo insisto esto es un método tal como lo he puesto aquí que está en el mismo controlador del caso de uso por qué porque tiene como miembro el manifiesto y por eso se lo puedo poner ahí si no tendría que ponérselo en donde estuviera el manifiesto que sería en la instancia de spec del buque que he obtenido del correspondiente catálogo alguna duda con esto lo que estoy haciendo es mirar a ver si cabe el producto si cabe el producto es un booleano entonces lo que hace el controlador del caso de uso es pedir la confirmación de carga esa petición de confirmación de carga lo que hace es solicitarle al actor en este caso al operario que inicie y haga offline totalmente fuera de todo esto toda la maniobra para cargar rellenar con ese producto el tanque es evidente que si me equivoco de producto y le meto otro pues esto no lo va a detectar en fin una serie de cuestiones el planteamiento del ejercicio es que todas estas cuestiones de acción manual por parte del actor y de recogida de datos del hardware totalmente fuera de control y el procesamiento que estamos manejando aquí por simplicidad por supuesto porque ya veis como se complica con tres colecciones como para tener en cuenta todo lo demás pues se recogen en un determinado conjunto de información de valores de datos y se introducen se aportan directamente por parte del del operario de la persona que está del actor que está manejando el caso de uso de acuerdo con estos datos que pueden estar en el formato que sea puede ser un formulario puede ser un código de barras que el que se pasa desde otro sistema hardware o lo que sea aquí a través de la interfaz de la presentación lo que llegan es unos datos que manejamos en bruto y introducimos el controlador los los los plasma en resultados manía maniobra de ese producto otra cosa que quiero llamar la atención es que parece que se ha entendido también que las maniobras era para todos los productos no cada uno tiene su maniobra de de pues activación de las bombas correspondientes de las tuberías de conexión de de monitorización de cómo va eso para cada uno de los productos y para cada uno de los tanques bien bien se aporta esos resultados con lo cual quiere decir que esos resultados o sea esa carga ha sido correcta con lo cual lo que se hace es crear un elemento de la colección bueno no esto no es el pedir que se cree un elemento de la colección de ítems de productos cargados o que voy a cargar en en cada uno de los tanques del buque esto por supuesto lo recibe el resultado de la carga crea el elemento como ya hemos visto otras veces este mecanismo de que el que está manejando la colección lo que hace recibir la orden con esa orden lo que hace es crear el elemento dotándole de la información correspondiente a ese elemento y una vez que lo tiene lo agrega el elemento de la colección eso vale para cualquier estructura insisto este ad es específico es primitivo de la estructura que vayamos o sea que es más correcto pues agregar o cualquier otro término que no se corresponda con un método primitivo de la estructura que supuestamente estamos utilizando esto se corresponde más si estuvieramos utilizando una raíz listo un listo que tiene esta primitiva bien la cuestión es que una vez que hemos añadido ese elemento a la colección que contenida que está manejando el resultado de la carga de los depósitos los tanques del bus del buque la cuestión es que esos tanques han cambiado su carga su contenido con lo cual vuelvo a invocar otro método que por la misma razón que explicado anteriormente como estoy manejando la colección del manifiesto y como estoy manejando también el la colección del de productos disponibles del puerto pues lo que hago es modificar esa los valores de esa colección con un método que está en el controlador del caso de uso en este caso sólo en este caso porque está manejando explícitamente o es separado ese esa colección la del manifiesto y la colección del buque con indicación del tanque que tiene que modificar y la cantidad el volumen que hay en ese tanque el nuevo volumen que hay en ese tanque correspondiente a la cantidad que he pedido y siempre por supuesto si cabía si no cabe por entonces nada no no esto no se ejecuta bien esto lo hemos hecho en el manifiesto que está aparte vuestro compañero también dice bueno es que no sólo se cambia el volumen de los de los tanques de ese buque es que al rellenarlos también se ha cambiado el el contenido de los depósitos que hay en ese puerto vale pues es verdad aquí habría que hacer exactamente lo mismo un pros disponibles igual update un date es porque me lo invento yo vale que es un método que se llama así dentro del controlador a ver un date depósitos lo mismo con pro y de y cantidad vale así que prod disponibles esa colección quedaría actualizada con lo que se ha cargado también en el buque igual que en el manifiesto aumenta el volumen del tanque correspondiente productos disponibles del puerto se disminuiría en esa misma cantidad hasta aquí se entiende bien pues llegamos aquí para llegar aquí la última fase sería la de finalizar la carga buque que lo que haría sería como os he dicho que el manifiesto está exento lo estoy manejando al margen de el contenido de info buque lo que tengo que pasar es ese manifiesto que he ido moldeando ajustando actualizando en cada producto que he cargado en cada tanque pasárselo a info buque hacer un set del manifiesto en el info buque con lo cual yo el infobuque estaría con el correspondiente valor actualizado lo que decía vuestro compañero es que vale info buque se ha quedado actualizado pero eso y por tanto luego cuando han añado la información de info buque a la carga el resultado de la carga del buque pues va con los valores actualizados de acuerdo pero eso no sea esa modificación de los valores de info buque no se ha perpetuado no no se ha hecho persistente en la colección de propiedades del buque que estamos manejando en este caso como el local no lo va a dejar nadie más es una copia que se queda aquí pero por tanto tampoco se modifica en el almacén general y de ahí pues surge un poco la pregunta de que cómo podemos sincronizar lo que ocurre en esta copia que es local porque como lo están utilizando varios pues no queremos que nadie la toque ni que se cambien las cosas aquí y cómo sincronizamos eso con el almacén exterior en los casos en los que si haya que hacer modificaciones en la información contenido en esos elementos en esa información que es persistente y de ahí pues también viene el digamos los mecanismos más sofisticados de código y la raíz de casi la mayor parte de esos patrones gov la pandilla de estas de los cuatro los patrones de diseño específicos para conseguir todas estas cosas en principio pues el de la factoría el de las interfaces el de las variaciones protegidas en fin un montón de patrones que están implícitos también en los principios gras pero que son fundamentales para ver cómo diablo se hace esto y es lo que quería que viéramos hoy esta justificación de muchas cosas que estamos haciendo digamos basándonos en un una intelectual en el algo ficticio como también os he dicho algunas veces digamos que si lo que estoy haciendo es desacoplar lo que es el funcionamiento del negocio de pues por ejemplo el almacenamiento de lo que está fuera si lo que estoy es desacoplando no tiene mucho sentido que aunque no sean los mismos objetos no sean los mismos pero los valores va a ser lo mismo y me voy a cargar todo el contenido de esos elementos que estoy manejando pero pero los registros que sean lo voy a cargar en memoria para trabajar todo con ello todo en memoria no tiene ningún sentido entonces hay que buscar un mecanismo de manera que eso eso no sea así es el mecanismo precisamente es el mismo que estamos utilizando para desacoplar una cosa el funcionamiento de una cosa de otra o sea la pregunta es por qué introducir artículo este operación es así en los que lo estamos considerando así que yo digo voy a introducir este artículo y entonces me voy al catálogo de precios del producto para obtener cuál es el precio de ese producto en las características de este multiobjeto y estoy esperando que ahí estén todos los precios de todos los productos que estoy estoy manejando vale pues lo recojo aquí y lo demás pues es como se ha explicado y no tendría mayores nuevas incógnitas si se ha entendido todo esto veis este es el resultado cuando he encontrado el elemento pues le pido al resultado o al manejador que está utilizando la colección de distintos ítems vendidos o comprados que es lo que estoy denominando pedido pues creo un elemento de esos y lo agrego igual que antes igual que en todos los sitios todo ese mecanismo siempre se repite lo mismo igual lo que hay que tener en cuenta es qué es lo que metemos aquí cómo se denominan estas cosas y cómo hacemos que sean lo mismo qué es lo que pedimos aquí y que está definiendo este a quien conoce que qué visibilidad tiene y por qué puede hacer determinadas cosas aparte de la obvia que es que éste está manejando una colección de elementos de esta esta de este tipo bien pues para saber cómo lo hacemos eso así y cómo hacemos esa sincronización y conseguimos que esté desacoplado pero para nosotros sea transparente el para nosotros quiero decir desde desde el punto de vista del funcionamiento del negocio que es lo que estamos implementando actualmente veamos vamos a recordar cuál ha sido el proceso cuando yo abro una sesión en caja de para ventas entonces el controlador de nivel jerárquico anterior lo que hace es crear el catálogo con los precios del producto el catálogo que está manejando en la colección de precios de los productos en su constructor lo primero que hace precisamente si estoy creando lo está vacío la colección bien por lo primero que hace es solicitar a esta factoría qué es un a ver uno un objeto global de manera que cualquiera desde cualquier punto del funcionamiento tiene visibilidad y tiene acceso ahora os diré entre otras cosas porque no es sólo por ser un singleton lo que hace es solicitar un adaptador de productos un adaptador de productos qué es del tipo de una interfaz abstracta este adaptador de productos que estoy llamando servicio de productos es lo que crea con un get instancia lo que cree es lo que crea esta factoría bien una vez que tenemos el servicio de productos que me da acceso al elemento externo lo que hago es invocar sobre él un método para que me traiga todos los productos y en principio me cargará todos según se especifique estos puede no cargar todos y entonces utilizar o implementar un mecanismo de por ejemplo de caché y una estrategia y definir una estrategia de carga de carga temprana que los cargaría pues todos o la mayoría o una carga una estrategia de carga perezosa y es que cuando se solicite un nuevo elemento pues se vaya a buscar al cuando se requiera un nuevo elemento se vaya a buscar a la parte exterior si no se encuentra ya cargada dentro del de la parte del negocio de lo que estamos manejando lo que lo que tenemos que evitar de cualquier forma es esta conexión directa nadie de aquí accede directamente a nadie de aquí accede directamente aquí esto no se puede dar nunca bien era simplemente para recordaros esta digamos digamos carga y inicial pero lo fundamental es que el catálogo ya haga lo que haga una vez que se haga la copia y se guarde dentro del controlador del caso de uso ese catálogo ya tiene un acceso al exterior con las los métodos ese acceso en exterior tiene los métodos correspondientes para hacer determinadas cosas con esta fachada cómo se ha conseguido esto pues bien el catálogo de productos lo que has hecho ha sido invocar a la factoría de servicios a ese get instancia está término subrayado lo que quiere decir es que es un atributo estático igual que el método son estáticos es por ese motivo por el que son visibles desde cualquier parte entonces siempre lo puedo invocar al get instancia este que es de distancia en este caso me da un adaptador de productos me da la instancia que le corresponde a lo que le está pidiendo el catálogo de productos el adaptador de uno de tipo adaptador de productos está en la interfaz de adaptador de productos la interfaz de adaptador de productos se puede realizar se puede especializar en este caso lo que estoy haciendo es un adaptador a productos locales porque lo que voy a hacer es una caché en disco y un adaptador a servicio a los a una base de datos una base de datos donde están guardados la información de los productos estas son las dos especializaciones que voy a utilizar estos adaptadores son los que se van a conectar con lo que os he dicho antes de la fachada y la fachada en la que se va a conectar con la fachada de la base de datos por ejemplo de acuerdo esto es la fachada pero está dentro está dentro de la fachada de los servicios técnicos y esto ya está fuera si yo esto lo cambio y lo que quiero es un adaptador un perdón un servicio de información web pues aquí colocaré un servicio de información web esta no me vale y se estará conectando con un servicio de información web y será este el adaptador pero de dentro del negocio la el guete especificación con artículo y de y especificación del producto que es lo que me devuelve va a ser el mismo para todos sólo que la implementación en bien órdenes a la página web etcétera la implementación para conectarse con esta fachada o con esta otra que tendrá pues por ejemplo sentencias sql eso es lo que va a ser diferente es decir lo que son diferentes son las fachadas pero no el funcionamiento de esto bien se ha entendido esto esto aparece en la página 475 del libro vale con este patín montado entonces introducir artículo id para cambiar de diagrama y utilizar un diagrama de colaboración en el lugar de un diagrama de secuencia pues sería prácticamente igual empezamos igual desde luego introducir artículo y de del producto y la cantidad y eso lo recoge registro de ventas que es lo primero que hace solicitar el controlador solicitar al catálogo de precios de productos que me diga las características de ese producto especificación del producto esas características fundamentalmente son su precio de acuerdo vale correspondientemente el catálogo de precios de productos lo que hace es consultar 11 veis que en el de colaboración todos los mensajes se se indexan se numeran sume se numera su orden en el orden en el que se produce vale lo que hace es solicitar a su colección que estamos llamando caché en memoria la colección spex es la el almacenamiento en memoria que es volátil lo que siempre he estado diciendo que se está manejando dentro del ámbito de negocio de la lógica del negocio pues es esa colección o sea que esto es evanescente pero qué pasa si no encuentra ese identificador vale pues con este con este mecanismo que me he montado la siguiente es que si no lo encuentra el 12 no está en especificaciones entonces obtiene el la especificación del producto a el adaptador de productos locales ese adaptador no sé si recordáis quién es productos locales pero este sería la clase del adaptador de productos locales es un producto digo perdón es un adaptador que lo que hace es comunicarse en este caso con un fichero un fichero donde se están guardando de manera indexada todos los objetos de esa colección que estoy manejando bien vale pues este adaptador de productos locales que todos vienen de la misma interfaz vale son especializaciones de esa misma interfaz de interfaz adaptador de productos a lo que hace es el 12 el bien el 12 lo que hace es buscar como os he dicho antes o debería haberos dicho antes lo que hace es buscar directamente en en la caché en disco local la que estoy denominando local que es el file cp bien busca aquí que esto es como si fuera la fachada correspondiente y la base de datos externa es equivalente busca aquí y si no está en el fichero de indexado por clave de objetos serializados digamos esa es la estructura que le estoy dando a ese fichero en disco pues lo que hace es ejecutar una búsqueda en en el servicio de remoto vamos a ver esto porque es pues porque el adaptador de productos locales resulta que tiene una referencia también al servicio externo al servicio remoto que si no está en local permite invocar al servicio remoto es decir servicio remoto como el servicio de productos es de catálogo el servicio remoto es un un atributo un componente de productos locales bien así que si no está en su fichero lo que hace es buscarlo en el servicio remoto el servicio del remoto es del tipo y es el adaptador base de datos de productos y accede directamente a la fachada de la base de datos que como os he dicho es la que se conecta con la fachada de la base de datos qué pasa si en lugar de esto lo que pongo es un servicio de páginas web entonces en lugar de este lo que tengo que utilizar es este otro adaptador el servicio remoto sería este otro adaptador y que sería el que se conectaría con la fachada web y esta sería la que se conectaría con la fachada http de representación búsqueda etcétera de los servicios web de información de acuerdo entonces digamos todo este mecanismo es la realización detallada de lo que hemos visto antes en principio se ha imaginado que todos están aquí y lo que se hace es buscar y una vez que se ha encontrado lo que se hace es pasárselo a la venta y venta lo que hace es crear un elemento nuevo y una vez que lo tiene lo añade a la colección todo esto es igual que antes y esto es un mecanismo digamos de respaldo para permitir sincronizar uno con otro qué pasa qué digamos cuando existen fenómenos de concurrencia o simultaneidad pues por ejemplo os he dicho que esto es estamos dentro el controlador del caso de uso es un controlador que es de sesión pero es que sólo tenemos una caja abierta y sólo se puede producir ventas en esa caja pero y si fuera una página una venta online y que hubiera distintas sesiones abiertas pues tendríamos que tener en cuenta la el stock de lo que estamos vendiendo y las modificaciones y los cambios de estado de los elementos estos que estamos utilizando para la venta entonces la cuestión es que se necesita una sincronía con lo que hay aquí metido y lo que estamos manejando internamente esa sincronía se consigue mediante un fred activo de manera que hace un run es el el estereotipo es ronable hace un bucle de ejecución infinito de manera que constantemente o cada cierto tiempo en lapsos de tiempo está consultando y refrescando lo que hay en el fichero indexado por clave de objetos serializados y bueno habría que hacer también en una sincronización entre esto entre la caché en disco y la caché en memoria para que todos estuvieran de forma correlativa pero la cuestión es esa una vez que sabemos cómo se implementa todo este mecanismo pues ya podemos dar por hecho que esa sincronía se produce y que lo que hacemos aquí se está manteniendo en todos los lados y podemos quedarnos con con esta parte sólo con esta parte que he pintado en azul como definición y especificación de cómo funciona esta operación de introducción artículo cantidad alguna duda con respecto a esto bien lo siguiente sería si es necesario especificar alguna de estas operaciones alguna de estas operaciones esto es una operación generalmente una operación es un evento principal por tanto viene del del actor que defina que define una secuencia de acciones que tienen una entidad propia y tiene determinada significación por ejemplo nueva venta pues sería un evento que definiría una de las operaciones finalizar venta pues sería el otro evento que significa pues una operación con suficiente entidad e introducir artículo dentro del bucle pues sería una de esas otra de esas operaciones en este caso vamos a ver cómo se escribe un contrato un contrato no es más que una aclaración una un detalle de cómo funciona el el código que da que se comporta para realizar esa operación operación que estamos manejando esa especificación requiere un lenguaje especial un lenguaje especial en el que se está estableciendo pues la existencia en el caso de las precondiciones de de instancias como vemos es totalmente vivo o sea responde estrictamente a a ver si está a tiro estrictamente bueno aquí le falta algunas nombres de instancia a el mecanismo que está hemos descrito en el diagrama de interacción el diagrama de secuencia o el de colaboración me da lo mismo y por eso es precisamente por lo que tiene que coincidir estas cosas que estoy diciendo existencia de instancias y a qué clase pertenecen valor estoy sigo en precondiciones valor de los atributos o de los de esas instancias del contenido de las instancias bien mientras que en las pos condiciones que significa que son acciones que se realizan y éstas ya están consumadas estás lo que se expone aquí está consumado por eso se llaman precondiciones como veis aquí pues hay una hay una instancia registro v que es de la clase registro ventas que está inicializada y asociada asociada quiere decir que es un componente de al controlador del nivel de funcionamiento inmediatamente anterior que es tienda para ponerle un nombre a ese tipo pues a esa clase pues habría que ponerle pues el nombre de la sucursal por ejemplo bien es importante que os fijéis en esta sintaxis que estoy utilizando aquí porque es la que se exige en en la escritura del contrato de una operación es tan rigurosa digámoslo así porque no puede dar lugar a las a las ambigüedades ni a las el malentendidos y discrepancias con respecto a lo que estoy plasmando en el día en el diagrama de interacción de el de colaboración o el de secuencia da lo mismo por lo tanto los nombres de las instancias y de las clases etcétera etcétera tienen que coincidir al 100% en cuanto a las condiciones siempre se escriben en pasado también lo que ha pasado es como una foto fija de la conclusión de la realización de esa operación de la operación de la que nos estamos refiriendo entonces lo que tenemos es creación de instancias otra de las cuestiones que se ven en las precondiciones pues asociación bien la creación de instancia pues se tiene que decir el nombre de la instancia de qué tipo es y a quién está asociado a quien está asociado lo que está significa lo que está significando es quién la ha creado qué instancia ha creado esta nueva instancia que estamos indicando creación de asociaciones creación modificación asociaciones no sé qué poner aquí inicialización asignación o modificación de los valores pues por ejemplo de los atributos o de los elementos que conforman una colección pues la modificación de un determinado valor por otro y hay que decir que de dónde sale ese valor o cuál es ese valor que se está modificando a quien corresponde de qué instancia es etcétera etcétera bien con estas digamos acciones o descripciones es como se especifica mediante la escritura de un contrato que es lo que ha pasado en una determinada operación y cuáles son sus antecedentes insisto en llamar la atención sobre la necesidad de utilizar este tipo de lenguaje y sintaxis para especificar en la escritura de un contrato ojo que no es lo mismo que la escritura de del caso de uso yo lo estoy plasmando aquí aunque en el libro aparece la escritura de los contratos de las operaciones en términos incipientes incluso en la parte de digamos análisis pero se están utilizando ya los nombres de los atributos los nombres de las instancias los nombres de las clases las asociaciones etcétera etcétera que eso implica que se ha implementado ya el diseño con código con lo cual yo prefiero ponerlo aquí y esta forma de escribir o de definir un contra el contrato de una operación no es para nada la misma que es más lenguaje más natural que la la de la escritura del caso de uso es del lenguaje más natural y esto tiene una sintaxis digamos más rigurosa más más más estructurada que la otra e insisto en su utilización de este tipo de sintaxis especificando estrictamente lo que os estoy diciendo los nombres de las variables los cambios de asociación la creación de variables no los nombres de las instancias en los nombres de las clases las asociaciones que se crean se destruyen a quién pertenecen o se cambian etcétera la de los valores los tipos de a qué atributo pertenece cómo se cambian porque etcétera etcétera utilizando este lenguaje digamos más más estructurado y específico que el de la escritura del caso de uso bien por fin estaría el diagrama de clases vuelvo a decir que aunque en otros ámbitos por ejemplo introducción al ingeniero del software se acepta que el diagrama de clases pues tiene un carácter más dinámico porque incluye e introduce lo que es el los métodos es decir la capacidad de acción que tienen los objetos vuelve será estático aquí por mucho que tengamos métodos no sabemos qué método se ejecuta en el funcionamiento antes del otro ni por qué etcétera etcétera bien lo que sí os quiero decir es que bueno aquí las relaciones ya en la mayoría de los casos y los ejemplos utilizó directamente la notación que aparece en el diagrama del modelo de dominio y ni siquiera me preocupo en cambiarlos pero aquí es más propio utilizar las relaciones propias de uml correspondientes a las relaciones entre clases como composición agregación en el caso de que hubiera herencia realización aparte de las de utilización uso dependencia etcétera etcétera vale además de esto también os quiero resaltar mientras que en el modelo de dominio no se ponen los tipos de los atributos aquí es necesario poner los tipos de los atributos mientras que en el modelo de dominio no se ponen métodos aquí hay que poner los métodos significativos si está todo esto lleno de getters o sea que podríamos poner setters pues estos no hacen falta si no son significativos para el funcionamiento sí sí lo son pues sí que hay que ponerlos no sólo hay que poner el método sino también el tipo que devuelven si es que devuelven alguno y si es significativo el tipo que devuelve o sea aquí me lo he comido me lo he comido porque porque más sencillez en cuanto a la representación y que me quepa dentro de la caja etcétera etcétera pero en general es importante poner el tipo que devuelve cada método y el tipo de vamos de los atributos es imprescindible y de todos estos puestos habrían habría que poner el tipo que devuelven aunque aquí no lo haya puesto bien otras de las de las relaciones que no se ponían en el diagrama del modelo de modelo de dominio es el de las asociaciones por uso o por dependencia como ocurre aquí en el controlador del caso de uso que resulta que tiene una asociación con este producto evidentemente incluso diría que aquí no aparece pero artículo y de pues también tendría su relación también lo está manejando aquí el controlador del caso de uso este capturada en nos damos cuenta de que en realidad este es un componente un miembro al que tiene pleno acceso el registro de ventas no es una agregación porque es un elemento único y a otra cosa bueno y venta pues también tiene una relación de de conocimiento de uso de las instancias o una instancia en concreto del tipo especificación del producto una cosa aquí no lo hemos desarrollado en el libro lo desarrolla ampliamente aunque no lo pone en ningún diagrama de clases y es que el pago el pago no es más que una abstracción poli polimórfica el pago se puede especializar en pago a crédito pago en efectivo pago con tarjeta y a su vez cada uno de ellos pues tiene un desarrollo del funcionamiento en función de la modalidad distinta e interviene una serie de operaciones como aparte de la que os he dicho de obtener el total y acceder a través del cálculo del adaptador calculador de impuestos al módulo externo que calcula los impuestos de la venta con todos los elementos de línea de venta pues el pago en el caso de pago en modalidad a crédito pues necesita una autorización del pago en fin que incluye dentro del mismo funcionamiento incluye incluye una diversificación de ese funcionamiento muy notable y además que es sustancial para definir cuál es el funcionamiento de del caso de uso que se desarrolla en los capítulos finales del libro y que es muy interesante que miréis es decir pago pues lo podemos descomponer en distintas modalidades de pago y aquí sí que ya aparecen esos diagramas de herencia y de organización que estáis a lo mejor más acostumbrados a ver mientras tanto aquí como habéis visto incluso en la utilización de estos adaptadores aunque pusiéramos aquí los adaptadores etcétera etcétera no tiene no tiene nada de herencia ni se está utilizando ese mecanismo bien vamos a ver ahora con el caso de uso procesar cargabuque como os he dicho lo anterior quedaría más o menos igual a pesar de esas cuestiones que os he comentado anteriormente pero en este caso de finalizar la carga pues aquí lo que haría es que pasar el manifiesto autor y actualizado que he ido construyendo en los distintos pasos del de la interacción de carga producto carga tanque en el buque en la iteración justo anterior a esto esto está recortado digamos y aquí estaba la anterior operación lo que pasa que he pegado todos los instancias de los objetos que estamos utilizando para que veáis cómo se con qué se relaciona bien como decía pues lo que hago es trasladar el manifiesto actualizado al a infobuque de acuerdo lo siguiente sería agregar infobuque a el resultado de la operación del caso de uso que estamos buscando y me quedaría que eso lo que no había puesto actualizar el buque en la colección persistente con el nuevo manifiesto que a su vez actualizado pues nada se invoca a la rutina la el método actualizar buque donde le paso el buque y de y el los nuevos valores de infobuque al catálogo el catálogo lo que tendrá que hacer desde desarrollar la el método para ojo que un hashmap si le haces un put con un con una clave que coincida no sustituye el elemento asociado a esa clave por el nuevo elemento sino que crea otro nuevo crea un nuevo elemento con la misma clave y el elemento que nosotros le digamos así que tener cuidado con estas cosas por eso utilizo actualizar el elemento como un método genérico que habrá que ver cómo se resuelve en cada estructura de la colección el caso es que el catálogo de buques implementará el método actualizar buque que de manera que actualizará en la caché digámoslo así en memoria y a la además accederá a través del adaptador de productos a la fachada para hacer la correspondiente sustitución de el buque que teníamos antes por el buque con los nuevos valores o como queráis llamarlo o el buque que teníamos antes por los nuevos valores actuales del buque y me explico esto se entiende bien lo mismo que hemos hecho con con el buque habrá que hacerlo en la interacción también habrá que actualizar los depósitos del puerto en cada en cada producto que se carga y lo mismo que hemos hecho con el buque tenemos que hacer un set productos disponibles en el infopuerto agregarlo y para eso no teníamos que haberlo agregado al principio sino que tenemos que agregarlo ahora que es cuando se hemos podido actualizarlo al principio quiero decir que al crear carga buque ya le habíamos agregado la información del puerto bien como la información del puerto que está siendo modificada en la operación de cargar los tanques del buque pues eso no lo teníamos que haber hecho en la creación sólo la fecha la hora y otra serie de cosas que son comunes para y es ahora cuando le agregamos al resultado la información del buque que estamos utilizando y también después de actualizar los los depósitos en infobuque le agregamos el info perdón en infopuerto le agregamos al infopuerto de igual forma pues también habría que hacer un actualizar puerto puerto y de infopuerto al correspondiente catálogo de puertos y en la correspondiente colección de especificación de puertos y una vez que se ha hecho esto pues si ya se puede decir que se ha completado se cierra el resultado y la interfaz de usuario puede mostrar el contenido de dicho resultado de carga final respecto a la escritura del contrato de la operación en este caso estamos utilizando cargar tanque pues no merece mayores comentarios que lo que ya he dicho anteriormente estas pasos estas acciones que he comentado de actualizar los depósitos del puerto y demás no aparecerían aquí entonces deberíamos incluirlo incluirlo lo que lo que hay que hacer el diagrama de car de clases de procesar buque pues veis que aunque sea exactamente igual que el diagrama de clases de procesar venta se ha enmarañado con todos estos objetos todas estas clases porque porque tenemos tres colecciones distintas de información porque porque estoy incluyendo aquí las clases correspondientes a la obtención de los adaptadores y los adaptadores en sí además de las correspondientes interfaces una cuestión el resultado que se busca en carga buque efectivamente contiene una colección de elementos correspondientes a la carga de cada tanque esa colección además incluye un objeto adicional que lo he puesto separado precisamente porque es información son datos más o menos tienen que ver pero en absoluto son de ninguno de estos objetos que estamos manejando en la parte del negocio sino que los incorpora directamente el actor por fuera por eso le da una entidad especial si no hay esas necesidades esto formar todos estos ítems todos estos atributos formarían parte de en este caso de y te encarga o del resultado final en el caso que no tuviera una colección y estuviera asociado a cada uno de los elementos de esa de esa conexión lo digo por algunas cosas que he visto en las las pecs y en la bueno y en los futuros pues que porque no tiene sentido hace estas divisiones en cuanto al resultado al contenido de del resultado bien como esto se ve muy malamente he intentado hacer pero es que se ve igual de mal que restringiendo me sólo a lo que es la relación entre el controlador del caso de uso y la colección de información del buque y las relaciones que se producen el correspondiente adaptador como es el catálogo el que solicita a la factoría que le dé un adaptador y qué es lo que produce es una interfaz polimórfica y esta es la que se resuelve en este adaptador que es precisamente el que está como componente en el catálogo por lo demás pues efectivamente aquí vemos que claro como ese parado el manifiesto como colección de la carga de los tanques lo he separado pues lo estoy manejando directamente y entonces aquí tiene que necesariamente aparecer esta relación de uso con este elemento que principio debería corresponderse o está al estar contenido en especificación del buque pues pues debería manejarse desde ahí no sé si tenéis alguna apreciación más que podáis indicar o sobre la que tengáis dudas si en el en un vamos a ver he tenido una consulta que me ha dejado bastante roto el digamos la prueba final espero que todo el mundo lo entienda la prueba final es el puff de ahí o sea la entrega del trabajo la entrega del trabajo que día es es este domingo el plazo final 19 no el domingo vale pues eso lo que hay que entregar y es y eso es lo que se lleva la práctica totalidad de la nota con las compensaciones con la pec o con la práctica como la llamáis vosotros etcétera pero es la entrega del trabajo este domingo la que se lleva toda la nota ese trabajo lo corregimos el equipo docente mi compañero javier y yo el examen presencial qué es lo que ella se llama examen de control son preguntas sobre qué nombre se le ha dado a las cosas que se utilizan que se han hecho en la práctica en la pd digo en el puff en el en el trabajo final es decir es una prueba de control de la autoría entonces al con el examen ese presencial de control podéis llevarnos lo que os dé la gana mientras sea material escrito en papel o sea podéis llevar el libro que no sirve para nada evidentemente os podéis llevar todo lo que queráis la pec el puff vuestra versión etcétera lo que queráis porque las preguntas van a ser respecto a cómo se llama los objetos conceptuales que se han puesto en el modelo en la pregunta 3 del modelo de dominio pues vosotros ponéis los nombres de lo que vosotros hayáis puesto y todo ese material escrito todo el que queráis perdón todo el material escrito que queráis os lo podéis llevar porque está puesto así en el enunciado del examen respuesta la puff impresa o la puede llevar correcto vale he estado hablando esta tarde precisamente respecto a no sé qué hora es nos queda poco de grabación respecto a eso si en el funcionamiento resulta que resulta necesario hacer modificaciones en valores que están en algún elemento persistente pues desde luego vamos a necesitar los adaptadores y toda esta parafernalia para hacer esa actualización y esa modificación en el almacén persistente pero si el funcionamiento del caso de uso no no hace ninguna de esas modificaciones no lo requiere pues entonces no hace falta ponerlos en el diagrama de en el diagrama que sea el diagrama de clases de diseño etcétera etcétera explicado vale más preguntas bueno pues entonces vamos a dar por finalizada esta tutoría y sospecho que las del curso porque ya no queda mucho margen pues nada muchas gracias por vuestra colaboración participación a inco y nada que tengáis muchas suertes en la evaluación y que os salga muy bien