{"id":229095,"date":"2022-11-10T17:37:00","date_gmt":"2022-11-10T14:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229095"},"modified":"2022-11-09T05:30:12","modified_gmt":"2022-11-09T02:30:12","slug":"co-to-za-duzo-do-przekazywania-danych-przez-wstrzykiwanie-zaleznosci","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/co-to-za-duzo-do-przekazywania-danych-przez-wstrzykiwanie-zaleznosci\/","title":{"rendered":"Co to za du\u017co do przekazywania danych przez wstrzykiwanie zale\u017cno\u015bci?"},"content":{"rendered":"\n<p>Temat <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wstrzykiwania zale\u017cno\u015bci<\/a> jest ju\u017c od jakiego\u015b czasu obecny w kr\u0119gach programowania obiektowego. Czasami widzimy to w WordPressie; czasami nie.<\/p>\n<p>Jestem ich fanem, ale szczerze m\u00f3wi\u0105c, nie zawsze jestem pewien, ile informacji nale\u017cy wprowadzi\u0107 do klasy. Powiedzmy, \u017ce mamy dwie klasy, a jedna zawiera informacje, kt\u00f3rych potrzebuje druga.<\/p>\n<ul>\n<li>Czy nie wstrzykujemy \u017cadnej klasy do innej klasy?<\/li>\n<li>Czy do drugiej klasy wstrzykujemy tylko fragment informacji (np. ci\u0105g znak\u00f3w, liczb\u0119 ca\u0142kowit\u0105, struktur\u0119 danych lub cokolwiek innego)?<\/li>\n<\/ul>\n<p>Nie s\u0105dz\u0119, \u017ce istnieje na to twarda i szybka regu\u0142a, ale prawdopodobnie mo\u017cna bezpiecznie powiedzie\u0107, \u017ce lepiej jest wstrzykiwa\u0107 tylko te dane, kt\u00f3rych potrzebujesz. Ale wtedy pojawia si\u0119 pytanie, jak przygotowa\u0107 dane do wstrzykni\u0119cia do danej klasy?<\/p>\n<ul>\n<li>Czy tworzysz metod\u0119 w jednej klasie i przekazujesz j\u0105 do innej?<\/li>\n<li>Czy przekazujesz do niego cz\u0119\u015b\u0107 informacji <strong>prywatnych<\/strong> lub <strong>chronionych<\/strong>? <\/li>\n<\/ul>\n<p>Z drugiej strony my\u015bl\u0119, \u017ce zale\u017cy to od tego, czy co\u015b musi si\u0119 sta\u0107 z informacj\u0105, zanim zostanie ona przekazana do klasy.<\/p>\n<p>W ka\u017cdym razie, m\u00f3g\u0142bym kr\u0119ci\u0107 si\u0119 na ten temat do ko\u0144ca postu i nigdy nie doj\u015b\u0107 do konkluzji, wi\u0119c dlaczego nie przepracowa\u0107 jakiego\u015b kodu \u017ar\u00f3d\u0142owego, dop\u00f3ki nie pojawi si\u0119 co\u015b rozs\u0105dnego.<\/p>\n<p>Zacznijmy od stwierdzenia, \u017ce \u200b\u200bmamy g\u0142\u00f3wny plik klasy wtyczki i ta klasa jest odpowiedzialna za utrzymanie informacji takich jak:<\/p>\n<ul>\n<li>\u015bcie\u017cka do wtyczki,<\/li>\n<li>adres URL wtyczki,<\/li>\n<li>czy wtyczka jest za\u0142adowana,<\/li>\n<li>aktualnie ogl\u0105dany ekran,<\/li>\n<li>oraz klas, do kt\u00f3rych musi nadawa\u0107 (pomy\u015bl <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pub\/sub<\/a>) okre\u015blone informacje.<\/li>\n<\/ul>\n<p>By\u0107 mo\u017ce szkielet lub odga\u0142\u0119zienie klasy mo\u017ce wygl\u0105da\u0107 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-00-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/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>W takim razie zacznijmy naprawd\u0119 szeroko. Powiedzmy, \u017ce chcemy wzi\u0105\u0107 ca\u0142\u0105 klas\u0119 i przekaza\u0107 j\u0105 do jednej z klas, do kt\u00f3rej przekazuje informacje.<\/p>\n<p>Gdyby tak by\u0142o, mog\u0142oby to wygl\u0105da\u0107 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-01-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/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>Ale jednym z wyzwa\u0144 jest to, \u017ce przekazuje znacznie wi\u0119cej informacji ni\u017c to konieczne do innej klasy. Ponadto przekazuje informacje zawieraj\u0105ce informacje o klasie, do kt\u00f3rej przekazuje informacje.<\/p>\n<p>Za\u0142\u00f3\u017cmy wi\u0119c, \u017ce chcemy zrobi\u0107 krok wstecz i po prostu przekaza\u0107 jedn\u0105 z prywatnych informacji. To proste, prawda? Wygl\u0105da to mniej wi\u0119cej <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-02-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/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>W niekt\u00f3rych przypadkach mo\u017ce to by\u0107 w zupe\u0142no\u015bci wystarczaj\u0105ce. Ale, jak wspomniano wcze\u015bniej, s\u0105 te\u017c chwile, w kt\u00f3rych chcemy zebra\u0107 informacje, przetworzy\u0107 je, a nast\u0119pnie przekaza\u0107 do klasy.<\/p>\n<p>Aby to zrobi\u0107, po prostu zdefiniujemy metod\u0119, przetworzymy informacje, a nast\u0119pnie przeka\u017cemy zwracan\u0105 warto\u015b\u0107 do klasy, kt\u00f3ra potrzebuje <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-03-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">informacji<\/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>Pomys\u0142 stoj\u0105cy za t\u0105 dyskusj\u0105 pojawi\u0142 si\u0119 podczas pracy nad przegl\u0105dem kodu dla ostatniego projektu i omawiania r\u00f3\u017cnych opcji przekazywania informacji do klasy.<\/p>\n<p>Zacz\u0105\u0142em wi\u0119c og\u00f3lnie (pomimo tego, co jest konieczne, nawet bior\u0105c pod uwag\u0119 powy\u017cszy proces my\u015blowy), a nast\u0119pnie zaw\u0119zi\u0142em go do tego, co jest konieczne.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W programowaniu obiektowym wstrzykiwanie zale\u017cno\u015bci jest \u015bwietne i wszystko, ale ile jest uwa\u017cane za zbyt wiele podczas przekazywania danych przez wstrzykiwanie zale\u017cno\u015bci?<\/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":[721,1020],"tags":[1169],"class_list":["post-229095","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-przydatne-strony","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229095","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=229095"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229095\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/166138"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229095"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229095"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}