{"id":542,"date":"2026-08-14T08:16:11","date_gmt":"2026-08-14T08:16:11","guid":{"rendered":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/"},"modified":"2026-09-03T15:28:09","modified_gmt":"2026-09-03T15:28:09","slug":"1106-2","status":"publish","type":"post","link":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/","title":{"rendered":"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n"},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p>En la ingenier\u00eda de software orientada a objetos, el <a href=\"https:\/\/www.visual-paradigm.com\/guide\/uml-unified-modeling-language\/uml-class-diagram-tutorial\/\">diagrama de clases<\/a> es el artefacto m\u00e1s ubicuo pero frecuentemente mal aplicado. A menudo se reduce a un simple esquema de base de datos en notaci\u00f3n UML o se trata como un mapa directo 1:1 de la estructura del c\u00f3digo; un verdadero diagrama de clases es una especificaci\u00f3n rigurosa de <strong>estructura est\u00e1tica, contratos de tipo y relaciones sem\u00e1nticas<\/strong>. Es el plano arquitect\u00f3nico que cierra la brecha entre los conceptos del dominio empresarial y el dise\u00f1o de software ejecutable.<\/p>\n<p>A pesar del dominio de las metodolog\u00edas \u00e1giles y el desarrollo guiado por pruebas, el <a href=\"https:\/\/www.visual-paradigm.com\/guide\/uml-unified-modeling-language\/what-is-class-diagram\/\">diagrama de clases<\/a> sigue siendo el est\u00e1ndar de oro para definir contratos de API, validar modelos de dominio con las partes interesadas y garantizar la integridad estructural antes de comenzar la implementaci\u00f3n. Sin embargo, producir un diagrama de clases de nivel profesional requiere m\u00e1s que dibujar cajas y flechas. Exige un estricto cumplimiento de los niveles de abstracci\u00f3n (Conceptual, L\u00f3gico, F\u00edsico), una comprensi\u00f3n precisa de la sem\u00e1ntica de las relaciones (asociaci\u00f3n frente a agregaci\u00f3n frente a composici\u00f3n) y una aplicaci\u00f3n disciplinada de los principios SOLID para evitar el deterioro estructural.<\/p>\n<p id=\"LTosBzR\"><img loading=\"lazy\" alt=\"Diagrama que muestra c\u00f3mo los diagramas de clases conectan los conceptos empresariales y el c\u00f3digo a trav\u00e9s de niveles de abstracci\u00f3n y sem\u00e1ntica de relaciones.\" class=\"alignnone size-full wp-image-1107\" decoding=\"async\" height=\"572\" loading=\"lazy\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" src=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png\" srcset=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png 1024w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185-300x168.png 300w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185-768x429.png 768w\" width=\"1024\"\/><\/p>\n<p>Esta gu\u00eda proporciona una referencia completa sobre el vocabulario de los diagramas de clases, la jerarqu\u00eda de abstracci\u00f3n, las reglas de relaci\u00f3n y los invariantes de calidad. Ya sea que est\u00e9 modelando un dominio complejo de Gesti\u00f3n de Pedidos o dise\u00f1ando un contrato de API de microservicio, las siguientes secciones establecen el marco preciso necesario para crear diagramas de clases que sean anal\u00edticamente s\u00f3lidos, arquitect\u00f3nicamente robustos y pr\u00e1cticamente \u00fatiles. Todos los ejemplos se generan utilizando PlantUML, proporcionando especificaciones ejecutables que pueden controlarse por versiones e integrarse en pipelines de CI\/CD.<\/p>\n<hr\/>\n<h2>1. Los bloques de construcci\u00f3n fundamentales: El vocabulario del diagrama de clases<\/h2>\n<p>Antes de abordar los niveles de abstracci\u00f3n, debe dominar los elementos fundamentales. Estos son consistentes en los est\u00e1ndares UML 2.x, pero difieren significativamente en <em>intenci\u00f3n sem\u00e1ntica<\/em>dependiendo del nivel de abstracci\u00f3n.<\/p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Elemento<\/th>\n<th align=\"left\">Prop\u00f3sito<\/th>\n<th align=\"left\">Notaci\u00f3n<\/th>\n<th align=\"left\">Restricci\u00f3n clave<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><strong>Clase<\/strong><\/td>\n<td align=\"left\">Un plano para objetos; encapsula estado (atributos) y comportamiento (m\u00e9todos)<\/td>\n<td align=\"left\">Rect\u00e1ngulo con 3 compartimentos (Nombre, Atributos, Operaciones)<\/td>\n<td align=\"left\">El nombre debe ser un sustantivo singular; los atributos tipados; la visibilidad marcada (+, -, #)<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Interfaz<\/strong><\/td>\n<td align=\"left\">Un contrato que especifica comportamiento sin implementaci\u00f3n<\/td>\n<td align=\"left\">Rect\u00e1ngulo con el estereotipo \u00abinterface\u00bb o notaci\u00f3n de piruleta<\/td>\n<td align=\"left\">Sin atributos (excepto constantes); todas las operaciones p\u00fablicas abstractas<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Enumeraci\u00f3n<\/strong><\/td>\n<td align=\"left\">Un conjunto fijo de valores nombrados<\/td>\n<td align=\"left\">Rect\u00e1ngulo con el estereotipo \u00abenumeration\u00bb<\/td>\n<td align=\"left\">Valores listados en el compartimento de nombre; t\u00edpicamente sin operaciones<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Asociaci\u00f3n<\/strong><\/td>\n<td align=\"left\">Relaci\u00f3n estructural que indica que los objetos est\u00e1n conectados<\/td>\n<td align=\"left\">L\u00ednea s\u00f3lida con multiplicidad opcional<\/td>\n<td align=\"left\">Debe tener nombres de rol en ambos extremos para claridad; multiplicidad obligatoria<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Agregaci\u00f3n<\/strong><\/td>\n<td align=\"left\">Relaci\u00f3n d\u00e9bil de \u201ctiene-a\u201d; la parte puede existir independientemente<\/td>\n<td align=\"left\">L\u00ednea s\u00f3lida con rombo hueco en el extremo del todo<\/td>\n<td align=\"left\">Ciclo de vida de la parte independiente del todo; es posible la propiedad compartida<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Composici\u00f3n<\/strong><\/td>\n<td align=\"left\">Relaci\u00f3n fuerte de \u201cposee-a\u201d; la parte no puede existir sin el todo<\/td>\n<td align=\"left\">L\u00ednea s\u00f3lida con rombo relleno en el extremo del todo<\/td>\n<td align=\"left\">Ciclo de vida de la parte vinculado al todo; propiedad exclusiva<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Herencia<\/strong><\/td>\n<td align=\"left\">Relaci\u00f3n de \u201ces-un\u201d; la subclase hereda estructura\/comportamiento<\/td>\n<td align=\"left\">L\u00ednea s\u00f3lida con tri\u00e1ngulo hueco apuntando al padre<\/td>\n<td align=\"left\">El Principio de Sustituci\u00f3n de Liskov debe cumplirse; evitar jerarqu\u00edas profundas<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Realizaci\u00f3n<\/strong><\/td>\n<td align=\"left\">Relaci\u00f3n de \u201cimplementa\u201d; la clase cumple el contrato de la interfaz<\/td>\n<td align=\"left\">L\u00ednea discontinua con tri\u00e1ngulo hueco apuntando a la interfaz<\/td>\n<td align=\"left\">La clase debe implementar todas las operaciones de la interfaz<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Dependencia<\/strong><\/td>\n<td align=\"left\">Relaci\u00f3n de \u201cusa\u201d; acoplamiento temporal o d\u00e9bil<\/td>\n<td align=\"left\">Flecha abierta discontinua<\/td>\n<td align=\"left\">Minimizar; indica un objetivo potencial de refactorizaci\u00f3n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Convenciones de Nomenclatura (Cruciales para la Claridad)<\/h3>\n<ul>\n<li>\n<p><strong>Clases:<\/strong>Sustantivos en singular PascalCase \u2192<code data-backticks=\"1\">Orden<\/code>,\u00a0<code data-backticks=\"1\">PerfilCliente<\/code>,\u00a0<code data-backticks=\"1\">PasarelaDePago<\/code>. Nunca plural (<code data-backticks=\"1\">Pedidos<\/code>) o basado en verbos (<code data-backticks=\"1\">ProcesarPedido<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>Atributos:<\/strong>\u00a0camelCase + tipo \u2192\u00a0<code data-backticks=\"1\">orderId: UUID<\/code>,\u00a0<code data-backticks=\"1\">createdAt: DateTime<\/code>. Prefijo de visibilidad obligatorio:\u00a0<code data-backticks=\"1\">+<\/code>\u00a0p\u00fablico,\u00a0<code data-backticks=\"1\">-<\/code>\u00a0privado,\u00a0<code data-backticks=\"1\">#<\/code>\u00a0protegido.<\/p>\n<\/li>\n<li>\n<p><strong>Operaciones:<\/strong>\u00a0frase verbal en camelCase + tipo de retorno \u2192\u00a0<code data-backticks=\"1\">+calculateTotal(): Decimal<\/code>,\u00a0<code data-backticks=\"1\">-validateAddress(): Boolean<\/code>. Par\u00e1metros tipados:\u00a0<code data-backticks=\"1\">(quantity: Integer, price: Decimal)<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Relaciones:<\/strong>\u00a0Nombres de roles en ambos extremos \u2192\u00a0<code data-backticks=\"1\">Cliente [1] realiza [0..*] Pedido<\/code>. Multiplicidad siempre especificada: <code data-backticks=\"1\">1<\/code>,\u00a0<code data-backticks=\"1\">0..1<\/code>,\u00a0<code data-backticks=\"1\">0..*<\/code>,\u00a0<code data-backticks=\"1\">1..*<\/code>,\u00a0<code data-backticks=\"1\">n..m<\/code>.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>2. La Jerarqu\u00eda de Abstracci\u00f3n: Conceptual, L\u00f3gica, F\u00edsica<\/h2>\n<p>La dimensi\u00f3n m\u00e1s cr\u00edtica en el modelado de Diagramas de Clases es <strong>nivel de abstracci\u00f3n<\/strong>. Confundir estos niveles es la principal causa de fracaso del modelo. Cada nivel sirve a partes interesadas y prop\u00f3sitos distintos. No son pasos secuenciales que se descartan, sino vistas paralelas mantenidas a lo largo del ciclo de vida.<\/p>\n<h3>2.1 Diagrama de Clases Conceptual: La Verdad del Dominio<\/h3>\n<ul>\n<li>\n<p><strong>Enfoque:<\/strong>  Entidades, relaciones y reglas del negocio <em>independientes de cualquier tecnolog\u00eda o implementaci\u00f3n<\/em>.<\/p>\n<\/li>\n<li>\n<p><strong>Ignora deliberadamente:<\/strong>  Lenguajes de programaci\u00f3n, bases de datos, frameworks, APIs, preocupaciones de rendimiento, formatos de serializaci\u00f3n.<\/p>\n<\/li>\n<li>\n<p><strong>Atributos:<\/strong>  Solo propiedades con significado empresarial. Sin IDs a menos que sean relevantes para el negocio (por ejemplo, <code data-backticks=\"1\">ssn<\/code>,\u00a0<code data-backticks=\"1\">isbn<\/code>). Sin claves for\u00e1neas.<\/p>\n<\/li>\n<li>\n<p><strong>M\u00e9todos:<\/strong>\u00a0Raramente mostrado. Si est\u00e1 presente, representa\u00a0<em>comportamientos empresariales<\/em>\u00a0(<code data-backticks=\"1\">calculateDiscount()<\/code>,\u00a0<code data-backticks=\"1\">isEligibleForRenewal()<\/code>), no getters\/setters.<\/p>\n<\/li>\n<li>\n<p><strong>Relaciones:<\/strong>\u00a0Reflejan sem\u00e1nticas del mundo real. Las multiplicidades reflejan reglas de negocio, no restricciones de almacenamiento.<\/p>\n<\/li>\n<li>\n<p><strong>Partes interesadas:<\/strong>\u00a0Expertos del dominio, analistas de negocio, propietarios del producto, auditores.<\/p>\n<\/li>\n<li>\n<p><strong>Estabilidad:<\/strong>\u00a0Alta. Cambia solo cuando evoluciona la comprensi\u00f3n del negocio.<\/p>\n<\/li>\n<\/ul>\n<h4>Ejemplo: Dominio conceptual de pedidos<\/h4>\n<p id=\"wgJeAyU\"><img loading=\"lazy\" alt=\"Diagrama de clases conceptual para el Dominio de Pedidos que muestra las relaciones entre Cliente, Pedido, Producto y Direcci\u00f3n de Env\u00edo.\" class=\"alignnone size-full wp-image-1109\" decoding=\"async\" height=\"874\" loading=\"lazy\" sizes=\"auto, (max-width: 1916px) 100vw, 1916px\" src=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7eceeeeee6a.png\" srcset=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7eceeeeee6a.png 1916w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7eceeeeee6a-300x137.png 300w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7eceeeeee6a-1024x467.png 1024w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7eceeeeee6a-768x350.png 768w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7eceeeeee6a-1536x701.png 1536w\" width=\"1916\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">Plantuml<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:RLJ1RXf13BsljF_WSccIYYYv8hKAsIKgQg08IEx3he4HipFR6MyehIhr8ohr0_eflVSZ-YMrPma9KI-CxNtpR8-VkGgaF3MLWSBP0cjgbEawNwBlbgvIsgR9ArfZXL2Rw8MDjhNogWAZBTAkHd2UrkxvbyAe4Ff4NYyQmY4pp_GNX8iqMUiIeT2-CBXtAkJBPKYJD25D1Y4xr06Py42krKfO_tx_0H-bCiXZPN1otGIkWI7t6hUdGX4pGzO4SXK3lwO9mB8nPgouWnxCk2IxaY0oW-78GCv-MNgcaNY5rG9zMEjwhfcW1tAaoRSdyhQ4o1pVALSar798ZD-Jci21Y9j5J-9l2cMAnZ1gxaYParE6Z9p5NVoemunJrcfXC7wvTiwWiaU99zwLJK5jQlkoeR1fnFzm9qvZDKsyBl0foJEYc8glxTjk2GDvH3gYB3JjZWEkiUGbbhLMvahSKwDjgkSzjwpvj7yp5oFxEBuPJaU3N9pP--5aqfhvu7PuFvYsJjOVPuFRMt6UEECS8jbitX_d_Mc4JgQ3qV1k9ERzSBB7lsQjU2n8EylgONrk0YprPs010pUXx8hrjVyrUcKhj9Gc1xLqBZlGzNgrfkuxw5oSdvzrzjFkYVeBv46slY3FkhmXMolGomXzd4zFLebOe4Vmhi5bv6NxvG1w888BS_UocCS4NCj_hvMuL8sXWtxJn3fMO-m1tBAjFaqEUwBjWv9te5wQH1d2M_ZpwqGsUKXOdTTHCxz_mYVQnNtQpvAyia7BkmPOkGVq5aj8ayLEbckfZP6NXAtpcwLnMnbS2L99cbonoVyk_m00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar Plantuml en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:RLJ1RXf13BsljF_WSccIYYYv8hKAsIKgQg08IEx3he4HipFR6MyehIhr8ohr0_eflVSZ-YMrPma9KI-CxNtpR8-VkGgaF3MLWSBP0cjgbEawNwBlbgvIsgR9ArfZXL2Rw8MDjhNogWAZBTAkHd2UrkxvbyAe4Ff4NYyQmY4pp_GNX8iqMUiIeT2-CBXtAkJBPKYJD25D1Y4xr06Py42krKfO_tx_0H-bCiXZPN1otGIkWI7t6hUdGX4pGzO4SXK3lwO9mB8nPgouWnxCk2IxaY0oW-78GCv-MNgcaNY5rG9zMEjwhfcW1tAaoRSdyhQ4o1pVALSar798ZD-Jci21Y9j5J-9l2cMAnZ1gxaYParE6Z9p5NVoemunJrcfXC7wvTiwWiaU99zwLJK5jQlkoeR1fnFzm9qvZDKsyBl0foJEYc8glxTjk2GDvH3gYB3JjZWEkiUGbbhLMvahSKwDjgkSzjwpvj7yp5oFxEBuPJaU3N9pP--5aqfhvu7PuFvYsJjOVPuFRMt6UEECS8jbitX_d_Mc4JgQ3qV1k9ERzSBB7lsQjU2n8EylgONrk0YprPs010pUXx8hrjVyrUcKhj9Gc1xLqBZlGzNgrfkuxw5oSdvzrzjFkYVeBv46slY3FkhmXMolGomXzd4zFLebOe4Vmhi5bv6NxvG1w888BS_UocCS4NCj_hvMuL8sXWtxJn3fMO-m1tBAjFaqEUwBjWv9te5wQH1d2M_ZpwqGsUKXOdTTHCxz_mYVQnNtQpvAyia7BkmPOkGVq5aj8ayLEbckfZP6NXAtpcwLnMnbS2L99cbonoVyk_m00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:RLHBRXD14DsFD7Sel249SfHiBO5YF8uOOJkMxMJVdYxRJNgwX_w034BY44Yi4KVW2Dbp24v2LO-Js87LL5M_VlNfLtFXWt0XrXegQofiGXIwQvr4rvMs5ihasREmmHgXqSdpjyeqmeaQj38OjWs2TM5ZzqygBRplX-3KCWOiYNckFY6SvTb6IOHAkKhZpgcHBakVPtaMLD08XH9h8X70I292lrSQ_Fdw3GfRAwCi0ngKIbeFHpUA6W6i6uTUE2NqCJEcGc0GVR0rElYSPm2hgFL4K4Czc5E5Pir1f5OrHORyxKj9B9xZDTPBT7wZceKYWXxm9y--F99VyQnQvZIsGWIcvW_7gAeGFGKIRfuyZh-eXAwY9jJ21g6FZWaojWQtwL3vEQLin59ZEdbjhKPX3X9FdPMn2crgyxGXVnlPVtlDJZGgJ9sgy3797b5AHTTsRRU4FZZ4S41PgR0z3DXeWkFOeBK6LkAE6asiztjkMOjP_tB1nk1gSbdEniE2dVcRSZfjpM8uAc-6izOPz2U3uMZ4pYDdUeT4Db_q9qL_bg3JsN1SNe_Pl2cdE_np694qq6XHaOYaSbXLoXgXawISKsiqe0K8LhAerDqlGvhISFV3hAEsoQPcTswUFUYeSzw1BbtVXEuhw9oTdfvqTZheyPfGjZnhVKQUT6cLFXg6dYVe_SlrMDY1jke0tjMuIhnaFtsQ7h0K_UAVOkuJK2t_lIPn9Q8E3yhECsD9fwa7iAks-ZmhpGTU7aD7UwlKoxCaKdW9ltyUyR3AWFLfanHrzntUXstQjeKJnYiUCO-RA4ZyqiBQqWeP8OM7F6ki0nhhIiTtQO634qlHcbMi6wrgXIPOVcm9N6EUNP19FwY_\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml conceptual-order-domain\r\n!theme plain\r\nskinparam linetype ortho\r\nskinparam classAttributeIconSize 0\r\nhide circle\r\nhide methods\r\n\r\ntitle Diagrama de clases conceptual \u2014 Dominio de pedidos (Vista empresarial)\r\n\r\nclass Customer {\r\n  fullName : String\r\n  email : EmailAddress\r\n  membershipTier : Tier\r\n}\r\n\r\nclass Order {\r\n  orderDate : Date\r\n  status : OrderStatus\r\n  +calculateTotal() : Money\r\n  +isShippable() : Boolean\r\n}\r\n\r\nclass Product {\r\n  name : String\r\n  sku : SKU\r\n  unitPrice : Money\r\n}\r\n\r\nclass ShippingAddress {\r\n  street : String\r\n  city : String\r\n  country : CountryCode\r\n}\r\n\r\nenum OrderStatus {\r\n  DRAFT\r\n  CONFIRMED\r\n  SHIPPED\r\n  DELIVERED\r\n  CANCELLED\r\n}\r\n\r\nenum Tier {\r\n  STANDARD\r\n  PREMIUM\r\n  VIP\r\n}\r\n\r\n' Los enlaces direccionales corrigen la alineaci\u00f3n del \u00e1ngulo del tri\u00e1ngulo\r\nCustomer \"1\" -right-&gt; \"0..*\" Order : places\r\nOrder \"1\" *--down-&gt; \"1..*\" Product : contains\r\nOrder \"1\" -left-&gt; \"1\" ShippingAddress : shipsTo\r\nCustomer \"1\" -down-&gt; \"0..1\" ShippingAddress : defaultAddress\r\n\r\nnote right of Order\r\nInvariante empresarial:\r\nTotal = \u03a3(lineItem.price \u00d7 qty)\r\n\r\nTransiciones de estado gobernadas \r\npor el flujo de trabajo de cumplimiento\r\nend note\r\n@enduml\r\n\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:RLHBRXD14DsFD7Sel249SfHiBO5YF8uOOJkMxMJVdYxRJNgwX_w034BY44Yi4KVW2Dbp24v2LO-Js87LL5M_VlNfLtFXWt0XrXegQofiGXIwQvr4rvMs5ihasREmmHgXqSdpjyeqmeaQj38OjWs2TM5ZzqygBRplX-3KCWOiYNckFY6SvTb6IOHAkKhZpgcHBakVPtaMLD08XH9h8X70I292lrSQ_Fdw3GfRAwCi0ngKIbeFHpUA6W6i6uTUE2NqCJEcGc0GVR0rElYSPm2hgFL4K4Czc5E5Pir1f5OrHORyxKj9B9xZDTPBT7wZceKYWXxm9y--F99VyQnQvZIsGWIcvW_7gAeGFGKIRfuyZh-eXAwY9jJ21g6FZWaojWQtwL3vEQLin59ZEdbjhKPX3X9FdPMn2crgyxGXVnlPVtlDJZGgJ9sgy3797b5AHTTsRRU4FZZ4S41PgR0z3DXeWkFOeBK6LkAE6asiztjkMOjP_tB1nk1gSbdEniE2dVcRSZfjpM8uAc-6izOPz2U3uMZ4pYDdUeT4Db_q9qL_bg3JsN1SNe_Pl2cdE_np694qq6XHaOYaSbXLoXgXawISKsiqe0K8LhAerDqlGvhISFV3hAEsoQPcTswUFUYeSzw1BbtVXEuhw9oTdfvqTZheyPfGjZnhVKQUT6cLFXg6dYVe_SlrMDY1jke0tjMuIhnaFtsQ7h0K_UAVOkuJK2t_lIPn9Q8E3yhECsD9fwa7iAks-ZmhpGTU7aD7UwlKoxCaKdW9ltyUyR3AWFLfanHrzntUXstQjeKJnYiUCO-RA4ZyqiBQqWeP8OM7F6ki0nhhIiTtQO634qlHcbMi6wrgXIPOVcm9N6EUNP19FwY_\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:RLJ1RXf13BsljF_WSccIYYYv8hKAsIKgQg08IEx3he4HipFR6MyehIhr8ohr0_eflVSZ-YMrPma9KI-CxNtpR8-VkGgaF3MLWSBP0cjgbEawNwBlbgvIsgR9ArfZXL2Rw8MDjhNogWAZBTAkHd2UrkxvbyAe4Ff4NYyQmY4pp_GNX8iqMUiIeT2-CBXtAkJBPKYJD25D1Y4xr06Py42krKfO_tx_0H-bCiXZPN1otGIkWI7t6hUdGX4pGzO4SXK3lwO9mB8nPgouWnxCk2IxaY0oW-78GCv-MNgcaNY5rG9zMEjwhfcW1tAaoRSdyhQ4o1pVALSar798ZD-Jci21Y9j5J-9l2cMAnZ1gxaYParE6Z9p5NVoemunJrcfXC7wvTiwWiaU99zwLJK5jQlkoeR1fnFzm9qvZDKsyBl0foJEYc8glxTjk2GDvH3gYB3JjZWEkiUGbbhLMvahSKwDjgkSzjwpvj7yp5oFxEBuPJaU3N9pP--5aqfhvu7PuFvYsJjOVPuFRMt6UEECS8jbitX_d_Mc4JgQ3qV1k9ERzSBB7lsQjU2n8EylgONrk0YprPs010pUXx8hrjVyrUcKhj9Gc1xLqBZlGzNgrfkuxw5oSdvzrzjFkYVeBv46slY3FkhmXMolGomXzd4zFLebOe4Vmhi5bv6NxvG1w888BS_UocCS4NCj_hvMuL8sXWtxJn3fMO-m1tBAjFaqEUwBjWv9te5wQH1d2M_ZpwqGsUKXOdTTHCxz_mYVQnNtQpvAyia7BkmPOkGVq5aj8ayLEbckfZP6NXAtpcwLnMnbS2L99cbonoVyk_m00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:RLJ1RXf13BsljF_WSccIYYYv8hKAsIKgQg08IEx3he4HipFR6MyehIhr8ohr0_eflVSZ-YMrPma9KI-CxNtpR8-VkGgaF3MLWSBP0cjgbEawNwBlbgvIsgR9ArfZXL2Rw8MDjhNogWAZBTAkHd2UrkxvbyAe4Ff4NYyQmY4pp_GNX8iqMUiIeT2-CBXtAkJBPKYJD25D1Y4xr06Py42krKfO_tx_0H-bCiXZPN1otGIkWI7t6hUdGX4pGzO4SXK3lwO9mB8nPgouWnxCk2IxaY0oW-78GCv-MNgcaNY5rG9zMEjwhfcW1tAaoRSdyhQ4o1pVALSar798ZD-Jci21Y9j5J-9l2cMAnZ1gxaYParE6Z9p5NVoemunJrcfXC7wvTiwWiaU99zwLJK5jQlkoeR1fnFzm9qvZDKsyBl0foJEYc8glxTjk2GDvH3gYB3JjZWEkiUGbbhLMvahSKwDjgkSzjwpvj7yp5oFxEBuPJaU3N9pP--5aqfhvu7PuFvYsJjOVPuFRMt6UEECS8jbitX_d_Mc4JgQ3qV1k9ERzSBB7lsQjU2n8EylgONrk0YprPs010pUXx8hrjVyrUcKhj9Gc1xLqBZlGzNgrfkuxw5oSdvzrzjFkYVeBv46slY3FkhmXMolGomXzd4zFLebOe4Vmhi5bv6NxvG1w888BS_UocCS4NCj_hvMuL8sXWtxJn3fMO-m1tBAjFaqEUwBjWv9te5wQH1d2M_ZpwqGsUKXOdTTHCxz_mYVQnNtQpvAyia7BkmPOkGVq5aj8ayLEbckfZP6NXAtpcwLnMnbS2L99cbonoVyk_m00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar Plantuml en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<p id=\"QCXQrCz\"><img loading=\"lazy\" alt=\"Diagrama de clases conceptual para el Dominio de Pedidos que muestra las relaciones entre Cliente, Pedido y Producto.\" class=\"alignnone size-full wp-image-1111\" decoding=\"async\" height=\"539\" loading=\"lazy\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" src=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf322af0a.png\" srcset=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf322af0a.png 771w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf322af0a-300x210.png 300w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf322af0a-768x537.png 768w\" width=\"771\"\/><\/p>\n<p><strong>Observaciones clave:<\/strong><\/p>\n<ul>\n<li>\n<p>Sin IDs, sin claves for\u00e1neas, sin anotaciones de persistencia.<\/p>\n<\/li>\n<li>\n<p>Los m\u00e9todos expresan l\u00f3gica de negocio, no acceso a datos.<\/p>\n<\/li>\n<li>\n<p>Las multiplicidades reflejan reglas de negocio (<code data-backticks=\"1\">Pedido<\/code>\u00a0<em>debe<\/em>\u00a0contener al menos un\u00a0<code data-backticks=\"1\">Producto<\/code>).<\/p>\n<\/li>\n<li>\n<p>Composici\u00f3n (<code data-backticks=\"1\">*--<\/code>) utilizada donde la sem\u00e1ntica empresarial lo exige (los \u00edtems de l\u00ednea no pueden existir sin una orden).<\/p>\n<\/li>\n<li>\n<p>Las enumeraciones capturan vocabularios empresariales, no c\u00f3digos t\u00e9cnicos.<\/p>\n<\/li>\n<\/ul>\n<h3>2.2 Diagrama de clases l\u00f3gico: La especificaci\u00f3n de software<\/h3>\n<ul>\n<li>\n<p><strong>Enfoque:<\/strong> Dise\u00f1o de software independiente de la plataforma. Define tipos, interfaces y contratos <em>sin comprometerse con tecnolog\u00edas espec\u00edficas<\/em>.<\/p>\n<\/li>\n<li>\n<p><strong>Incluye:<\/strong> Clases abstractas, interfaces, tipos gen\u00e9ricos, patrones de dise\u00f1o, tipos de manejo de errores.<\/p>\n<\/li>\n<li>\n<p><strong>Atributos:<\/strong> Tipados con tipos neutrales de plataforma (<code data-backticks=\"1\">String<\/code>,\u00a0<code data-backticks=\"1\">Decimal<\/code>,\u00a0<code data-backticks=\"1\">DateTime<\/code>,\u00a0<code data-backticks=\"1\">UUID<\/code>). Incluye atributos de identidad (<code data-backticks=\"1\">id<\/code>) y atributos derivados (<code data-backticks=\"1\">\/total<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>M\u00e9todos:<\/strong> Firmas completas que incluyen par\u00e1metros, tipos de retorno y excepciones. Los getters\/setters se omiten a menos que sean significativos desde el punto de vista del comportamiento.<\/p>\n<\/li>\n<li>\n<p><strong>Relaciones:<\/strong> Multiplicidades precisas, flechas de navegabilidad, nombres de roles. Interfaces realizadas expl\u00edcitamente.<\/p>\n<\/li>\n<li>\n<p><strong>Partes interesadas:<\/strong>Arquitectos, desarrolladores senior, dise\u00f1adores de API.<\/p>\n<\/li>\n<li>\n<p><strong>Estabilidad:<\/strong>Media. Evoluciona con el refinamiento del dise\u00f1o, pero es estable independientemente de las opciones de implementaci\u00f3n.<\/p>\n<\/li>\n<\/ul>\n<h4>Ejemplo: Dise\u00f1o l\u00f3gico del servicio de pedidos<\/h4>\n<p id=\"ClcVxRL\"><img loading=\"lazy\" alt=\"Diagrama de clases l\u00f3gico para el Servicio de Pedidos que muestra la interfaz, los DTO y las entidades del dominio.\" class=\"alignnone size-full wp-image-1113\" decoding=\"async\" height=\"869\" loading=\"lazy\" sizes=\"auto, (max-width: 1917px) 100vw, 1917px\" src=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf61242e6.png\" srcset=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf61242e6.png 1917w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf61242e6-300x136.png 300w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf61242e6-1024x464.png 1024w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf61242e6-768x348.png 768w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecf61242e6-1536x696.png 1536w\" width=\"1917\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:TLLHRjim3FqFa3jmtK_IrjdsQnH1ksG30WHeiQG7K2pMqIfBhaGNoxe1EyHEk9ECikp4JjDyn0eVwST7Kior9-6eAZHecwjCwCGwYIxnw9vLXiF1EzfYWL1geSnmu1-LAOKJ1MXba7ObWdMqjLqaqyBx6oAdDXNX8hDcfNuYV1mEXWDIf16MaGfcmHFcIkGXxj-Vlt0Ro64LoM5qfmKzM5Sa2oEnHFuo17FqAZVZy3fb2Ds3ODT57Ta6lWm7m9-BpA4WhA5HLiWKPWV3p1Q5C7ASHjA5R69of1YWv1vgdURhsyQhAYM_Q4M2Aj_rl0HVsnf3TE3mPwkOu7T8McmyEP5HB1Hy5Xw_62xChatxlPAGmltzOjxyVaRdbJLiN5gJDyQeJTuGc-TyMgi26oWcTmpLv94pbXb_49VqL0P9LdcoHH3KooI9ug2dhe72G2m8Yu0kbQUhPMEOjh5RLPRAv3TIElJ1hJb5_0DPufdWZ35JXT1j2uNEAXr417WqFiP5MUhTNFdCLeP6iZcmLtFgrpxARpFRoosTbLL6nsgVAX7BaiA29or7rm2LKNJdmgGTf-Eh3RrAj4FTYd_P5zGXXZwj-BwqlKsoIDgt1JKkc6VnDBCIs_mjDqO7GoUgm_fwx0zNv7IdBrItbN6usV8DdohqD6tLljtIusdZgxFdjF6kz0dV7gsBqvEXJWqRqqmRylvAkFercK3FaW9NHVDgOfeUC9bCcnkI0jTAv7iFEFjq1kT9mi_9vFpiC4Wfy9eZNf4UfbtV99dMpqE1GidysXxS0jk9_l0RumN_wcpHzTrNCmKUs--OiS_Q1i764e9J-PR0FlGtOYZPZ3Eizyw6vqSAjqkZjURpeCmby6izs8ec0PdRWWM1tGGE3mPv3O56ySWexmq8TCF1DH_vx-C_\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:TLLHRjim3FqFa3jmtK_IrjdsQnH1ksG30WHeiQG7K2pMqIfBhaGNoxe1EyHEk9ECikp4JjDyn0eVwST7Kior9-6eAZHecwjCwCGwYIxnw9vLXiF1EzfYWL1geSnmu1-LAOKJ1MXba7ObWdMqjLqaqyBx6oAdDXNX8hDcfNuYV1mEXWDIf16MaGfcmHFcIkGXxj-Vlt0Ro64LoM5qfmKzM5Sa2oEnHFuo17FqAZVZy3fb2Ds3ODT57Ta6lWm7m9-BpA4WhA5HLiWKPWV3p1Q5C7ASHjA5R69of1YWv1vgdURhsyQhAYM_Q4M2Aj_rl0HVsnf3TE3mPwkOu7T8McmyEP5HB1Hy5Xw_62xChatxlPAGmltzOjxyVaRdbJLiN5gJDyQeJTuGc-TyMgi26oWcTmpLv94pbXb_49VqL0P9LdcoHH3KooI9ug2dhe72G2m8Yu0kbQUhPMEOjh5RLPRAv3TIElJ1hJb5_0DPufdWZ35JXT1j2uNEAXr417WqFiP5MUhTNFdCLeP6iZcmLtFgrpxARpFRoosTbLL6nsgVAX7BaiA29or7rm2LKNJdmgGTf-Eh3RrAj4FTYd_P5zGXXZwj-BwqlKsoIDgt1JKkc6VnDBCIs_mjDqO7GoUgm_fwx0zNv7IdBrItbN6usV8DdohqD6tLljtIusdZgxFdjF6kz0dV7gsBqvEXJWqRqqmRylvAkFercK3FaW9NHVDgOfeUC9bCcnkI0jTAv7iFEFjq1kT9mi_9vFpiC4Wfy9eZNf4UfbtV99dMpqE1GidysXxS0jk9_l0RumN_wcpHzTrNCmKUs--OiS_Q1i764e9J-PR0FlGtOYZPZ3Eizyw6vqSAjqkZjURpeCmby6izs8ec0PdRWWM1tGGE3mPv3O56ySWexmq8TCF1DH_vx-C_\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:TLLBRjim4DqRy1scwSRvo6stGc0ajRimO215dHo05YVsj1Ifa2EZJbgWX-WriYXw1D-a9-bG7__YU2FglHdDcm_7Lu6Lvp8tODoSCcKIvpNw9A1VKeRTpXjUO8vG64MssmdVo1RAgnmCMUHLWU0yBzmkanaLmZMpfrd9ECwSdT8ZmljkfzlXzJENni68r5ni5MYix360MVyL0Gx-_VeDqoewkKWNg4cx0BqH1Lp_SK1MOu5M4rh6Q65KbCVgtlbSdSOm98o_LuymledPr9z3UEfsG7xdcKV5M56zBDSf3BV0qEMvileqXUfrh1kVENBjG7f3jKQZsvl6gYoqV6ZAYikmQta1eS8Qe3OGzwKZ2V0pQgxA1ceMsAkC5NoKgdooJBngTRyb3IdStOr7pViIVI1d1PmuEs_0EZbzpGAFv7HBEJPKhUwGsebUYGFypbBUS4H1afM1NHupsbEIrDd1NdeD5GTbp9X7TaA1BoSDC6Xz5rGKPEVNMdiCqQmvrVmxTgnCL8mPvSgqFLGcAqrC8jAzqqDU5OLPoSXahhJSqyr1h9hJiUAtoZRf5jxfCkF3R1zALPSbXR5CsXnzGvIM-BEFetOe9vGpVY5q9tIR_DEce1unzcagzwZjRPBLGVUnc8sFyB0-3Pt6Lh-JnfW8x7ZjH7qvzzixShpJvxJRodgw1Vc23oK67hJPljxImscJkxE9wUhBiX_mzT4wFpuPT6pO9CoW2Rw_4ov_zFkmXwGWLJ7qgBgTFRpV7pGN98Mv92ithpM1amydS9OaykptpqwsWvI2h3-MJOKmsBLDaa7rt1O8xNBzh41jxMAy8msIJmgedPZAlcNo4DkzTTbKDGKPtnNABed6CNChzH8t4zUknsnHhT-zSiGIJjRFELMRrLJglMANHa8KY01PnHX1Um4I9K1G1cs_SXJApRuYorC-h5rELdQuBMsc823Saub-_Ovi5n0j4krAZlBdyny0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml logical-order-service\r\n!theme plain\r\nskinparam linetype ortho\r\nskinparam classAttributeIconSize 0\r\n\r\nt\u00edtulo Diagrama de clases l\u00f3gico \u2014 Servicio de pedidos (Dise\u00f1o independiente de la plataforma)\r\n\r\ninterfaz IOrderService {\r\n    +createOrder(cmd: CreateOrderCommand): OrderId\r\n    +getOrder(id: OrderId): OrderDTO\r\n    +updateStatus(id: OrderId, status: OrderStatus): void\r\n}\r\n\r\nclass abstracta BaseEntity {\r\n    #id : UUID\r\n    #version : Long\r\n    #createdAt : DateTime\r\n    #updatedAt : DateTime\r\n}\r\n\r\nclass Order extends BaseEntity {\r\n    -customerId : UUID\r\n    -status : OrderStatus\r\n    -lineItems : List&lt;LineItem&gt;\r\n    -shippingAddress : Address\r\n    \/total : Decimal\r\n    +calculateTotal(): Decimal\r\n    +applyDiscount(discount: Discount): void\r\n}\r\n\r\nclass LineItem {\r\n    -productId : UUID\r\n    -quantity : Integer\r\n    -unitPrice : Decimal\r\n    +subtotal(): Decimal\r\n}\r\n\r\nclass Address {\r\n    -street : String\r\n    -city : String\r\n    -country : CountryCode\r\n    -postalCode : String\r\n}\r\n\r\nclass CreateOrderCommand {\r\n    +customerId : UUID\r\n    +items : List&lt;OrderItemRequest&gt;\r\n    +shippingAddress : Address\r\n}\r\n\r\nclass OrderDTO {\r\n    +orderId : UUID\r\n    +status : OrderStatus\r\n    +total : Decimal\r\n    +items : List&lt;LineItemDTO&gt;\r\n}\r\n\r\nIOrderService &lt;|.. OrderService : realiza\r\nOrderService ..&gt; Order : gestiona\r\nOrder \"1\" *-- \"1..*\" LineItem : contiene &gt;\r\nOrder \"1\" --&gt; \"1\" Address : env\u00eda a &gt;\r\nOrder ..&gt; CreateOrderCommand : creado a partir de\r\nOrder ..&gt; OrderDTO : proyectado a\r\n\r\nnota a la derecha de IOrderService\r\n  L\u00edmite del contrato:\r\n  Comandos entran, DTOs salen.\r\n  Los objetos de dominio nunca se filtran.\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:TLLBRjim4DqRy1scwSRvo6stGc0ajRimO215dHo05YVsj1Ifa2EZJbgWX-WriYXw1D-a9-bG7__YU2FglHdDcm_7Lu6Lvp8tODoSCcKIvpNw9A1VKeRTpXjUO8vG64MssmdVo1RAgnmCMUHLWU0yBzmkanaLmZMpfrd9ECwSdT8ZmljkfzlXzJENni68r5ni5MYix360MVyL0Gx-_VeDqoewkKWNg4cx0BqH1Lp_SK1MOu5M4rh6Q65KbCVgtlbSdSOm98o_LuymledPr9z3UEfsG7xdcKV5M56zBDSf3BV0qEMvileqXUfrh1kVENBjG7f3jKQZsvl6gYoqV6ZAYikmQta1eS8Qe3OGzwKZ2V0pQgxA1ceMsAkC5NoKgdooJBngTRyb3IdStOr7pViIVI1d1PmuEs_0EZbzpGAFv7HBEJPKhUwGsebUYGFypbBUS4H1afM1NHupsbEIrDd1NdeD5GTbp9X7TaA1BoSDC6Xz5rGKPEVNMdiCqQmvrVmxTgnCL8mPvSgqFLGcAqrC8jAzqqDU5OLPoSXahhJSqyr1h9hJiUAtoZRf5jxfCkF3R1zALPSbXR5CsXnzGvIM-BEFetOe9vGpVY5q9tIR_DEce1unzcagzwZjRPBLGVUnc8sFyB0-3Pt6Lh-JnfW8x7ZjH7qvzzixShpJvxJRodgw1Vc23oK67hJPljxImscJkxE9wUhBiX_mzT4wFpuPT6pO9CoW2Rw_4ov_zFkmXwGWLJ7qgBgTFRpV7pGN98Mv92ithpM1amydS9OaykptpqwsWvI2h3-MJOKmsBLDaa7rt1O8xNBzh41jxMAy8msIJmgedPZAlcNo4DkzTTbKDGKPtnNABed6CNChzH8t4zUknsnHhT-zSiGIJjRFELMRrLJglMANHa8KY01PnHX1Um4I9K1G1cs_SXJApRuYorC-h5rELdQuBMsc823Saub-_Ovi5n0j4krAZlBdyny0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:TLLHRjim3FqFa3jmtK_IrjdsQnH1ksG30WHeiQG7K2pMqIfBhaGNoxe1EyHEk9ECikp4JjDyn0eVwST7Kior9-6eAZHecwjCwCGwYIxnw9vLXiF1EzfYWL1geSnmu1-LAOKJ1MXba7ObWdMqjLqaqyBx6oAdDXNX8hDcfNuYV1mEXWDIf16MaGfcmHFcIkGXxj-Vlt0Ro64LoM5qfmKzM5Sa2oEnHFuo17FqAZVZy3fb2Ds3ODT57Ta6lWm7m9-BpA4WhA5HLiWKPWV3p1Q5C7ASHjA5R69of1YWv1vgdURhsyQhAYM_Q4M2Aj_rl0HVsnf3TE3mPwkOu7T8McmyEP5HB1Hy5Xw_62xChatxlPAGmltzOjxyVaRdbJLiN5gJDyQeJTuGc-TyMgi26oWcTmpLv94pbXb_49VqL0P9LdcoHH3KooI9ug2dhe72G2m8Yu0kbQUhPMEOjh5RLPRAv3TIElJ1hJb5_0DPufdWZ35JXT1j2uNEAXr417WqFiP5MUhTNFdCLeP6iZcmLtFgrpxARpFRoosTbLL6nsgVAX7BaiA29or7rm2LKNJdmgGTf-Eh3RrAj4FTYd_P5zGXXZwj-BwqlKsoIDgt1JKkc6VnDBCIs_mjDqO7GoUgm_fwx0zNv7IdBrItbN6usV8DdohqD6tLljtIusdZgxFdjF6kz0dV7gsBqvEXJWqRqqmRylvAkFercK3FaW9NHVDgOfeUC9bCcnkI0jTAv7iFEFjq1kT9mi_9vFpiC4Wfy9eZNf4UfbtV99dMpqE1GidysXxS0jk9_l0RumN_wcpHzTrNCmKUs--OiS_Q1i764e9J-PR0FlGtOYZPZ3Eizyw6vqSAjqkZjURpeCmby6izs8ec0PdRWWM1tGGE3mPv3O56ySWexmq8TCF1DH_vx-C_\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:TLLHRjim3FqFa3jmtK_IrjdsQnH1ksG30WHeiQG7K2pMqIfBhaGNoxe1EyHEk9ECikp4JjDyn0eVwST7Kior9-6eAZHecwjCwCGwYIxnw9vLXiF1EzfYWL1geSnmu1-LAOKJ1MXba7ObWdMqjLqaqyBx6oAdDXNX8hDcfNuYV1mEXWDIf16MaGfcmHFcIkGXxj-Vlt0Ro64LoM5qfmKzM5Sa2oEnHFuo17FqAZVZy3fb2Ds3ODT57Ta6lWm7m9-BpA4WhA5HLiWKPWV3p1Q5C7ASHjA5R69of1YWv1vgdURhsyQhAYM_Q4M2Aj_rl0HVsnf3TE3mPwkOu7T8McmyEP5HB1Hy5Xw_62xChatxlPAGmltzOjxyVaRdbJLiN5gJDyQeJTuGc-TyMgi26oWcTmpLv94pbXb_49VqL0P9LdcoHH3KooI9ug2dhe72G2m8Yu0kbQUhPMEOjh5RLPRAv3TIElJ1hJb5_0DPufdWZ35JXT1j2uNEAXr417WqFiP5MUhTNFdCLeP6iZcmLtFgrpxARpFRoosTbLL6nsgVAX7BaiA29or7rm2LKNJdmgGTf-Eh3RrAj4FTYd_P5zGXXZwj-BwqlKsoIDgt1JKkc6VnDBCIs_mjDqO7GoUgm_fwx0zNv7IdBrItbN6usV8DdohqD6tLljtIusdZgxFdjF6kz0dV7gsBqvEXJWqRqqmRylvAkFercK3FaW9NHVDgOfeUC9bCcnkI0jTAv7iFEFjq1kT9mi_9vFpiC4Wfy9eZNf4UfbtV99dMpqE1GidysXxS0jk9_l0RumN_wcpHzTrNCmKUs--OiS_Q1i764e9J-PR0FlGtOYZPZ3Eizyw6vqSAjqkZjURpeCmby6izs8ec0PdRWWM1tGGE3mPv3O56ySWexmq8TCF1DH_vx-C_\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<p><strong>Observaciones clave:<\/strong><\/p>\n<ul>\n<li>\n<p>La interfaz define el contrato del servicio; la implementaci\u00f3n est\u00e1 oculta.<\/p>\n<\/li>\n<li>\n<p>El patr\u00f3n Comando\/DTO separa la entrada\/salida del modelo de dominio.<\/p>\n<\/li>\n<li>\n<p>La entidad base proporciona identidad y versionado transversales.<\/p>\n<\/li>\n<li>\n<p>Atributo derivado <code data-backticks=\"1\">\/total<\/code>indica un valor calculado.<\/p>\n<\/li>\n<li>\n<p>Las flechas de navegabilidad muestran la direcci\u00f3n de la dependencia.<\/p>\n<\/li>\n<li>\n<p>Sin anotaciones ORM, sin tipos de base de datos, sin dependencias de framework.<\/p>\n<\/li>\n<\/ul>\n<h3>2.3 Diagrama de clases f\u00edsico: La realidad de la implementaci\u00f3n<\/h3>\n<ul>\n<li>\n<p><strong>Enfoque:<\/strong>Realizaci\u00f3n espec\u00edfica de la tecnolog\u00eda. Incluye frameworks, ORM, serializaci\u00f3n, preocupaciones de infraestructura.<\/p>\n<\/li>\n<li>\n<p><strong>Incluye:<\/strong>Anotaciones (<code data-backticks=\"1\">@Entity<\/code>,\u00a0<code data-backticks=\"1\">@JsonProperty<\/code>,\u00a0<code data-backticks=\"1\">@Autowired<\/code>), tipos de colecciones concretas (<code data-backticks=\"1\">ArrayList<\/code>,\u00a0<code data-backticks=\"1\">HashSet<\/code>), tipos mapeados a base de datos (<code data-backticks=\"1\">VARCHAR(255)<\/code>,\u00a0<code data-backticks=\"1\">BIGINT<\/code>), clases base del framework.<\/p>\n<\/li>\n<li>\n<p><strong>Atributos:<\/strong> Tipos espec\u00edficos del framework, marcadores de carga diferida, configuraciones de cach\u00e9.<\/p>\n<\/li>\n<li>\n<p><strong>M\u00e9todos:<\/strong> Callbacks del ciclo de vida (<code data-backticks=\"1\">@PostConstruct<\/code>), ganchos de serializaci\u00f3n, puntos de integraci\u00f3n del framework.<\/p>\n<\/li>\n<li>\n<p><strong>Relaciones:<\/strong> Estrategias de b\u00fasqueda (<code data-backticks=\"1\">LAZY<\/code>,\u00a0<code data-backticks=\"1\">EAGER<\/code>), reglas de cascada, mapeos de tablas de uni\u00f3n.<\/p>\n<\/li>\n<li>\n<p><strong>Partes interesadas:<\/strong> Desarrolladores, DBAs, DevOps, QA.<\/p>\n<\/li>\n<li>\n<p><strong>Estabilidad:<\/strong> Baja. Cambia con cada actualizaci\u00f3n o optimizaci\u00f3n tecnol\u00f3gica.<\/p>\n<\/li>\n<\/ul>\n<h4>Ejemplo: Implementaci\u00f3n f\u00edsica de JPA\/Spring<\/h4>\n<p id=\"rvEprlH\"><img loading=\"lazy\" alt=\"Diagrama de clases f\u00edsico de JPA\/Spring Boot que muestra la entidad Pedido con anotaciones y relaciones.\" class=\"alignnone size-full wp-image-1114\" decoding=\"async\" height=\"814\" loading=\"lazy\" sizes=\"auto, (max-width: 1726px) 100vw, 1726px\" src=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecfb078314.png\" srcset=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecfb078314.png 1726w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecfb078314-300x141.png 300w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecfb078314-1024x483.png 1024w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecfb078314-768x362.png 768w, https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecfb078314-1536x724.png 1536w\" width=\"1726\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:bLRTRXf75Bwtn3jCkLfYG-nSee30s8gmQ8qCYTGgKZJi762Q-UlCMRSqhPI7w1FqqV8aFRC_x8AXQhc0tPtl_CntllcMKK3kCTEAkUqko9IhhlK2VFTdnriNt-4MD32dk3IjY_1P6iSzrqn90xXpmAp7hMskf8g7C4RqSfKXJ5Dh5l9tODUjYzO5IbJ0vcKTDebGTYVv9WP--_eNUuoLsRqXu8ub3_FnwuNpqcpOhRNOYIb6nI9TBFbAGMAuXa4xxpYq2P6NB_DyQLqm-eocWetUWG7F4SG7hZ8e5hfIi3vx_tvwLm8_K19fJRdwNDmHP6RDfeHChCgqIKocLAm_M7CLe5D6f5b0gy5FZ_BUcqmNrPF5ycdwmxigWBZ7B10uRtYHtvKnZmQMzdjkTedcpe6utPNRR5-nb8UK2nYCPxChce3RSlC4sZvpDK2VxTk9GveYw5XW0VXsLjuFgxRq2eG0KJMpbSuHsMCXF8GOL5wLyANd9aWmMDo_Heiqn3wxbPixIANcgbYufDcccQBjBYCYwHn2_Zm_njZm9naxhaTPDVt_fnd9MrhYCLa3fjl1RFpJZoKremShJJNAMa6Vf21sJyys1rIJ-YzYSDwABCLZBVnhp2yPBxJVPrE3i3ckv3on64KvkBc-OYG2Il2c2iwCnBcNAR2JXEV3ZYKhPgivVpcieS1iS3juStrTgzG3O1GHniDu4dvJmzDY0mVWioSWjPb17_6JucfY1PnfQC-ifNEZ8h1HfjZb0lmpCH1r5TNAKoIo8WaDNoWnK-qKa_H51cSmi6bpSK_AE4Fxg_JxGvBBu0cShQGGhuD4wtTd8k2Pqi-pbP9Xcojex9mY_ukTtH-iLSV70n6L9qzIBOYP-i74QisDw3GbTRa1BD1I5CyxPMztoyUAc6QRagJbrvnsURG31hyX617OW-FrqxSvwYhFFAo8kLnBGvuqsJjUKflVlecP35X43m-Y2gDB2lSxC3yAclCDx8FovWitRz-qsQjkbtvxlLVjsXVwxDWWFvg6GNuqBmsocRBR7UQ_jUirVF65NdgzuGlI-WSpFnboTkIdWXkfUxq_XeV3e81oI94POn7OoY8Hp-owzgOvpTTwKWhDE692FpxzzlLlLhyJeXqoPNdv0eYBXQEdLZjwTGic3TF4Mg7ik5w-7zbQWX8CJ7IJmAn3gMdICgLqwUVyD5A3UM5I7btIluj_0000\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:bLRTRXf75Bwtn3jCkLfYG-nSee30s8gmQ8qCYTGgKZJi762Q-UlCMRSqhPI7w1FqqV8aFRC_x8AXQhc0tPtl_CntllcMKK3kCTEAkUqko9IhhlK2VFTdnriNt-4MD32dk3IjY_1P6iSzrqn90xXpmAp7hMskf8g7C4RqSfKXJ5Dh5l9tODUjYzO5IbJ0vcKTDebGTYVv9WP--_eNUuoLsRqXu8ub3_FnwuNpqcpOhRNOYIb6nI9TBFbAGMAuXa4xxpYq2P6NB_DyQLqm-eocWetUWG7F4SG7hZ8e5hfIi3vx_tvwLm8_K19fJRdwNDmHP6RDfeHChCgqIKocLAm_M7CLe5D6f5b0gy5FZ_BUcqmNrPF5ycdwmxigWBZ7B10uRtYHtvKnZmQMzdjkTedcpe6utPNRR5-nb8UK2nYCPxChce3RSlC4sZvpDK2VxTk9GveYw5XW0VXsLjuFgxRq2eG0KJMpbSuHsMCXF8GOL5wLyANd9aWmMDo_Heiqn3wxbPixIANcgbYufDcccQBjBYCYwHn2_Zm_njZm9naxhaTPDVt_fnd9MrhYCLa3fjl1RFpJZoKremShJJNAMa6Vf21sJyys1rIJ-YzYSDwABCLZBVnhp2yPBxJVPrE3i3ckv3on64KvkBc-OYG2Il2c2iwCnBcNAR2JXEV3ZYKhPgivVpcieS1iS3juStrTgzG3O1GHniDu4dvJmzDY0mVWioSWjPb17_6JucfY1PnfQC-ifNEZ8h1HfjZb0lmpCH1r5TNAKoIo8WaDNoWnK-qKa_H51cSmi6bpSK_AE4Fxg_JxGvBBu0cShQGGhuD4wtTd8k2Pqi-pbP9Xcojex9mY_ukTtH-iLSV70n6L9qzIBOYP-i74QisDw3GbTRa1BD1I5CyxPMztoyUAc6QRagJbrvnsURG31hyX617OW-FrqxSvwYhFFAo8kLnBGvuqsJjUKflVlecP35X43m-Y2gDB2lSxC3yAclCDx8FovWitRz-qsQjkbtvxlLVjsXVwxDWWFvg6GNuqBmsocRBR7UQ_jUirVF65NdgzuGlI-WSpFnboTkIdWXkfUxq_XeV3e81oI94POn7OoY8Hp-owzgOvpTTwKWhDE692FpxzzlLlLhyJeXqoPNdv0eYBXQEdLZjwTGic3TF4Mg7ik5w-7zbQWX8CJ7IJmAn3gMdICgLqwUVyD5A3UM5I7btIluj_0000\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:bLRRRbf757r7uX-cF1rYG-myMW61iHjXqHWP4gbzYOOpsp3jt3ApZrkQLif7z0lwdg_8d-HBkkTSE0SCLSi3p6NjowozPmsZWDnZfXLpcssGALSzwmNuti-EjrlVuGOqCAUuDErM-4KQnptNJ4a3k7N0hCUDRUwaYeSmHlHobI5CKsiMydTW5-rMkuLVls2cBBkHV4rOpWIm2U4XiE-_Vg7Wbdtx_1UxDIW55smEGWhBahlv-EN2UMdMxDfQx4PNemZ2BGsMVAKWCLp3e9Dd7Zg4oDDWzt7EFhLRZ3wZgM2ZDs30SmJndgiCYesU5EoAlNitlIc1xyc9jARSVIfc19bPiouX4wioRHAJAHNZ3nwv2j0jBT8ieDNWfmT-RqscY-Z9OlamVVkcCg0QO1O8d2Uyo6UbpRs1fVs1cssYkNCWhhVbCJldBEKXvG86uzdid2hXDjmyWBPFN0tGPxjqOh6c23e6M02-dfNpOPMMNe4G8AfaDj8v8diiX8SGZSfH2LzwRe84WyNy9LhaYb3NSdq3gTHS5Hjdr4jffkYuouX8klkGFq-NCIRyGSQCwr9MIV__QaRobfPuJ1u1qyrWDlxfnvAQqPsLfYfbtK4Vf21sZzSs1rIL-Y_DuBmLMOg7lV2lDXypdlD29bE3i3wCv3on69joS7bnpgW9oC6hoZWp4kTUfi2E4fuNEuQicAtg_6a_XWApnitWrSL5tQKU06CJORoCH-6NDJmj3h07Fda3KfiPz14_AKOJA-14GZjcBTqR5O6DCCKf5-2VY87OLx5RUOf4LYIXeGibPggTOfA-IEWC1ZPjRkv86MTeVvL-TqdoDdW0PwjMYECWqVhj2Gju8lVpRALasEGTD7PEaTx6p6xtzghhuu68ofqdgHR4JBqmiLfp8xhDbZfR0nPeAOhrRfdRpVA-8gQPfgJMye-SJdbm0WQ_8HWHs9tZzUhh77MUUnvMn9mzIaEQDDafNbABtow9cGnOM0_th0gXImhrsnC_CfhpDUoCykGBDUzSTjYBNez--_qNdLeNhjYXG9g6FfhdyjXqsEiDyzzQyngg-AnR-ltXCygkzYf-rEHamOyPDrpt-tyCzqj11cM98Y-6v9MH13i9yKNTATDRMWznnHDIwYZPzYfkVFlyDwiVXPJxDHUM99Q4iTekHBrKS7g4mJ1Dt7d9AyHjtDPq0ShNactuIYf9gO1YAsK_Pc2PTKY1gS3j5kN0ADDu9sb8VpZ-0G00\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml physical-order-jpa\r\n!theme plain\r\nskinparam linetype ortho\r\nskinparam classAttributeIconSize 0\r\n\r\nt\u00edtulo Diagrama de Clases F\u00edsico \u2014 Entidad Pedido (JPA\/Spring Boot)\r\n\r\n@Entity\r\n@Table(name=\"orders\")\r\nclass Order {\r\n    @Id @GeneratedValue\r\n    -id : UUID\r\n    @Version\r\n    -version : Long\r\n    @Column(nullable=false)\r\n    -customerId : UUID\r\n    @Enumerated(STRING)\r\n    -status : OrderStatus\r\n    @OneToMany(mappedBy=\"order\", cascade=ALL, orphanRemoval=true)\r\n    -lineItems : Set&lt;LineItem&gt;\r\n    @Embedded\r\n    -shippingAddress : Address\r\n    @Transient\r\n    \/total : BigDecimal\r\n    +calculateTotal(): BigDecimal\r\n}\r\n\r\n@Entity\r\n@Table(name=\"line_items\")\r\nclass LineItem {\r\n    @Id @GeneratedValue\r\n    -id : UUID\r\n    @ManyToOne(fetch=LAZY)\r\n    @JoinColumn(name=\"order_id\", nullable=false)\r\n    -order : Order\r\n    @Column(nullable=false)\r\n    -productId : UUID\r\n    @Column(nullable=false)\r\n    -quantity : Integer\r\n    @Column(precision=10, scale=2)\r\n    -unitPrice : BigDecimal\r\n}\r\n\r\n@Embeddable\r\nclass Address {\r\n    @Column(length=200)\r\n    -street : String\r\n    @Column(length=100)\r\n    -city : String\r\n    @Enumerated(STRING)\r\n    -country : CountryCode\r\n    @Column(length=20)\r\n    -postalCode : String\r\n}\r\n\r\n@Service\r\n@Transactional\r\nclass OrderServiceImpl implements IOrderService {\r\n    @Autowired\r\n    -orderRepo : OrderRepository\r\n    @Autowired\r\n    -eventPublisher : ApplicationEventPublisher\r\n    +createOrder(cmd: CreateOrderCommand): UUID\r\n    +getOrder(id: UUID): OrderDTO\r\n}\r\n\r\n@Repository\r\ninterface OrderRepository extends JpaRepository&lt;Order, UUID&gt; {\r\n    +findByCustomerId(customerId: UUID): List&lt;Order&gt;\r\n    +findByStatus(status: OrderStatus): Page&lt;Order&gt;\r\n}\r\n\r\nOrder \"1\" *-- \"1..*\" LineItem : mappedBy=\"order\"ncascade=ALLnorphanRemoval=true\r\nOrder \"1\" --&gt; \"1\" Address : @Embedded\r\nOrderServiceImpl ..&gt; OrderRepository : @Autowired\r\nOrderServiceImpl ..&gt; ApplicationEventPublisher : @Autowired\r\nOrderRepository ..|&gt; JpaRepository : extends\r\n\r\nnota al pie de Order\r\n  Notas de rendimiento:\r\n  \u2022 lineItems cargados LAZY\r\n  \u2022 total calculado en memoria\r\n  \u2022 El campo Version habilita el bloqueo optimista\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:bLRRRbf757r7uX-cF1rYG-myMW61iHjXqHWP4gbzYOOpsp3jt3ApZrkQLif7z0lwdg_8d-HBkkTSE0SCLSi3p6NjowozPmsZWDnZfXLpcssGALSzwmNuti-EjrlVuGOqCAUuDErM-4KQnptNJ4a3k7N0hCUDRUwaYeSmHlHobI5CKsiMydTW5-rMkuLVls2cBBkHV4rOpWIm2U4XiE-_Vg7Wbdtx_1UxDIW55smEGWhBahlv-EN2UMdMxDfQx4PNemZ2BGsMVAKWCLp3e9Dd7Zg4oDDWzt7EFhLRZ3wZgM2ZDs30SmJndgiCYesU5EoAlNitlIc1xyc9jARSVIfc19bPiouX4wioRHAJAHNZ3nwv2j0jBT8ieDNWfmT-RqscY-Z9OlamVVkcCg0QO1O8d2Uyo6UbpRs1fVs1cssYkNCWhhVbCJldBEKXvG86uzdid2hXDjmyWBPFN0tGPxjqOh6c23e6M02-dfNpOPMMNe4G8AfaDj8v8diiX8SGZSfH2LzwRe84WyNy9LhaYb3NSdq3gTHS5Hjdr4jffkYuouX8klkGFq-NCIRyGSQCwr9MIV__QaRobfPuJ1u1qyrWDlxfnvAQqPsLfYfbtK4Vf21sZzSs1rIL-Y_DuBmLMOg7lV2lDXypdlD29bE3i3wCv3on69joS7bnpgW9oC6hoZWp4kTUfi2E4fuNEuQicAtg_6a_XWApnitWrSL5tQKU06CJORoCH-6NDJmj3h07Fda3KfiPz14_AKOJA-14GZjcBTqR5O6DCCKf5-2VY87OLx5RUOf4LYIXeGibPggTOfA-IEWC1ZPjRkv86MTeVvL-TqdoDdW0PwjMYECWqVhj2Gju8lVpRALasEGTD7PEaTx6p6xtzghhuu68ofqdgHR4JBqmiLfp8xhDbZfR0nPeAOhrRfdRpVA-8gQPfgJMye-SJdbm0WQ_8HWHs9tZzUhh77MUUnvMn9mzIaEQDDafNbABtow9cGnOM0_th0gXImhrsnC_CfhpDUoCykGBDUzSTjYBNez--_qNdLeNhjYXG9g6FfhdyjXqsEiDyzzQyngg-AnR-ltXCygkzYf-rEHamOyPDrpt-tyCzqj11cM98Y-6v9MH13i9yKNTATDRMWznnHDIwYZPzYfkVFlyDwiVXPJxDHUM99Q4iTekHBrKS7g4mJ1Dt7d9AyHjtDPq0ShNactuIYf9gO1YAsK_Pc2PTKY1gS3j5kN0ADDu9sb8VpZ-0G00\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:bLRTRXf75Bwtn3jCkLfYG-nSee30s8gmQ8qCYTGgKZJi762Q-UlCMRSqhPI7w1FqqV8aFRC_x8AXQhc0tPtl_CntllcMKK3kCTEAkUqko9IhhlK2VFTdnriNt-4MD32dk3IjY_1P6iSzrqn90xXpmAp7hMskf8g7C4RqSfKXJ5Dh5l9tODUjYzO5IbJ0vcKTDebGTYVv9WP--_eNUuoLsRqXu8ub3_FnwuNpqcpOhRNOYIb6nI9TBFbAGMAuXa4xxpYq2P6NB_DyQLqm-eocWetUWG7F4SG7hZ8e5hfIi3vx_tvwLm8_K19fJRdwNDmHP6RDfeHChCgqIKocLAm_M7CLe5D6f5b0gy5FZ_BUcqmNrPF5ycdwmxigWBZ7B10uRtYHtvKnZmQMzdjkTedcpe6utPNRR5-nb8UK2nYCPxChce3RSlC4sZvpDK2VxTk9GveYw5XW0VXsLjuFgxRq2eG0KJMpbSuHsMCXF8GOL5wLyANd9aWmMDo_Heiqn3wxbPixIANcgbYufDcccQBjBYCYwHn2_Zm_njZm9naxhaTPDVt_fnd9MrhYCLa3fjl1RFpJZoKremShJJNAMa6Vf21sJyys1rIJ-YzYSDwABCLZBVnhp2yPBxJVPrE3i3ckv3on64KvkBc-OYG2Il2c2iwCnBcNAR2JXEV3ZYKhPgivVpcieS1iS3juStrTgzG3O1GHniDu4dvJmzDY0mVWioSWjPb17_6JucfY1PnfQC-ifNEZ8h1HfjZb0lmpCH1r5TNAKoIo8WaDNoWnK-qKa_H51cSmi6bpSK_AE4Fxg_JxGvBBu0cShQGGhuD4wtTd8k2Pqi-pbP9Xcojex9mY_ukTtH-iLSV70n6L9qzIBOYP-i74QisDw3GbTRa1BD1I5CyxPMztoyUAc6QRagJbrvnsURG31hyX617OW-FrqxSvwYhFFAo8kLnBGvuqsJjUKflVlecP35X43m-Y2gDB2lSxC3yAclCDx8FovWitRz-qsQjkbtvxlLVjsXVwxDWWFvg6GNuqBmsocRBR7UQ_jUirVF65NdgzuGlI-WSpFnboTkIdWXkfUxq_XeV3e81oI94POn7OoY8Hp-owzgOvpTTwKWhDE692FpxzzlLlLhyJeXqoPNdv0eYBXQEdLZjwTGic3TF4Mg7ik5w-7zbQWX8CJ7IJmAn3gMdICgLqwUVyD5A3UM5I7btIluj_0000\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/editor\/#plantuml:bLRTRXf75Bwtn3jCkLfYG-nSee30s8gmQ8qCYTGgKZJi762Q-UlCMRSqhPI7w1FqqV8aFRC_x8AXQhc0tPtl_CntllcMKK3kCTEAkUqko9IhhlK2VFTdnriNt-4MD32dk3IjY_1P6iSzrqn90xXpmAp7hMskf8g7C4RqSfKXJ5Dh5l9tODUjYzO5IbJ0vcKTDebGTYVv9WP--_eNUuoLsRqXu8ub3_FnwuNpqcpOhRNOYIb6nI9TBFbAGMAuXa4xxpYq2P6NB_DyQLqm-eocWetUWG7F4SG7hZ8e5hfIi3vx_tvwLm8_K19fJRdwNDmHP6RDfeHChCgqIKocLAm_M7CLe5D6f5b0gy5FZ_BUcqmNrPF5ycdwmxigWBZ7B10uRtYHtvKnZmQMzdjkTedcpe6utPNRR5-nb8UK2nYCPxChce3RSlC4sZvpDK2VxTk9GveYw5XW0VXsLjuFgxRq2eG0KJMpbSuHsMCXF8GOL5wLyANd9aWmMDo_Heiqn3wxbPixIANcgbYufDcccQBjBYCYwHn2_Zm_njZm9naxhaTPDVt_fnd9MrhYCLa3fjl1RFpJZoKremShJJNAMa6Vf21sJyys1rIJ-YzYSDwABCLZBVnhp2yPBxJVPrE3i3ckv3on64KvkBc-OYG2Il2c2iwCnBcNAR2JXEV3ZYKhPgivVpcieS1iS3juStrTgzG3O1GHniDu4dvJmzDY0mVWioSWjPb17_6JucfY1PnfQC-ifNEZ8h1HfjZb0lmpCH1r5TNAKoIo8WaDNoWnK-qKa_H51cSmi6bpSK_AE4Fxg_JxGvBBu0cShQGGhuD4wtTd8k2Pqi-pbP9Xcojex9mY_ukTtH-iLSV70n6L9qzIBOYP-i74QisDw3GbTRa1BD1I5CyxPMztoyUAc6QRagJbrvnsURG31hyX617OW-FrqxSvwYhFFAo8kLnBGvuqsJjUKflVlecP35X43m-Y2gDB2lSxC3yAclCDx8FovWitRz-qsQjkbtvxlLVjsXVwxDWWFvg6GNuqBmsocRBR7UQ_jUirVF65NdgzuGlI-WSpFnboTkIdWXkfUxq_XeV3e81oI94POn7OoY8Hp-owzgOvpTTwKWhDE692FpxzzlLlLhyJeXqoPNdv0eYBXQEdLZjwTGic3TF4Mg7ik5w-7zbQWX8CJ7IJmAn3gMdICgLqwUVyD5A3UM5I7btIluj_0000\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Editar PlantUML en VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<p><strong>Observaciones clave:<\/strong><\/p>\n<ul>\n<li>\n<p>Las anotaciones de JPA definen expl\u00edcitamente el mapeo de persistencia.<\/p>\n<\/li>\n<li>\n<p>Las estrategias de b\u00fasqueda y las reglas de cascada est\u00e1n documentadas en las relaciones.<\/p>\n<\/li>\n<li>\n<p>Estereotipos de Spring (<code data-backticks=\"1\">@Service<\/code>,\u00a0<code data-backticks=\"1\">@Repository<\/code>) marcan roles de infraestructura.<\/p>\n<\/li>\n<li>\n<p>Tipos concretos (<code data-backticks=\"1\">BigDecimal<\/code>,\u00a0<code data-backticks=\"1\">Set<\/code>,\u00a0<code data-backticks=\"1\">Page<\/code>) reemplazan las abstracciones.<\/p>\n<\/li>\n<li>\n<p>El repositorio extiende una interfaz del marco: el acoplamiento tecnol\u00f3gico es expl\u00edcito.<\/p>\n<\/li>\n<li>\n<p>Decisiones cr\u00edticas para el rendimiento (carga diferida, campos transitorios) est\u00e1n anotadas.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>3. Sem\u00e1ntica de las relaciones: La precisi\u00f3n importa<\/h2>\n<p>El mal uso de los tipos de relaci\u00f3n es el error estructural m\u00e1s com\u00fan. Cada uno conlleva sem\u00e1nticas espec\u00edficas de ciclo de vida, propiedad y cardinalidad.<\/p>\n<h3>3.1 Matriz de decisi\u00f3n<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Pregunta<\/th>\n<th align=\"left\">Asociaci\u00f3n<\/th>\n<th align=\"left\">Agregaci\u00f3n<\/th>\n<th align=\"left\">Composici\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u00bfPuede la parte existir sin el todo?<\/td>\n<td align=\"left\">N\/A<\/td>\n<td align=\"left\">S\u00ed<\/td>\n<td align=\"left\">No<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u00bfEs el ownership exclusivo?<\/td>\n<td align=\"left\">No<\/td>\n<td align=\"left\">No<\/td>\n<td align=\"left\">S\u00ed<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u00bfEl ciclo de vida es gestionado por el todo?<\/td>\n<td align=\"left\">No<\/td>\n<td align=\"left\">No<\/td>\n<td align=\"left\">S\u00ed<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">Multiplicidad t\u00edpica en el extremo de la parte<\/td>\n<td align=\"left\">Cualquiera<\/td>\n<td align=\"left\">0..*<\/td>\n<td align=\"left\">1..* (usualmente)<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">Ejemplo<\/td>\n<td align=\"left\">El usuario toma prestado un libro<\/td>\n<td align=\"left\">El departamento tiene un profesor<\/td>\n<td align=\"left\">El pedido contiene un art\u00edculo de l\u00ednea<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u00bfCascada de eliminaci\u00f3n?<\/td>\n<td align=\"left\">Nunca<\/td>\n<td align=\"left\">Opcional<\/td>\n<td align=\"left\">Obligatorio<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u00bfSe permiten referencias compartidas?<\/td>\n<td align=\"left\">S\u00ed<\/td>\n<td align=\"left\">S\u00ed<\/td>\n<td align=\"left\">No<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>3.2 Usos incorrectos comunes y correcciones<\/h3>\n<p>\u274c\u00a0<strong>Usar composici\u00f3n para referencias compartidas:<\/strong>\u00a0<code data-backticks=\"1\">Biblioteca *-- Libro<\/code> es incorrecto si los libros pueden ser prestados\/movidos. Use agregaci\u00f3n o asociaci\u00f3n.<br \/>\n\u2705\u00a0<strong>Correcci\u00f3n:<\/strong>\u00a0<code data-backticks=\"1\">Biblioteca o-- Libro<\/code> (agregaci\u00f3n) o <code data-backticks=\"1\">Biblioteca -- Libro<\/code> (asociaci\u00f3n con rol <code data-backticks=\"1\">posee<\/code>).<\/p>\n<p>\u274c\u00a0<strong>Usar agregaci\u00f3n cuando el ciclo de vida est\u00e1 vinculado:<\/strong>\u00a0<code data-backticks=\"1\">Pedido o-- L\u00ednea de pedido<\/code> es incorrecto si las l\u00edneas de pedido carecen de sentido sin los pedidos.<br \/>\n\u2705\u00a0<strong>Correcci\u00f3n:<\/strong>\u00a0<code data-backticks=\"1\">Pedido *-- L\u00ednea de pedido<\/code> (composici\u00f3n).<\/p>\n<p>\u274c\u00a0<strong>Omitir multiplicidad:<\/strong> Cada extremo de la relaci\u00f3n debe especificar la cardinalidad. Las suposiciones predeterminadas var\u00edan seg\u00fan la herramienta y causan ambig\u00fcedad.<br \/>\n\u2705\u00a0<strong>Correcci\u00f3n:<\/strong> Siempre anotar: <code data-backticks=\"1\">1<\/code>,\u00a0<code data-backticks=\"1\">0..1<\/code>,\u00a0<code data-backticks=\"1\">0..*<\/code>,\u00a0<code data-backticks=\"1\">1..*<\/code>,\u00a0<code data-backticks=\"1\">n..m<\/code>.<\/p>\n<p>\u274c\u00a0<strong>Navegaci\u00f3n bidireccional sin justificaci\u00f3n:<\/strong> Las asociaciones bidireccionales crean un acoplamiento estrecho y ciclos de serializaci\u00f3n.<br \/>\n\u2705\u00a0<strong>Correcci\u00f3n:<\/strong> Por defecto, usar unidireccional. A\u00f1adir navegaci\u00f3n inversa solo cuando las consultas de negocio lo exijan. Documentar la justificaci\u00f3n.<\/p>\n<p>\u274c\u00a0<strong>Herencia para reutilizaci\u00f3n de c\u00f3digo:<\/strong> Usar la herencia \u00fanicamente para compartir atributos\/m\u00e9todos viola el Principio de Sustituci\u00f3n de Liskov (LSP) y crea clases base fr\u00e1giles.<br \/>\n\u2705\u00a0<strong>Correcci\u00f3n:<\/strong> Preferir la composici\u00f3n sobre la herencia. Extraer el comportamiento compartido en estrategias\/visitantes\/servicios inyectados mediante interfaces.<\/p>\n<hr\/>\n<h2>4. Mapeo de niveles de abstracci\u00f3n al ciclo de vida del desarrollo<\/h2>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Fase<\/th>\n<th align=\"left\">Diagrama principal<\/th>\n<th align=\"left\">Diagrama secundario<\/th>\n<th align=\"left\">Actividades clave<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><strong>Descubrimiento<\/strong><\/td>\n<td align=\"left\">Conceptual<\/td>\n<td align=\"left\">\u2014<\/td>\n<td align=\"left\">Entrevistas de dominio, extracci\u00f3n de lenguaje ubicuo, validaci\u00f3n de reglas de negocio<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>An\u00e1lisis<\/strong><\/td>\n<td align=\"left\">Conceptual \u2192 L\u00f3gico<\/td>\n<td align=\"left\">\u2014<\/td>\n<td align=\"left\">Identificar contextos delimitados, definir l\u00edmites de servicio, extraer interfaces<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Dise\u00f1o<\/strong><\/td>\n<td align=\"left\">L\u00f3gico<\/td>\n<td align=\"left\">Conceptual (referencia)<\/td>\n<td align=\"left\">Aplicar patrones de dise\u00f1o, definir contratos, validar contra SOLID<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Implementaci\u00f3n<\/strong><\/td>\n<td align=\"left\">F\u00edsico<\/td>\n<td align=\"left\">L\u00f3gico (trazabilidad)<\/td>\n<td align=\"left\">Generar c\u00f3digo\/esquemas, configurar frameworks, escribir pruebas<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>Mantenimiento<\/strong><\/td>\n<td align=\"left\">F\u00edsico \u2194 L\u00f3gico \u2194 Conceptual<\/td>\n<td align=\"left\">Todo<\/td>\n<td align=\"left\">Refactorizar con trazabilidad, actualizar el modelo de negocio cuando el dominio cambie<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Regla cr\u00edtica:<\/strong> Nunca salte el nivel Conceptual. Los equipos que saltan directamente a L\u00f3gico\/F\u00edsico producen sistemas que son t\u00e9cnicamente correctos pero incorrectos desde el punto de vista del negocio. El diagrama Conceptual es su p\u00f3liza de seguro contra construir la cosa incorrecta de manera eficiente.<\/p>\n<hr\/>\n<h2>5. Invariantes de calidad: Las reglas no negociables<\/h2>\n<h3>5.1 Integridad estructural<\/h3>\n<ol>\n<li>\n<p><strong>Responsabilidad \u00fanica:<\/strong> Cada clase se mapea a exactamente una raz\u00f3n para cambiar. Si necesita \u00aby\u00bb para describir su prop\u00f3sito, div\u00eddala.<\/p>\n<\/li>\n<li>\n<p><strong>Cumplimiento de Liskov:<\/strong> Las subclases deben ser sustituibles por las clases padre sin romper el c\u00f3digo del cliente. Pruebe con colecciones polim\u00f3rficas.<\/p>\n<\/li>\n<li>\n<p><strong>Segregaci\u00f3n de interfaces:<\/strong> Ning\u00fan cliente obligado a depender de m\u00e9todos no utilizados. Divida las interfaces pesadas en otras cohesivas y espec\u00edficas por rol.<\/p>\n<\/li>\n<li>\n<p><strong>Inversi\u00f3n de dependencias:<\/strong> Los m\u00f3dulos de alto nivel dependen de abstracciones, no de concretizaciones. Los diagramas f\u00edsicos deben mostrar esto mediante interfaces, no clases concretas.<\/p>\n<\/li>\n<li>\n<p><strong>Multiplicidad expl\u00edcita:<\/strong> Cada extremo de asociaci\u00f3n anotado. Sin valores predeterminados impl\u00edcitos.<\/p>\n<\/li>\n<li>\n<p><strong>Navegabilidad justificada:<\/strong> Unidireccional por defecto. Bidireccional solo con un requisito de consulta de negocio documentado.<\/p>\n<\/li>\n<\/ol>\n<h3>5.2 Disciplina de abstracci\u00f3n<\/h3>\n<ol start=\"7\">\n<li>\n<p><strong>Pureza del nivel:<\/strong> Sin tecnolog\u00eda en Conceptual. Sin jerga de negocio en F\u00edsico sin enlace al glosario. L\u00f3gico se mantiene neutral en cuanto a la plataforma.<\/p>\n<\/li>\n<li>\n<p><strong>Trazabilidad mantenida:<\/strong> Cada elemento F\u00edsico se traza hasta un ancestro L\u00f3gico. Cada elemento L\u00f3gico se traza hasta un ancestro Conceptual. Las brechas indican requisitos faltantes o sobreespecificaci\u00f3n.<\/p>\n<\/li>\n<li>\n<p><strong>Mantenimiento paralelo:<\/strong> Las actualizaciones se propagan entre niveles. Los identificadores de versi\u00f3n est\u00e1n sincronizados. Los registros de cambios hacen referencia a todos los diagramas afectados.<\/p>\n<\/li>\n<li>\n<p><strong>Alineaci\u00f3n de las partes interesadas:<\/strong> Conceptual validado por el negocio. L\u00f3gico revisado por arquitectos. F\u00edsico aprobado por el equipo de desarrollo. Revisiones transversales entre niveles en los puntos de integraci\u00f3n.<\/p>\n<\/li>\n<\/ol>\n<h3>5.3 Restricciones pragm\u00e1ticas<\/h3>\n<ol start=\"11\">\n<li>\n<p><strong>L\u00edmite de tama\u00f1o del diagrama:<\/strong> M\u00e1ximo 15-20 clases por diagrama. Descomponer en subdominios\/paquetes. Usar diagramas de paquetes para la navegaci\u00f3n.<\/p>\n<\/li>\n<li>\n<p><strong>Selectividad de atributos\/operaciones:<\/strong> Mostrar solo lo relevante para el prop\u00f3sito del diagrama. Ocultar getters\/setters a menos que sean comportamentales. Omite miembros heredados a menos que est\u00e9n sobrescritos.<\/p>\n<\/li>\n<li>\n<p><strong>Notas sobre el desorden:<\/strong> Usar notas para invariantes, restricciones y justificaci\u00f3n. No codifique reglas de negocio en nombres de atributos o firmas de m\u00e9todos.<\/p>\n<\/li>\n<li>\n<p><strong>Especificaciones ejecutables:<\/strong> PlantUML\/YAML\/Mermaid preferidos sobre herramientas de interfaz gr\u00e1fica. Controlados por versi\u00f3n. Diferenciables. Integrados en CI.<\/p>\n<\/li>\n<li>\n<p><strong>Documentaci\u00f3n viva:<\/strong> Diagramas actualizados con el c\u00f3digo. Los diagramas obsoletos son peores que no tenerlos. Automatizar la generaci\u00f3n a partir del c\u00f3digo cuando sea posible (ingenier\u00eda inversa), pero curar manualmente para claridad conceptual\/l\u00f3gica.<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h2>6. Antipatrones: Reconocer y corregir fallos comunes<\/h2>\n<h3>6.1 Modelo de dominio an\u00e9mico<\/h3>\n<p><strong>S\u00edntoma:<\/strong> Las clases son meros contenedores de datos con solo getters\/setters. La l\u00f3gica de negocio est\u00e1 dispersa en servicios\/utilidades.<br \/>\n<strong>Causa:<\/strong> Pensamiento procedural disfrazado de POO; miedo a modelos de dominio ricos; malentendido de la separaci\u00f3n de responsabilidades.<br \/>\n<strong>Impacto:<\/strong> P\u00e9rdida de encapsulamiento; l\u00f3gica duplicada; pruebas dif\u00edciles; reglas de negocio invisibles en el modelo.<br \/>\n<strong>Correcci\u00f3n:<\/strong> Mover el comportamiento a las clases de dominio. Los servicios orquestan, no implementan. Validar con expertos del dominio: \u201c\u00bfUna persona de negocios reconocer\u00eda este comportamiento como perteneciente a esta entidad?\u201d<\/p>\n<h3>6.2 Fisicalizaci\u00f3n prematura<\/h3>\n<p><strong>S\u00edntoma:<\/strong> Los diagramas conceptuales incluyen <code data-backticks=\"1\">@Entity<\/code>,\u00a0<code data-backticks=\"1\">VARCHAR<\/code>,\u00a0<code data-backticks=\"1\">ForeignKey<\/code>. Las partes interesadas se confunden con el ruido t\u00e9cnico.<br \/>\n<strong>Causa:<\/strong>  Los analistas recurren por defecto a la tecnolog\u00eda conocida; presi\u00f3n para \u00abser pr\u00e1cticos\u00bb; falta de disciplina en la abstracci\u00f3n.<br \/>\n<strong>Impacto:<\/strong>  Requisitos acoplados a la pila tecnol\u00f3gica; reevaluaci\u00f3n imposible; desinter\u00e9s del negocio.<br \/>\n<strong>Correcci\u00f3n:<\/strong>  Prohibir el uso de vocabulario t\u00e9cnico durante las sesiones conceptuales. Revisar con las partes interesadas no t\u00e9cnicas antes de proceder. Mantener archivos separados por nivel de abstracci\u00f3n.<\/p>\n<h3>6.3 Abuso de herencia<\/h3>\n<p><strong>S\u00edntoma:<\/strong>  Jerarqu\u00edas profundas (&gt;3 niveles); subclases que sobrescriben el comportamiento de la clase padre de forma inconsistente; clases base con l\u00f3gica condicional basada en el subtipo.<br \/>\n<strong>Causa:<\/strong>  Motivaci\u00f3n de reutilizaci\u00f3n de c\u00f3digo; pensamiento taxon\u00f3mico; malentendido del polimorfismo.<br \/>\n<strong>Impacto:<\/strong>  Problema de la clase base fr\u00e1gil; violaci\u00f3n del Principio de Sustituci\u00f3n de Liskov (LSP); complejidad de pruebas exponencial.<br \/>\n<strong>Correcci\u00f3n:<\/strong>  Aplanar las jerarqu\u00edas. Extraer el comportamiento variable en estrategias\/pol\u00edticas. Preferir la composici\u00f3n. Aplicar el principio \u00abDecir, no preguntar\u00bb.<\/p>\n<h3>6.4 Clase Dios \/ Bolo<\/h3>\n<p><strong>S\u00edntoma:<\/strong>  Una sola clase con m\u00e1s de 20 atributos, m\u00e1s de 30 m\u00e9todos y dependencias de m\u00e1s de 10 otras clases.<br \/>\n<strong>Causa:<\/strong>  Adici\u00f3n incremental de funcionalidades sin refactorizaci\u00f3n; falta de m\u00e9tricas de cohesi\u00f3n; patr\u00f3n antipatr\u00f3n de \u00abgestor\u00bb centralizado.<br \/>\n<strong>Impacto:<\/strong>  Inmantenible; no testeable; bloquea el desarrollo paralelo; sobrecarga cognitiva.<br \/>\n<strong>Correcci\u00f3n:<\/strong>  Aplicar refactorizaciones de extracci\u00f3n de clase\/m\u00e9todo. Identificar grupos cohesivos de atributos\/m\u00e9todos. Delegar a colaboradores especializados. Medir la complejidad ciclom\u00e1tica y el LCOM4.<\/p>\n<h3>6.5 Decaimiento sincronizado<\/h3>\n<p><strong>S\u00edntoma:<\/strong>El c\u00f3digo evoluciona, pero los diagramas se estancan. Los nuevos empleados aprenden de modelos obsoletos. Las auditor\u00edas fallan.<br \/>\n<strong>Causa:<\/strong>Los diagramas se tratan como entregables, no como artefactos vivos. Sin integraci\u00f3n en CI. Carga de actualizaciones manuales.<br \/>\n<strong>Impacto:<\/strong>P\u00e9rdida de conocimiento; deriva arquitect\u00f3nica; riesgo de cumplimiento.<br \/>\n<strong>Correcci\u00f3n:<\/strong>Integra la validaci\u00f3n de diagramas en CI. Genera autom\u00e1ticamente vistas f\u00edsicas a partir del c\u00f3digo. Requiere actualizaciones de diagramas en las listas de verificaci\u00f3n de PR. Trata los diagramos como artefactos de fuente de primera clase.<\/p>\n<hr\/>\n<h2>7. Lista de verificaci\u00f3n antes de publicar un diagrama de clases<\/h2>\n<p>Usa este filtro antes de considerar que cualquier diagrama de clases est\u00e1 terminado:<\/p>\n<h3>Verificaciones universales<\/h3>\n<ul>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Nivel de abstracci\u00f3n expl\u00edcitamente indicado en el t\u00edtulo\/cabecera<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Todas las clases nombradas con sustantivos en singular<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Todas las relaciones tienen multiplicidad en ambos extremos<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Nombres de rol presentes en todas las asociaciones<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Modificadores de visibilidad especificados para todos los atributos\/operaciones<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>El diagrama se ajusta al l\u00edmite cognitivo (&lt;20 clases) o est\u00e1 descompuesto<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Notas utilizadas para invariantes\/constraints, no para desorden<\/p>\n<\/li>\n<\/ul>\n<h3>Verificaciones espec\u00edficas por nivel<\/h3>\n<p><strong>Conceptual:<\/strong><\/p>\n<ul>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Cero referencias tecnol\u00f3gicas<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Comportamientos de negocio modelados, no CRUD<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Validado con firma de experto del dominio<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Lenguaje ubicuo consistente con el glosario<\/p>\n<\/li>\n<\/ul>\n<p><strong>L\u00f3gico:<\/strong><\/p>\n<ul>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Solo tipos neutrales de plataforma<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Interfaces definidas para todos los l\u00edmites de servicio<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Patrones de dise\u00f1o aplicados intencionalmente (documentados)<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Rastreable al modelo conceptual<\/p>\n<\/li>\n<\/ul>\n<p><strong>F\u00edsico:<\/strong><\/p>\n<ul>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Anotaciones tecnol\u00f3gicas completas y precisas<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Estrategias de b\u00fasqueda\/cascada especificadas<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Rastreable al modelo l\u00f3gico<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Implicaciones de rendimiento documentadas<\/p>\n<\/li>\n<\/ul>\n<h3>Verificaciones transversales entre niveles<\/h3>\n<ul>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Cambios propagados en todos los niveles afectados<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Identificadores de versi\u00f3n sincronizados<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Enlaces del glosario mantenidos entre t\u00e9rminos empresariales y t\u00e9cnicos<\/p>\n<\/li>\n<li class=\"task-list-item\" data-task=\"\">\n<p>Audiencia adecuada para las partes interesadas confirmada para cada nivel<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>8. Conclusi\u00f3n: El valor estrat\u00e9gico del modelado disciplinado<\/h2>\n<p>Un <a href=\"https:\/\/online.visual-paradigm.com\/diagrams\/solutions\/free-class-diagram-tool\/\">Diagrama de Clases<\/a> es m\u00e1s que documentaci\u00f3n: es una especificaci\u00f3n ejecutable de la intenci\u00f3n arquitect\u00f3nica. Al mantener rigurosamente los tres niveles de abstracci\u00f3n, hacer cumplir la sem\u00e1ntica de las relaciones y aplicar los invariantes SOLID, transformas el Diagrama de Clases de una imagen est\u00e1tica en un artefacto de ingenier\u00eda din\u00e1mico que previene costosas reworks, asegura la alineaci\u00f3n empresarial y habilita una evoluci\u00f3n sostenible.<\/p>\n<p>La distinci\u00f3n entre Conceptual, L\u00f3gico y F\u00edsico no es acad\u00e9mica: es la principal defensa contra los dos fallos m\u00e1s costosos en los proyectos de software: construir la cosa incorrecta correctamente, y construir la cosa correcta incorrectamente. El modelo conceptual asegura que comprendes el problema. El modelo l\u00f3gico asegura que has dise\u00f1ado una soluci\u00f3n s\u00f3lida. El modelo f\u00edsico asegura que puedes construirlo y operarlo de manera fiable.<\/p>\n<p><a href=\"https:\/\/www.vpascode.com\/tw\/why-vpascode-is-the-best-software-for-editing-plantuml-and-how-others-compare\/\">PlantUML<\/a> eleva esta pr\u00e1ctica del arte a la ingenier\u00eda. Basado en texto, controlado por versiones, diferenciable e integrable en CI, <a href=\"https:\/\/www.visual-paradigm.com\/features\/vpascode\/\">diagramas PlantUML<\/a> son c\u00f3digo fuente, no decoraciones. Participan en el mismo ciclo de vida que el c\u00f3digo de tu aplicaci\u00f3n, sujetos a las mismas disciplinas de revisi\u00f3n, pruebas y mantenimiento.<\/p>\n<p>Al aplicar estos conceptos, recuerda: la medida definitiva del \u00e9xito de un <a href=\"https:\/\/w3.cs.jmu.edu\/bernstdh\/web\/common\/labs\/skills_visualparadigm_class-diagrams\/index.php\">Diagrama de Clases<\/a>no es su elegancia est\u00e9tica o cumplimiento de UML, sino su utilidad anal\u00edtica. \u00bfRevela complejidades ocultas? \u00bfExpone invariantes violados? \u00bfAlinea a diversas partes interesadas en torno a una comprensi\u00f3n compartida? \u00bfSobrevive al contacto con la realidad?<\/p>\n<p class=\"\">Usa las listas de verificaci\u00f3n como puertas de control. Trata los <a href=\"https:\/\/www.vpascode.com\/tw\/why-vpascode-is-the-best-software-for-editing-plantuml-and-how-others-compare\/\">plantillas PlantUML<\/a>como est\u00e1ndares vivos. Mant\u00e9n la trazabilidad sin piedad. Y nunca olvides: el objetivo no son diagramas perfectos, sino mejor software. Cuando se ejecuta con disciplina, el modelado de Diagramas de Clases sigue siendo una de las herramientas m\u00e1s poderosas para domar la complejidad y entregar sistemas que no solo est\u00e1n bien construidos, sino verdaderamente aptos para su prop\u00f3sito<\/p>\n<h3>Referencias<\/h3>\n<ol>\n<li>\n<p><a href=\"https:\/\/blog.visual-paradigm.com\/from-concept-to-code-a-comprehensive-uml-class-diagram-guide-case-study\/\"><strong>Del Concepto al C\u00f3digo: Una Gu\u00eda Completa de Diagramas de Clases UML y Estudio de Caso<\/strong><\/a>: Una gu\u00eda extensa que cubre la sintaxis de diagramas de clases UML, las relaciones y un estudio de caso real de una plataforma de entrega de alimentos.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/guides.visual-paradigm.com\/tw\/docs\/mastering-uml-2-5-a-use-case-driven-approach-to-agile-modeling\/module-3-the-skeleton-the-7-structural-uml-diagrams\/practical-3-structural-implementation\/\"><strong>Pr\u00e1ctica 3: Implementaci\u00f3n Estructural<\/strong><\/a>: Una sesi\u00f3n pr\u00e1ctica sobre la construcci\u00f3n de un diagrama de clases de modelo de dominio, incluyendo el uso de generaci\u00f3n con IA y refinamiento manual en Visual Paradigm.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/skills.visual-paradigm.com\/docs\/uml-basics-diagrams-for-beginners\/mastering-class-diagrams-beginner\/class-diagram-example-simple-uml-project\/\"><strong>Ejemplos Pr\u00e1cticos: Construcci\u00f3n de un Diagrama de Clases Simple<\/strong><\/a>: Un tutorial amigable para principiantes que gu\u00eda paso a paso la construcci\u00f3n de un diagrama de clases simple para un sistema de gesti\u00f3n de bibliotecas, definiendo clases, atributos y relaciones.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tutorials.visual-paradigm.com\/how-to-generate-complex-class-diagrams-visual-paradigm-ai\/\"><strong>C\u00f3mo generar diagramas de clases complejos utilizando el generador UML con IA de Visual Paradigm<\/strong><\/a>: Un tutorial centrado en el uso de la herramienta de IA para generar diagramas de clases complejos para aplicaciones empresariales, con instrucciones paso a paso y mejores pr\u00e1cticas.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/guides.visual-paradigm.com\/pt\/docs\/streamlining-the-software-lifecycle-integrating-ai-use-case-modeling-with-visual-paradigms-all-in-one-platform\/5-behavioral-and-structural-design\/5-3-static-structure-class-diagrams\/\"><strong>5.3 Estructura est\u00e1tica (Diagramas de clases)<\/strong><\/a>: Una gu\u00eda sobre c\u00f3mo derivar autom\u00e1ticamente diagramas de clases a partir de especificaciones de casos de uso y diagramas de secuencia utilizando IA, con ejemplos pr\u00e1cticos como una aplicaci\u00f3n de reservas de restaurantes.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/guides.visual-paradigm.com\/ja\/docs\/mastering-uml-visual-modeling-in-the-visual-paradigm-ai-ecosystem\/module-4-mastery-of-structural-modeling-the-static-view\/ai-class-diagram-generation\/\"><strong>Generaci\u00f3n de diagramas de clases con IA<\/strong><\/a>: Un art\u00edculo en profundidad sobre el uso del chatbot de IA para generar diagramas de clases compatibles con UML 2.5 a partir de descripciones en lenguaje natural y refinarlos de forma iterativa.<\/p>\n<\/li>\n<li>\n<p class=\"\"><a href=\"https:\/\/blog.visual-paradigm.com\/fr\/beginners-guide-to-class-diagrams\/\"><strong>Gu\u00eda para principiantes sobre diagramas de clases<\/strong><\/a>: Una gu\u00eda fundamental (disponible en varios idiomas) que introduce los componentes de los diagramas de clases y muestra c\u00f3mo crearlos utilizando Visual Paradigm Online.<\/p>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n En la ingenier\u00eda de software orientada a objetos, el diagrama de clases es el artefacto m\u00e1s ubicuo pero frecuentemente mal aplicado. A menudo se reduce a un simple esquema&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_title":"","_yoast_wpseo_metadesc":"","inline_featured_image":false,"source_url":"","source_h1_title":"","fifu_image_url":"","fifu_image_alt":"","_fifu_image_alt":"","fifu_alt":"","_fifu_alt":"","fifu_image_title":"","_fifu_image_title":"","fifu_input_alt":"","vp_image_hash":"","footnotes":""},"categories":[1],"tags":[],"asset-category":[],"class_list":["post-542","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"source_url":"","source_h1_title":"","fifu_image_url":"","fifu_image_alt":"","vp_image_hash":"","yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n - AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n - AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News\" \/>\n<meta property=\"og:description\" content=\"Introducci\u00f3n En la ingenier\u00eda de software orientada a objetos, el diagrama de clases es el artefacto m\u00e1s ubicuo pero frecuentemente mal aplicado. A menudo se reduce a un simple esquema&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/\" \/>\n<meta property=\"og:site_name\" content=\"AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-14T08:16:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-03T15:28:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png\" \/>\n<meta name=\"author\" content=\"curtis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/\"},\"author\":{\"name\":\"curtis\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/person\/7799982e6b83f10fb8a41071b61608d1\"},\"headline\":\"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n\",\"datePublished\":\"2026-08-14T08:16:11+00:00\",\"dateModified\":\"2026-09-03T15:28:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/\"},\"wordCount\":3613,\"publisher\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/\",\"url\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/\",\"name\":\"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n - AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News\",\"isPartOf\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png\",\"datePublished\":\"2026-08-14T08:16:11+00:00\",\"dateModified\":\"2026-09-03T15:28:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#primaryimage\",\"url\":\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png\",\"contentUrl\":\"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.ai-diagrams.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#website\",\"url\":\"https:\/\/www.ai-diagrams.com\/es\/\",\"name\":\"AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.ai-diagrams.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#organization\",\"name\":\"AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News\",\"url\":\"https:\/\/www.ai-diagrams.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.ai-diagrams.com\/es\/wp-content\/uploads\/sites\/17\/2026\/03\/ai-diagram-logo.png\",\"contentUrl\":\"https:\/\/www.ai-diagrams.com\/es\/wp-content\/uploads\/sites\/17\/2026\/03\/ai-diagram-logo.png\",\"width\":648,\"height\":648,\"caption\":\"AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News\"},\"image\":{\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/person\/7799982e6b83f10fb8a41071b61608d1\",\"name\":\"curtis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6910084565fcc601ec03c6693bb8ea480c1e52ccaa0efb299eb038bb6a1edc87?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6910084565fcc601ec03c6693bb8ea480c1e52ccaa0efb299eb038bb6a1edc87?s=96&d=mm&r=g\",\"caption\":\"curtis\"},\"url\":\"https:\/\/www.ai-diagrams.com\/es\/author\/curtis\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n - AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/","og_locale":"es_ES","og_type":"article","og_title":"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n - AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News","og_description":"Introducci\u00f3n En la ingenier\u00eda de software orientada a objetos, el diagrama de clases es el artefacto m\u00e1s ubicuo pero frecuentemente mal aplicado. A menudo se reduce a un simple esquema&hellip;","og_url":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/","og_site_name":"AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News","article_published_time":"2026-08-14T08:16:11+00:00","article_modified_time":"2026-09-03T15:28:09+00:00","og_image":[{"url":"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png","type":"","width":"","height":""}],"author":"curtis","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":false,"Tiempo de lectura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#article","isPartOf":{"@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/"},"author":{"name":"curtis","@id":"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/person\/7799982e6b83f10fb8a41071b61608d1"},"headline":"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n","datePublished":"2026-08-14T08:16:11+00:00","dateModified":"2026-09-03T15:28:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/"},"wordCount":3613,"publisher":{"@id":"https:\/\/www.ai-diagrams.com\/es\/#organization"},"image":{"@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png","articleSection":["Uncategorized"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/","url":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/","name":"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n - AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News","isPartOf":{"@id":"https:\/\/www.ai-diagrams.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#primaryimage"},"image":{"@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png","datePublished":"2026-08-14T08:16:11+00:00","dateModified":"2026-09-03T15:28:09+00:00","breadcrumb":{"@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ai-diagrams.com\/es\/1106-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#primaryimage","url":"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png","contentUrl":"https:\/\/www.ai-diagrams.com\/wp-content\/uploads\/2026\/08\/img_6a7ecd54b7185.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.ai-diagrams.com\/es\/1106-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ai-diagrams.com\/es\/"},{"@type":"ListItem","position":2,"name":"Dominar el modelado de diagramas de clases: Abstracci\u00f3n, relaciones y las reglas de cohesi\u00f3n"}]},{"@type":"WebSite","@id":"https:\/\/www.ai-diagrams.com\/es\/#website","url":"https:\/\/www.ai-diagrams.com\/es\/","name":"AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News","description":"","publisher":{"@id":"https:\/\/www.ai-diagrams.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ai-diagrams.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.ai-diagrams.com\/es\/#organization","name":"AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News","url":"https:\/\/www.ai-diagrams.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/www.ai-diagrams.com\/es\/wp-content\/uploads\/sites\/17\/2026\/03\/ai-diagram-logo.png","contentUrl":"https:\/\/www.ai-diagrams.com\/es\/wp-content\/uploads\/sites\/17\/2026\/03\/ai-diagram-logo.png","width":648,"height":648,"caption":"AI Diagrams Espa\u00f1ol\u2013 Explore Artificial Intelligence Trends &amp; News"},"image":{"@id":"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/person\/7799982e6b83f10fb8a41071b61608d1","name":"curtis","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.ai-diagrams.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6910084565fcc601ec03c6693bb8ea480c1e52ccaa0efb299eb038bb6a1edc87?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6910084565fcc601ec03c6693bb8ea480c1e52ccaa0efb299eb038bb6a1edc87?s=96&d=mm&r=g","caption":"curtis"},"url":"https:\/\/www.ai-diagrams.com\/es\/author\/curtis\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/posts\/542","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/comments?post=542"}],"version-history":[{"count":0,"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/posts\/542\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/media?parent=542"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/categories?post=542"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/tags?post=542"},{"taxonomy":"asset-category","embeddable":true,"href":"https:\/\/www.ai-diagrams.com\/es\/wp-json\/wp\/v2\/asset-category?post=542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}