{"id":229763,"date":"2022-11-10T17:43:00","date_gmt":"2022-11-10T14:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229763"},"modified":"2022-11-09T16:17:03","modified_gmt":"2022-11-09T13:17:03","slug":"o-que-e-demais-para-passar-dados-via-injecao-de-dependencia","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/o-que-e-demais-para-passar-dados-via-injecao-de-dependencia\/","title":{"rendered":"O que \u00e9 demais para passar dados via inje\u00e7\u00e3o de depend\u00eancia?"},"content":{"rendered":"\n<p>O t\u00f3pico de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inje\u00e7\u00e3o de depend\u00eancia<\/a> j\u00e1 existe h\u00e1 algum tempo nos c\u00edrculos de programa\u00e7\u00e3o orientada a objetos. \u00c0s vezes vemos isso no WordPress; \u00e0s vezes n\u00e3o.<\/p>\n<p>Sou f\u00e3 dele, mas, honestamente, nem sempre tenho certeza de quanta informa\u00e7\u00e3o devo injetar em uma aula. Quero dizer, digamos que temos duas classes, e uma cont\u00e9m informa\u00e7\u00f5es que a outra precisa.<\/p>\n<ul>\n<li>N\u00e3o injetamos nenhuma classe em outra classe?<\/li>\n<li>Injetamos apenas uma informa\u00e7\u00e3o (seja uma string, um inteiro, uma estrutura de dados ou qualquer outra coisa) na outra classe?<\/li>\n<\/ul>\n<p>N\u00e3o acho que haja uma regra r\u00edgida e r\u00e1pida para isso, mas provavelmente \u00e9 seguro dizer que \u00e9 melhor injetar apenas os dados de que voc\u00ea precisa. Mas ent\u00e3o isso levanta uma quest\u00e3o de como preparar os dados para injetar em uma determinada classe?<\/p>\n<ul>\n<li>Voc\u00ea cria um m\u00e9todo em uma classe e passa para outra?<\/li>\n<li>Voc\u00ea passa um peda\u00e7o de informa\u00e7\u00e3o <strong>privada<\/strong> ou <strong>protegida<\/strong> para ele?<\/li>\n<\/ul>\n<p>Ent\u00e3o, novamente, acho que depende se algo tem que acontecer com as informa\u00e7\u00f5es antes de serem passadas para uma classe.<\/p>\n<p>De qualquer forma, eu poderia ir e voltar sobre isso pelo resto do post e nunca chegar a uma conclus\u00e3o, ent\u00e3o por que n\u00e3o trabalhar com algum c\u00f3digo-fonte at\u00e9 que haja algo razo\u00e1vel.<\/p>\n<p>Vamos come\u00e7ar dizendo que temos um arquivo de classe de plugin principal e esta classe \u00e9 respons\u00e1vel por manter informa\u00e7\u00f5es como:<\/p>\n<ul>\n<li>o caminho para o plug-in,<\/li>\n<li>o URL do plug-in,<\/li>\n<li>se o plugin est\u00e1 ou n\u00e3o carregado,<\/li>\n<li>a tela que est\u00e1 sendo visualizada no momento,<\/li>\n<li>e as classes para as quais ele precisa transmitir (pense <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pub\/sub<\/a>) certas informa\u00e7\u00f5es.<\/li>\n<\/ul>\n<p>Talvez um esqueleto ou um stub da classe possa ser <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-00-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/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>Ent\u00e3o vamos come\u00e7ar bem amplo. Digamos que queremos pegar a turma inteira e pass\u00e1-la para uma das turmas para a qual est\u00e1 transmitindo informa\u00e7\u00f5es.<\/p>\n<p>Se fosse esse o caso, ent\u00e3o poderia ficar <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-01-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/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>Mas um dos desafios com isso \u00e9 que ele passa muito mais informa\u00e7\u00f5es do que o necess\u00e1rio para outra classe. Al\u00e9m disso, ele passa informa\u00e7\u00f5es que incluem informa\u00e7\u00f5es sobre a classe para a qual suas informa\u00e7\u00f5es est\u00e3o passando.<\/p>\n<p>Ent\u00e3o, digamos que queremos dar um passo atr\u00e1s e apenas passar uma das informa\u00e7\u00f5es privadas. Isso \u00e9 simples, certo? Acaba ficando mais ou menos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-02-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/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>E isso pode ser completamente suficiente para alguns casos. Mas, como mencionado anteriormente, tamb\u00e9m h\u00e1 momentos em que queremos pegar as informa\u00e7\u00f5es, process\u00e1-las e depois pass\u00e1-las para uma classe.<\/p>\n<p>Para fazer isso, basta definir um m\u00e9todo, fazer com que ele processe as informa\u00e7\u00f5es e, em seguida, passar o valor de retorno para a classe que precisa <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-03-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">das informa\u00e7\u00f5es<\/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>A ideia por tr\u00e1s dessa discuss\u00e3o surgiu ao trabalhar em uma revis\u00e3o de c\u00f3digo para um projeto recente e falar sobre as v\u00e1rias op\u00e7\u00f5es nas quais as informa\u00e7\u00f5es podem ser passadas para uma classe.<\/p>\n<p>Ent\u00e3o eu comecei amplo (apesar do que \u00e9 necess\u00e1rio, mesmo considerando o processo de pensamento acima) e depois reduzi ao que \u00e9 apenas necess\u00e1rio.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na programa\u00e7\u00e3o orientada a objetos, a inje\u00e7\u00e3o de depend\u00eancia \u00e9 \u00f3tima e tudo, mas o quanto \u00e9 considerado demais ao passar dados por meio de inje\u00e7\u00e3o de depend\u00eancia?<\/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":[722,1021],"tags":[1170],"class_list":["post-229763","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-sites-uteis","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=229763"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229763\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/166138"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}