{"id":230013,"date":"2022-11-10T17:53:00","date_gmt":"2022-11-10T14:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230013"},"modified":"2022-11-09T19:42:18","modified_gmt":"2022-11-09T16:42:18","slug":"che-cose-troppo-per-passare-i-dati-tramite-liniezione-di-dipendenza","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/che-cose-troppo-per-passare-i-dati-tramite-liniezione-di-dipendenza\/","title":{"rendered":"Che cos&#8217;\u00e8 troppo per passare i dati tramite l&#8217;iniezione di dipendenza?"},"content":{"rendered":"\n<p>L&#8217;argomento <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dell&#8217;iniezione di dipendenza<\/a> \u00e8 in circolazione da un po&#8217; di tempo nei circoli della programmazione orientata agli oggetti. A volte lo vediamo in WordPress; a volte no.<\/p>\n<p>Ne sono un fan ma, onestamente, per\u00f2, non sono sempre sicuro di quante informazioni inserire in una classe. Voglio dire, diciamo che ci vengono date due classi e una contiene le informazioni di cui l&#8217;altra ha bisogno.<\/p>\n<ul>\n<li>Non iniettiamo nessuna classe in un&#8217;altra classe?<\/li>\n<li>Iniettiamo solo un&#8217;informazione (che sia una stringa, un intero, una struttura dati o altro) nell&#8217;altra classe?<\/li>\n<\/ul>\n<p>Non penso che ci sia una regola rigida per questo, ma probabilmente \u00e8 sicuro dire che \u00e8 meglio iniettare solo i dati di cui hai bisogno. Ma allora questo solleva una domanda su come preparare i dati da iniettare in una data classe?<\/p>\n<ul>\n<li>Crei un metodo in una classe e lo passi in un&#8217;altra?<\/li>\n<li>Ci passi un&#8217;informazione <strong>privata<\/strong> o <strong>protetta<\/strong>? <\/li>\n<\/ul>\n<p>Poi di nuovo, penso che dipenda se deve succedere qualcosa alle informazioni prima che vengano passate in una classe.<\/p>\n<p>Ad ogni modo, potrei andare avanti e indietro su questo per il resto del post e non arrivare mai a una conclusione, quindi perch\u00e9 non lavorare con un codice sorgente finch\u00e9 non c&#8217;\u00e8 qualcosa di ragionevole.<\/p>\n<p>Iniziamo dicendo che abbiamo un file di classe del plugin principale e questa classe \u00e8 responsabile del mantenimento di informazioni come:<\/p>\n<ul>\n<li>il percorso del plugin,<\/li>\n<li>l&#8217;URL del plugin,<\/li>\n<li>indipendentemente dal fatto che il plugin sia caricato o meno,<\/li>\n<li>lo schermo attualmente visualizzato,<\/li>\n<li>e le classi a cui ha bisogno di trasmettere (pensa <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pub\/sub<\/a>) determinate informazioni.<\/li>\n<\/ul>\n<p>Forse uno scheletro o uno stub della classe potrebbe assomigliare <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-00-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questo<\/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>Allora cominciamo davvero in largo. Supponiamo di voler prendere l&#8217;intera classe e passarla a una delle classi a cui trasmette informazioni.<\/p>\n<p>Se cos\u00ec fosse, potrebbe apparire <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-01-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cos\u00ec<\/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>Ma una delle sfide con questo \u00e8 che passa molte pi\u00f9 informazioni del necessario in un&#8217;altra classe. Inoltre, trasmette informazioni che includono informazioni sulla classe in cui le sue informazioni passano.<\/p>\n<p>Quindi diciamo che vogliamo fare un passo indietro e passare semplicemente una delle informazioni private. Questo \u00e8 semplice, giusto? Finisce per <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-02-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assomigliare a questo<\/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 questo pu\u00f2 essere del tutto sufficiente per alcuni casi. Ma, come accennato in precedenza, ci sono anche momenti in cui vogliamo prendere le informazioni, elaborarle e poi passarle in una classe.<\/p>\n<p>Per fare ci\u00f2, dobbiamo semplicemente definire un metodo, farlo elaborare le informazioni, quindi passare il valore restituito nella classe che ha bisogno <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-03-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">delle informazioni<\/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>L&#8217;idea alla base di questa discussione \u00e8 nata lavorando su una revisione del codice per un progetto recente e parlando delle varie opzioni in cui le informazioni potevano essere passate in una classe.<\/p>\n<p>Quindi ho iniziato in modo ampio (nonostante ci\u00f2 che \u00e8 necessario anche dato il processo di pensiero sopra) e poi l&#8217;ho ristretto a ci\u00f2 che \u00e8 solo necessario.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nella programmazione orientata agli oggetti, l&#8217;iniezione delle dipendenze \u00e8 ottima e tutto tranne quanto viene considerato troppo quando si passano i dati tramite l&#8217;iniezione delle dipendenze?<\/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":[1019,720],"tags":[1168],"class_list":["post-230013","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-siti-utili","category-sviluppatore","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230013","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=230013"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230013\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/166138"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230013"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230013"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}