{"id":229344,"date":"2022-11-10T18:05:00","date_gmt":"2022-11-10T15:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229344"},"modified":"2022-11-09T06:35:56","modified_gmt":"2022-11-09T03:35:56","slug":"que-es-demasiado-para-pasar-datos-a-traves-de-la-inyeccion-de-dependencia","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/que-es-demasiado-para-pasar-datos-a-traves-de-la-inyeccion-de-dependencia\/","title":{"rendered":"\u00bfQu\u00e9 es demasiado para pasar datos a trav\u00e9s de la inyecci\u00f3n de dependencia?"},"content":{"rendered":"\n<p>El tema de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la inyecci\u00f3n de dependencias<\/a> ha existido durante alg\u00fan tiempo en los c\u00edrculos de programaci\u00f3n orientada a objetos. A veces lo vemos en WordPress; a veces no lo hacemos.<\/p>\n<p>Soy fan\u00e1tico de eso, pero, sinceramente, no siempre estoy seguro de cu\u00e1nta informaci\u00f3n inyectar en una clase. Quiero decir, digamos que nos dan dos clases, y una tiene informaci\u00f3n que la otra necesita.<\/p>\n<ul>\n<li>\u00bfNo inyectamos ninguna clase en otra clase?<\/li>\n<li>\u00bfInyectamos solo una parte de la informaci\u00f3n (ya sea una cadena, un n\u00famero entero, una estructura de datos o lo que sea) en la otra clase?<\/li>\n<\/ul>\n<p>No creo que haya una regla estricta para esto, pero probablemente sea seguro decir que es mejor inyectar solo los datos que necesita. Pero entonces esto plantea la pregunta de c\u00f3mo preparar los datos para inyectar en una clase determinada.<\/p>\n<ul>\n<li>\u00bfCreas un m\u00e9todo en una clase y lo pasas a otra?<\/li>\n<li>\u00bfLe pasas una pieza de informaci\u00f3n <strong>privada<\/strong> o <strong>protegida<\/strong>? <\/li>\n<\/ul>\n<p>Por otra parte, creo que depende de si tiene que pasar algo con la informaci\u00f3n antes de que pase a una clase.<\/p>\n<p>De todos modos, podr\u00eda ir y venir sobre esto por el resto de la publicaci\u00f3n y nunca llegar a una conclusi\u00f3n, as\u00ed que \u00bfpor qu\u00e9 no trabajar con un c\u00f3digo fuente hasta que haya algo razonable?<\/p>\n<p>Comencemos diciendo que tenemos un archivo de clase de complemento principal y esta clase es responsable de mantener informaci\u00f3n como:<\/p>\n<ul>\n<li>la ruta al complemento,<\/li>\n<li>la URL del complemento,<\/li>\n<li>si el complemento est\u00e1 cargado o no,<\/li>\n<li>la pantalla que se est\u00e1 viendo actualmente,<\/li>\n<li>y las clases a las que necesita transmitir (piense en <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pub\/sub<\/a>) cierta informaci\u00f3n.<\/li>\n<\/ul>\n<p>Quiz\u00e1s un esqueleto o un trozo de la clase podr\u00eda verse <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-00-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass(...)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Entonces empecemos muy amplio. Digamos que queremos tomar toda la clase y pasarla a una de las clases a las que est\u00e1 transmitiendo informaci\u00f3n.<\/p>\n<p>Si ese fuera el caso, entonces podr\u00eda verse <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-01-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Pero uno de los desaf\u00edos con esto es que pasa mucha m\u00e1s informaci\u00f3n de la necesaria a otra clase. Adem\u00e1s, pasa informaci\u00f3n que incluye informaci\u00f3n sobre la clase a la que pasa informaci\u00f3n.<\/p>\n<p>As\u00ed que digamos que queremos dar un paso atr\u00e1s y simplemente pasar una de las piezas privadas de informaci\u00f3n. Esto es sencillo, \u00bfverdad? Termina luciendo algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-02-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como esto<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this-&gt;plugin_path)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Y esto puede ser completamente suficiente para algunos casos. Pero, como se mencion\u00f3 anteriormente, tambi\u00e9n hay momentos en los que queremos tomar la informaci\u00f3n, procesarla y luego pasarla a una clase.<\/p>\n<p>Para hacer esto, simplemente definir\u00edamos un m\u00e9todo, har\u00edamos que procesara la informaci\u00f3n y luego pasar\u00edamos el valor devuelto a la clase que necesita <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-03-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la informaci\u00f3n<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this-&gt;isCurrentAdminStatus())\n        ];\n    }\n}\n<\/code><\/pre>\n<p>La idea detr\u00e1s de esta discusi\u00f3n surgi\u00f3 al trabajar en una revisi\u00f3n de c\u00f3digo para un proyecto reciente y hablar sobre las diversas opciones en las que se podr\u00eda pasar informaci\u00f3n a una clase.<\/p>\n<p>As\u00ed que comenc\u00e9 de manera amplia (a pesar de lo necesario, incluso dado el proceso de pensamiento anterior) y luego lo reduje a lo que solo es necesario.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la programaci\u00f3n orientada a objetos, la inyecci\u00f3n de dependencia es excelente y todo, pero \u00bfcu\u00e1nto se considera demasiado al pasar datos a trav\u00e9s de la inyecci\u00f3n de dependencia?<\/p>\n","protected":false},"author":1,"featured_media":166138,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[716,1015],"tags":[1172],"class_list":["post-229344","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-sitios-utiles","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229344","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229344"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229344\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/166138"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229344"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229344"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}