{"id":27,"date":"2023-09-01T13:31:01","date_gmt":"2023-09-01T13:31:01","guid":{"rendered":"https:\/\/mauriciobeltran.cl\/?p=27"},"modified":"2023-09-02T18:04:58","modified_gmt":"2023-09-02T22:04:58","slug":"solid-principio-de-inversion-de-dependencias","status":"publish","type":"post","link":"https:\/\/mauriciobeltran.cl\/index.php\/2023\/09\/01\/solid-principio-de-inversion-de-dependencias\/","title":{"rendered":"SOLID \u2014 Principio de inversi\u00f3n de dependencias"},"content":{"rendered":"\n<p id=\"d48f\">Partir\u00e9 se\u00f1alando que el 90% de lo que expondr\u00e9 tiene que ver con el siguiente razonamiento:<\/p>\n\n\n\n<p id=\"90c6\"><strong>\u201cPrograma contra abstracciones\u201d<\/strong><\/p>\n\n\n\n<p id=\"67b9\">Es una frase simple que veremos, se repite una y otra vez.<\/p>\n\n\n\n<p id=\"bd0b\">Si est\u00e1s aqu\u00ed es que tienes una idea sobre lo que es SOLID, y si no, puedes revisar conceptualmente&nbsp;<a href=\"https:\/\/es.wikipedia.org\/wiki\/SOLID\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>aqu\u00ed<\/strong><\/a>.<\/p>\n\n\n\n<p id=\"bc62\">Partir\u00e9 con el principio que considero en lo personal, es el m\u00e1s interesante de todos:<\/p>\n\n\n\n<p id=\"08c5\">\u201cD: Dependency inversion principle\u201d (Principio de inversi\u00f3n de dependencias).<\/p>\n\n\n\n<p id=\"0c68\">La idea tras este principio es no depender directamente de una dependencia concreta, si no modelarla y permitir al implementador decidir qu\u00e9 se va a implementar, despu\u00e9s.<\/p>\n\n\n\n<p id=\"b380\">Supongamos el siguiente escenario:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tenemos una clase de negocio (MyBusiness) que procesa una acci\u00f3n y esperamos que genere un log en alguna parte.<\/li>\n\n\n\n<li>Esa alguna parte \u201c<strong>puede\u201d<\/strong>&nbsp;ser una bd, en cinta, un archivo plano u otra cosa. La verdad, no nos interesa decidir ahora concretamente&nbsp;<strong>c\u00f3mo&nbsp;<\/strong>se va a registrar, solo nos interesa saber que se va a guardar.<\/li>\n<\/ul>\n\n\n\n<p id=\"455a\">Ahora, \u00bfc\u00f3mo puedo dise\u00f1ar la soluci\u00f3n para que el objeto de negocio le de igual que usar?.<\/p>\n\n\n\n<p id=\"7459\">Esto se logra utilizando interfaces.<\/p>\n\n\n\n<p id=\"cb30\">Una interfaz no es m\u00e1s que un&nbsp;<strong>contrato<\/strong>&nbsp;que debe cumplir quien lo implemente, por lo que lo l\u00f3gico es que nuestra clase dependa de un contrato y no de algo concreto. (generamos una abstracci\u00f3n del proceso diciendo <strong>qu\u00e9<\/strong> y <strong>no c\u00f3mo<\/strong> se va a implementar, es decir,&nbsp;<strong>programamos contra abstracciones<\/strong>)<\/p>\n\n\n\n<p id=\"75e3\">Volvamos a nuestra estructura de MyBusiness que debe registrar un evento.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"391\" height=\"504\" src=\"https:\/\/mauriciobeltran.cl\/wp-content\/uploads\/2023\/09\/image.png\" alt=\"\" class=\"wp-image-43\" srcset=\"https:\/\/mauriciobeltran.cl\/wp-content\/uploads\/2023\/09\/image.png 391w, https:\/\/mauriciobeltran.cl\/wp-content\/uploads\/2023\/09\/image-233x300.png 233w\" sizes=\"auto, (max-width: 391px) 100vw, 391px\" \/><figcaption class=\"wp-element-caption\">Diagrama del registro de log de mybusiness<\/figcaption><\/figure>\n\n\n\n<p id=\"fcdb\">MyBusiness, posee una dependencia llamada log, la cual es inyectada modelando su implementaci\u00f3n no import\u00e1ndole c\u00f3mo \u00e9sta sea implementada.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php\nnamespace SOLID\\DIP;\nuse SOLID\\DIP\\ILog;\n\nclass MyBusiness {\n\n    private ILog $logging;\n\n    public function __construct(ILog $logging)\n    {\n        $this-&gt;logging = $logging;\n    }\n\n    public function setID($id)\n    {\n        $this-&gt;id = $id;\n        $this-&gt;logging-&gt;info(&quot;Initialized &quot;.$this-&gt;id);\n    }\n\n    public function process()\n    {\n        $this-&gt;logging-&gt;info(&quot;This is an example&quot;);\n    }\n}\n<\/pre><\/div>\n\n\n<p id=\"226b\">Ahora veamos la definici\u00f3n de interfaz (posee un contrato b\u00e1sico que se\u00f1ala la criticidad del evento a informar)<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code aligncenter\"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php\nnamespace SOLID\\DIP;\n\ninterface ILog {\n    \n    public function debug($event);\n    \n    public function info($event);\n    \n    public function alert($event);\n    \n    public function critical($event);\n}\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php\nnamespace SOLID\\DIP;\n\nclass File implements ILog {\n\n    public function debug($event) {\n        error_log($event.&quot;\\n&quot;);\n    }\n\n    public function info($event) {\n        error_log($event.&quot;\\n&quot;);\n    }\n\n    public function alert($event) {\n        error_log($event.&quot;\\n&quot;);\n    }\n\n    public function critical($event) {\n        error_log($event.&quot;\\n&quot;, 3, &quot;contact@mail.generic.test&quot;);\n    }\n}\n<\/pre><\/div>\n\n\n<p id=\"ced5\">Por \u00faltimo, nuestro main va a construir la aplicaci\u00f3n y pasar el \u201clogger\u201d via inyecci\u00f3n de dependencias.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php\n\ninclude __DIR__.&quot;MyBusiness.php&quot;;\ninclude __DIR__.&quot;Repository.php&quot;;\ninclude __DIR__.&quot;File.php&quot;;\n\n$repo = new SOLID\\DIP\\File();\n$ent = new SOLID\\DIP\\MyBusiness($repo);\n$ent-&gt;setId(1);\n$ent-&gt;process();\n<\/pre><\/div>\n\n\n<p id=\"5e34\">Nuestra clase MyBusiness no tiene idea c\u00f3mo se va a implementar lo que le estoy pasando, pero si sabe que contractualmente debe logear cierto nivel de criticidad.<\/p>\n\n\n\n<p id=\"c8a6\">Es decir&nbsp;<strong>\u201cprogramamos contra una abstracci\u00f3n\u201d.<\/strong><\/p>\n\n\n\n<p id=\"7c2f\">Si quisi\u00e9ramos implementar un nuevo tipo de log, esta clase debe implementar los m\u00e9todos declarados en la interface y ser inyectada a la clase MyBusiness.<\/p>\n\n\n\n<p id=\"3e13\">Si manejo muchas fuentes que implementan un comportamiento, \u00bfc\u00f3mo hago mi aplicaci\u00f3n configurable?. En este caso se deber\u00eda crear una&nbsp;<strong>Factor\u00eda<\/strong>&nbsp;que cree objetos con dependencia similar. Pero, en otro momento hablar\u00e9 de eso.<\/p>\n\n\n\n<p id=\"b0d0\">Espero que mi post les pueda ayudar a entender un poco mejor estos \u201cprincipios\u201d que triviales de entender no son.<\/p>\n\n\n\n<p id=\"0e45\">Por \u00faltimo, nuestro main va a construir la aplicaci\u00f3n y pasar el \u201clogger\u201d via inyecci\u00f3n de dependencias.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Partir\u00e9 se\u00f1alando que el 90% de lo que expondr\u00e9 tiene<\/p>\n","protected":false},"author":1,"featured_media":55,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3,5],"tags":[],"class_list":["post-27","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-architecture","category-development","category-solid"],"_links":{"self":[{"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/posts\/27","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/comments?post=27"}],"version-history":[{"count":16,"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/posts\/27\/revisions"}],"predecessor-version":[{"id":44,"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/posts\/27\/revisions\/44"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/media\/55"}],"wp:attachment":[{"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/media?parent=27"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/categories?post=27"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mauriciobeltran.cl\/index.php\/wp-json\/wp\/v2\/tags?post=27"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}