{"id":228998,"date":"2022-11-04T12:24:00","date_gmt":"2022-11-04T09:24:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228998"},"modified":"2022-11-09T05:10:08","modified_gmt":"2022-11-09T02:10:08","slug":"kiirprototueuepimine-prototueuep-koodiks-2-osa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/kiirprototueuepimine-prototueuep-koodiks-2-osa\/","title":{"rendered":"Kiirprotot\u00fc\u00fcpimine: protot\u00fc\u00fcp koodiks, 2. osa"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/et\/kiire-prototueuepimine-prototueuep-koodiks-1-osa\/\" title=\"Eelmine postitus\" >Eelmine postitus<\/a> n\u00e4itab palju t\u00f6\u00f6d, et v\u00f5tta midagi, mis oli kunagi kiire protot\u00fc\u00fcp, ja selle protot\u00fc\u00fcbi kodeerimine. Kui te pole j\u00e4lginud, oleme teinud j\u00e4rgmist.<\/p>\n<ol>\n<li>r\u00e4\u00e4kis pistikprogrammi protot\u00fc\u00fcbist ja ehitas selle,<\/li>\n<li>joonistatud \u00fcks objektorienteeritud l\u00e4henemisviis v\u00f5ib toimida,<\/li>\n<li>ja muutis meie protot\u00fc\u00fcbi tegelikuks koodiks.<\/li>\n<\/ol>\n<p>Siinkohal saame oma koodi t\u00e4iustamiseks teha veel m\u00f5ned asjad. Nimelt saame tutvustada nimeruumide m\u00f5istet. See viib organisatsiooni sammu edasi ja v\u00f5ib maksta dividende suuremate projektide puhul.<\/p>\n<p>Nii et siin on \u00fclevaade sellest, kuidas see meie praeguses projektis v\u00e4lja n\u00e4eb.<\/p>\n<h2>Protot\u00fc\u00fcp koodiks: nimeruumid<\/h2>\n<p>Olen varasemates postitustes nimeruume p\u00f5hjalikult k\u00e4sitlenud. Kui te pole lugenud, siis <a href=\"https:\/\/wordpress.mediadoma.com\/et\/nimeruumid-ja-automaatne-laadimine-wordpressis\/\" title=\"soovitan\" >soovitan<\/a>. Seej\u00e4rel tulge tagasi ja vaadake \u00fclej\u00e4\u00e4nud postitust.<\/p>\n<p>Kui otsustate artikli vahele j\u00e4tta, on siin <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00fchike nimeruumi m\u00e4\u00e4ratlus<\/a> :<\/p>\n<blockquote>\n<p>Nimeruumid on m\u00f5eldud kahe probleemi lahendamiseks, millega raamatukogude ja rakenduste autorid korduvkasutatavate koodielementide, n\u00e4iteks klasside v\u00f5i funktsioonide loomisel kokku puutuvad&#8230;<\/p>\n<\/blockquote>\n<p>Ja \u00fcldine idee on see, et me korraldame oma tunde loogilise suhte alusel, mis neil omavahel on.<\/p>\n<p>Lisaks korraldame failid ka kataloogides, mis vastavad nimeruumile. Seda ei pea tegema, kuid leian, et klasside loogiline korraldamine kettal on kasulik nii, nagu need on nimeruumis virtuaalselt korraldatud.<\/p>\n<p>Seda \u00f6eldes korraldame failid.<\/p>\n<h3>Failide korraldamine<\/h3>\n<p>Selle asemel, et alustada peamise pistikprogrammi failiga, korraldagem k\u00f5igepealt oma failid.<\/p>\n<ul>\n<li>Meta Box ja Meta Box Display failid asuvad kataloogis nimega <strong>Display<\/strong>. See on t\u00e4iesti meelevaldne, kuid kuna need failid seda teevad, tundub olevat m\u00f5istlik, et need asuvad seal.<\/li>\n<li>V\u00f5ime sellesse kataloogi paigutada ka failid <strong>message-description.php<\/strong> ja <strong>no-post-list.php<\/strong>, kuid asetame need alamkataloogi nimega <strong>Views<\/strong>. V\u00f5ib-olla soovite seda nimetada <strong>mallideks<\/strong> v\u00f5i <strong>osalisteks<\/strong> v\u00f5i millekski sarnaseks.<\/li>\n<li>J\u00e4rgmiseks on meil klassid, kes vastutavad andmebaasi p\u00e4ringute tegemise eest ja klass, kes vastutab s\u00f5numivahetuse koordineerimise eest. Asetame need k\u00f5ik <strong>Utilitysse.<\/strong> Kindlasti on ka teisi kohti, kuhu nad v\u00f5iksid minna, kuid pidage meeles, et eesm\u00e4rk on n\u00e4idata, kuidas nimeruume kasutada. Nii et kui tunnete nii soovi, kohandage faile oma maitse j\u00e4rgi.<\/li>\n<\/ul>\n<p>Kui olete j\u00e4rginud \u00fclaltoodut, peaks teil olema kataloogistruktuur, mis n\u00e4eb v\u00e4lja umbes selline:<\/p>\n<p>\u00dcks viis failide korraldamiseks.<\/p>\n<p>N\u00fc\u00fcd on aeg m\u00e4\u00e4ratleda iga klassi jaoks nimeruumid. Kuna oleme need k\u00f5ik oma kataloogidesse paigutanud, on nimeruumi m\u00e4\u00e4ramine lihtne; Siiski on oluline m\u00f5ista, et teistes nimeruumides asuvate klasside kasutamisel peame <strong><a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kasutama m\u00e4rks\u00f5na use.<\/a><\/strong><\/p>\n<p>Vaatame l\u00e4bi k\u00f5ik oma failid, alustades <strong>utiliidi<\/strong> failidest. Esiteks alustame <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-00-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Messengeriga<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Display content for the meta box when requested.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\nnamespace McFarlinTRPUtility;\nuse McFarlinTRPUtilityPost_Query;\n\n\/**\n * Retrieves information from the class responsible for querying the database and\n * renders it in the context of our meta box when called via the Meta Box Display.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Messenger {\n  \/\/ Snip for brevity. \n}<\/code><\/pre>\n<p>M\u00e4rkate, et faili nimeruum kuvatakse p\u00e4ises koos deklaratsiooniga meie loodud klassi <strong>Post Query kasutamiseks.<\/strong> Lisasin klassi nime nimeruumi l\u00f5ppu, nii et ma ei pea seda kogu koodibaasi ulatuses kasutama.<\/p>\n<p>Pange t\u00e4hele, et konstruktor n\u00e4eb n\u00fc\u00fcd v\u00e4lja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-01-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">selline<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Instantiates the class by setting a reference to the query.\n *\n * @param string $plugin_dir The path to the root of the plugin directory.\n *\/\npublic function __construct( $plugin_dir) {\n\n    $this-&gt;query      = new Post_Query();\n    $this-&gt;plugin_dir = trailingslashit( $plugin_dir );\n}<\/code><\/pre>\n<p>Lisasin\u00a0 argumendi <strong>$plugin_dir<\/strong>, kuna peame p\u00e4ringu tulemuste \u00f5igeks kuvamiseks seda kasutama. Ja kuna need asuvad n\u00fc\u00fcd rakenduse erinevas piirkonnas, n\u00e4evad funktsioonid v\u00e4lja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-02-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rgmised<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Displays the description of the content of the meta box.\n *\n * @access private\n *\/\nprivate function get_post_message() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/post-list.php';\n}\n\n\/**\n * Displays the description of the content of the meta box.\n *\n * @access private\n *\/\nprivate function get_description() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/message-description.php';\n}\n\n\/**\n * Displays a message of there are no recent posts.\n *\n * @access private\n *\/\nprivate function get_no_posts_message() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/no-post-list.php';\n}<\/code><\/pre>\n<p>J\u00e4rgmisena vaatame <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-03-post-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">postitusp\u00e4ringu<\/a> klassi. Selles klassis pole midagi palju muutunud, v\u00e4lja arvatud see, et oleme andnud sellele nimeruumi ja oleme ka p\u00e4ringut v\u00e4rskendanud ainult kolme postituse tagasit\u00f5mbamiseks (vastavalt <a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/#comment-911828\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sellele kommentaarile<\/a> ).<\/p>\n<pre><code>&lt;?php\n\nnamespace McFarlinTRPUtility;\n\n\/**\n * Queries the database for three most recent posts. Returns the query to the\n * caller so that it can be interrogates for posts or not.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Query {\n\n  \/\/ Snip for brevity.\n\n    private function get_posts() {\n\n        $args = array(\n            'post_type'        =&gt; 'post',\n            'post_status'      =&gt; 'publish',\n            'posts_per_page' =&gt; 3,\n            'orderby'          =&gt; 'date',\n            'order'            =&gt; 'desc',\n        );\n        $this-&gt;query = new WP_Query( $args );\n\n        return $this-&gt;query;\n    }\n}<\/code><\/pre>\n<p>Pange t\u00e4hele, et olen ka <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query eelfikseerinud<\/a> kaldkriipsuga, kuna see on osa globaalsest nimeruumist.<\/p>\n<p>Liigume\u00a0 kataloogi <strong>Display<\/strong> ja heidame pilgu <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-04-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Meta Box klassile<\/a>. <strong>Sellele on antud ka nimeruum ja see kasutab ka Meta Box Display<\/strong> klassi t\u00e4ielikku nime, mida me hetkel vaatame.<\/p>\n<pre><code>&lt;?php\n\n namespace McFarlinTRPDisplay;\n use McFarlinTRPDisplayMeta_Box_Display;\n\n\/**\n * Registers the Meta Box with WordPress. Defines the ID, title, display function,\n * and the post type on which it will live.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Meta_Box_Display\n     *\/\n    private $meta_box_display;\n\n    \/**\n     * Instantiates the class by setting its property equal to a reference to its display.\n     *\n     * @param string $plugin_dir A reference to the root of the plugin's directory.\n     *\/\n    public function __construct( $plugin_dir) {\n        $this-&gt;meta_box_display = new Meta_Box_Display( $plugin_dir );\n    }\n\n    \/\/ Snip for brevity.\n}<\/code><\/pre>\n<p>Pange t\u00e4hele, et see konstruktor aktsepteerib ka pistikprogrammide kataloogi argumendina ja edastab selle ka <strong>Meta Box Display<\/strong> klassile. See t\u00e4hendab, et s\u00f5numite kuvamise eest vastutavad funktsioonid leiate nende asukohast\u00a0 kataloogis <strong>Vaated<\/strong>.<\/p>\n<p>L\u00f5puks vaatame \u00fcle klassi <strong>Meta Box Display .<\/strong> See on lihtne klass, mis sisaldab nimeruumi ja viitab <strong>Post Messengerile<\/strong>, mida oleme eespool vaadanud.<\/p>\n<pre><code>&lt;?php\n\/**\n * Defines the display for the meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\nnamespace McFarlinTRPDisplay;\nuse McFarlinTRPUtilityPost_Messenger;\n\n\/**\n * Defines the display for the meta box that will render the content in the\n * context of its meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box_Display {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Post_Messenger\n     *\/\n    private $messenger;\n\n    \/**\n     * Instantiates the object by setting a property equal to that of the class\n     * responsible for rendering the messages from the post query.\n     *\n     * @param string $plugin_dir A reference to the root of the plugin's directory.\n     *\/\n    public function __construct( $plugin_dir) {\n        $this-&gt;messenger = new Post_Messenger( $plugin_dir );\n    }\n\n    \/**\n     * If there are posts to display, renders them in the metabox. Otherwise, displays\n     * a note that there are no posts to display.\n     *\/\n    public function display() {\n        $this-&gt;messenger-&gt;get_message();\n    }\n}\n<\/code><\/pre>\n<p>Siinkohal oleme pistikprogrammi kaudu t\u00e4isringi teinud. \u00dche erandiga: alglaadimisfail. Lisasime sellele nimeruumi ja peame v\u00e4rskendama <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-06-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">selle instantsimise<\/a> viisi :<\/p>\n<pre><code>&lt;?php\n\nnamespace McFarlinTRP;\nuse McFarlinTRPDisplayMeta_Box;\n\ninclude 'Display\/class-meta-box.php';\ninclude 'Display\/class-meta-box-display.php';\ninclude 'Utility\/class-post-messenger.php';\ninclude 'Utility\/class-post-query.php';\n\nadd_action( 'add_meta_boxes', __NAMESPACE__. 'trp_start' );\n\/**\n * Starts the plugin.\n *\/\nfunction trp_start() {\n\n    $meta_box = new Meta_Box( dirname( __FILE__) );\n    $meta_box-&gt;init();\n}<\/code><\/pre>\n<p>Nimelt on meil:<\/p>\n<ul>\n<li>m\u00e4\u00e4ratles nimeruumi,<\/li>\n<li>viidake <strong>Meta Box<\/strong> klassi asukohale,<\/li>\n<li>v\u00e4rskendas teid, et lisada failide leidmine (mida saab l\u00f5puks teha automaatlaaduriga),<\/li>\n<li>ja v\u00e4rskendas <strong>kutset add_action<\/strong>.<\/li>\n<\/ul>\n<p>Lisatoimingu kutse kohta on see j\u00e4rgmine: kuna WordPress peab leidma selle funktsiooni asukoha ja funktsioon asub nimeruumis, tuleb funktsiooni t\u00e4ielik nimi tuvastada, et WordPress saaks selle v\u00e4lja kutsuda. Sellest tuleneb ka vajadus funktsiooni nimes <strong><a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.nsconstants.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">NAMESPACE .<\/a><\/strong><\/p>\n<h2>N\u00fc\u00fcd oleme organiseeritud (\u00fche erandiga)<\/h2>\n<p>Nagu n\u00e4ete, lisavad neile vastavad nimeruumid ja kataloogid projektile palju korraldust. Seda on lihtsam j\u00e4lgida, lihtsam aru saada, kuhu asjad liiguvad (nii olemasolevate kui ka uute failide puhul). Ja see tekitab v\u00e4hem tunnet, kui kogute palju faile \u00fchte kohta.<\/p>\n<p>Isegi kui klass on natuke monoliitne, saab selle siiski korraldada nii, et hooldus oleks lihtne.<\/p>\n<p>Sellele vaatamata muudaksin selle pistikprogrammi juures veel midagi: selline pistikprogrammi kataloogi \u00fcmberpaigutamine ei aita madalat sidusust ja see seob klassid omavahel tihedamalt, kuna alglaadimisfail peab edastama v\u00e4\u00e4rtuse \u00fcks klass, mis edastab selle teise klassi, mis kasutab seda failide laadimiseks ja nii edasi.<\/p>\n<p>Kas on v\u00f5imalusi selle parandamiseks? Absoluutselt. Ja v\u00f5ib-olla vaatame seda viimases postituses.<\/p>\n<p>Pidage meeles, et seni on pistikprogrammi uusim versioon saadaval <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GitHubi p\u00f5hiharus, mis on m\u00e4rgistatud kui 0.3.0<\/a>.<\/p>\n<h2>Sarja postitused<\/h2>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/kiire-prototueuepimine-wordpressiga-kontseptsioonist-pistikprogrammini\/\" title=\"Kiire protot\u00fc\u00fcpimine WordPressiga: kontseptsioonist pistikprogrammini\">Kiire protot\u00fc\u00fcpimine WordPressiga: kontseptsioonist pistikprogrammini<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/kiire-prototueuepimine-wordpressiga-kontseptsiooni-analueues\/\" title=\"Kiire protot\u00fc\u00fcpimine WordPressiga: kontseptsiooni anal\u00fc\u00fcs\">Kiire protot\u00fc\u00fcpimine WordPressiga: kontseptsiooni anal\u00fc\u00fcs<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/kiire-prototueuepimine-prototueuep-koodiks-1-osa\/\" title=\"Kiire protot\u00fc\u00fcpimine: protot\u00fc\u00fcp koodiks, 1. osa\">Kiire protot\u00fc\u00fcpimine: protot\u00fc\u00fcp koodiks, 1. osa<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Kiirprotot\u00fc\u00fcpimine: protot\u00fc\u00fcp koodiks, 2. osa<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/kiire-prototueuepimine-automaatse-laadimise-tutvustamine\/\" title=\"Kiire protot\u00fc\u00fcpimine: automaatse laadimise tutvustamine\">Kiire protot\u00fc\u00fcpimine: automaatse laadimise tutvustamine<\/a><\/li>\n<\/ol>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>P\u00fc\u00fcdes protot\u00fc\u00fcbilt koodile \u00fcle minna, v\u00f5tan poolelioleva pistikprogrammi ja juurutan organisatsiooni jaoks liidesed.<\/p>\n","protected":false},"author":1,"featured_media":223922,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,916,842],"tags":[1165],"class_list":["post-228998","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-muud","category-opetused","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/228998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=228998"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/228998\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/223922"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=228998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=228998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=228998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}