{"id":1609,"date":"2026-03-25T14:20:24","date_gmt":"2026-03-25T14:20:24","guid":{"rendered":"https:\/\/orpot.com\/blog\/?p=1609"},"modified":"2026-03-25T14:20:24","modified_gmt":"2026-03-25T14:20:24","slug":"por-que-empiezas-a-valorar-la-programacion-orientada-a-objetos-cuando-todo-se-rompe","status":"publish","type":"post","link":"https:\/\/orpot.com\/blog\/por-que-empiezas-a-valorar-la-programacion-orientada-a-objetos-cuando-todo-se-rompe\/","title":{"rendered":"Por qu\u00e9 empiezas a valorar la Programaci\u00f3n Orientada a Objetos\u2026 cuando todo se rompe"},"content":{"rendered":"<p>Muchos desarrolladores no entienden realmente la importancia de la programaci\u00f3n orientada a objetos\u2026 hasta que las cosas empiezan a fallar.<\/p>\n<p>Al inicio de un proyecto, todo es sencillo. Escribes algunas funciones, conectas l\u00f3gica aqu\u00ed y all\u00e1, y todo funciona. Te sientes r\u00e1pido, productivo, incluso brillante.<\/p>\n<p>Pero ese momento no dura.<\/p>\n<p>A medida que el proyecto crece, ese mismo c\u00f3digo que parec\u00eda eficiente empieza a volverse un problema.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\/\/ todo mezclado\r\nfunction processOrder(order) {\r\n  \/\/ calcular total\r\n  let total = 0;\r\n  order.items.forEach(item =&gt; {\r\n    total += item.price * item.qty;\r\n  });\r\n\r\n  \/\/ aplicar descuento\r\n  if (order.user.isPremium) {\r\n    total *= 0.9;\r\n  }\r\n\r\n  \/\/ guardar en base de datos\r\n  saveOrderToDB(order, total);\r\n\r\n  \/\/ enviar email\r\n  sendEmail(order.user.email, total);\r\n\r\n  return total;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Al inicio esto funciona perfecto.<\/p>\n<p>Pero luego quieres:<\/p>\n<ul>\n<li>agregar impuestos<\/li>\n<li>Cambiar reglas de descuento<\/li>\n<li>Reutilizar l\u00f3gica en otro flujo<\/li>\n<li>Probar el c\u00e1lculo sin enviar emails<\/li>\n<\/ul>\n<p>Y todo empieza a romperse.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">class OrderCalculator {\r\n  calculate(items) {\r\n    return items.reduce((total, item) =&gt; {\r\n      return total + item.price * item.qty;\r\n    }, 0);\r\n  }\r\n}\r\n\r\nclass DiscountService {\r\n  apply(user, total) {\r\n    if (user.isPremium) {\r\n      return total * 0.9;\r\n    }\r\n    return total;\r\n  }\r\n}\r\n\r\nclass OrderService {\r\n  constructor() {\r\n    this.calculator = new OrderCalculator();\r\n    this.discount = new DiscountService();\r\n  }\r\n\r\n  process(order) {\r\n    let total = this.calculator.calculate(order.items);\r\n    total = this.discount.apply(order.user, total);\r\n\r\n    saveOrderToDB(order, total);\r\n    sendEmail(order.user.email, total);\r\n\r\n    return total;\r\n  }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Ahora:<\/p>\n<ul>\n<li>Cada clase tiene una responsabilidad clara<\/li>\n<li>Puedes cambiar descuentos sin tocar el c\u00e1lculo<\/li>\n<li>Puedes testear cada parte por separado<\/li>\n<li>Encapsulaci\u00f3n: proteger tu l\u00f3gica<\/li>\n<\/ul>\n<p>Antes:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">user.balance = user.balance - 100; \/\/ cualquiera puede romper esto<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">class User {\r\n  constructor(balance) {\r\n    this.balance = balance;\r\n  }\r\n\r\n  deduct(amount) {\r\n    if (amount &gt; this.balance) {\r\n      throw new Error(\"Fondos insuficientes\");\r\n    }\r\n\r\n    this.balance -= amount;\r\n  }\r\n}<\/pre>\n<p>Ahora nadie puede modificar el balance sin pasar por reglas.<\/p>\n<h3>Evitar duplicaci\u00f3n (composici\u00f3n)<\/h3>\n<p>Antes:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">function sendWelcomeEmail(user) {\r\n  \/\/ l\u00f3gica email\r\n}\r\n\r\nfunction sendOrderEmail(user) {\r\n  \/\/ misma l\u00f3gica repetida\r\n}<\/pre>\n<p>Despu\u00e9s :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">class EmailService {\r\n  send(to, message) {\r\n    \/\/ l\u00f3gica centralizada\r\n  }\r\n}\r\n\r\nclass UserService {\r\n  constructor() {\r\n    this.email = new EmailService();\r\n  }\r\n\r\n  welcome(user) {\r\n    this.email.send(user.email, \"Bienvenido\");\r\n  }\r\n}<\/pre>\n<h3>Polimorfismo: flexibilidad real<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">class PaymentMethod {\r\n  pay(amount) {}\r\n}\r\n\r\nclass CardPayment extends PaymentMethod {\r\n  pay(amount) {\r\n    console.log(\"Pagando con tarjeta:\", amount);\r\n  }\r\n}\r\n\r\nclass PaypalPayment extends PaymentMethod {\r\n  pay(amount) {\r\n    console.log(\"Pagando con PayPal:\", amount);\r\n  }\r\n}<\/pre>\n<p>Uso :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">function processPayment(method) {\r\n  method.pay(100);\r\n}\r\n\r\nprocessPayment(new CardPayment());\r\nprocessPayment(new PaypalPayment());<\/pre>\n<h3>La diferencia real<\/h3>\n<p>Depurar esto:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">processOrder(order);<\/pre>\n<p>vs depurar esto :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">orderService.process(order);<\/pre>\n<p>donde puedes entrar paso a paso en:<\/p>\n<p>c\u00e1lculo<br \/>\ndescuento<br \/>\npersistencia<\/p>\n<p>No es lo mismo.<\/p>\n<p>La programaci\u00f3n orientada a objetos no se trata de hacer c\u00f3digo elegante.<\/p>\n<p>Se trata de:<\/p>\n<ul>\n<li>No perder el control cuando el proyecto crece<\/li>\n<li>Saber exactamente d\u00f3nde est\u00e1 cada cosa<\/li>\n<li>Reducir errores invisibles<\/li>\n<li>Poder escalar sin romper todo<\/li>\n<\/ul>\n<p>Y sobre todo\u2026<\/p>\n<p>de no odiar tu propio c\u00f3digo dentro de 3 meses.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Muchos desarrolladores no entienden realmente la importancia de la programaci\u00f3n orientada a objetos\u2026 hasta que&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1610,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[47],"tags":[212],"_links":{"self":[{"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/posts\/1609"}],"collection":[{"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/comments?post=1609"}],"version-history":[{"count":1,"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/posts\/1609\/revisions"}],"predecessor-version":[{"id":1611,"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/posts\/1609\/revisions\/1611"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/media\/1610"}],"wp:attachment":[{"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/media?parent=1609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/categories?post=1609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/orpot.com\/blog\/wp-json\/wp\/v2\/tags?post=1609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}