{"id":228853,"date":"2022-11-04T12:17:00","date_gmt":"2022-11-04T09:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228853"},"modified":"2022-11-09T04:33:27","modified_gmt":"2022-11-09T01:33:27","slug":"rapid-prototyping-prototype-to-code-del-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/rapid-prototyping-prototype-to-code-del-2\/","title":{"rendered":"Rapid Prototyping: Prototype To Code, del 2"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/rapid-prototyping-prototype-to-code-del-1\/\" title=\"Det tidigare inl\u00e4gget\" >Det tidigare inl\u00e4gget<\/a> visar mycket arbete med att ta n\u00e5got som en g\u00e5ng var en snabb prototyp och ta den prototypen till kod. Om du inte har f\u00f6ljt med har vi gjort f\u00f6ljande:<\/p>\n<ol>\n<li>pratade om och byggde en prototyp f\u00f6r ett plugin,<\/li>\n<li>i diagrammet kan ett objektorienterat tillv\u00e4gag\u00e5ngss\u00e4tt fungera,<\/li>\n<li>och refaktorerade v\u00e5r prototyp till faktisk kod.<\/li>\n<\/ol>\n<p>Vid det h\u00e4r laget finns det n\u00e5gra fler saker vi kan g\u00f6ra f\u00f6r att f\u00f6rb\u00e4ttra v\u00e5r kod. Vi kan n\u00e4mligen introducera begreppet namnrymder. Detta tar organisationen ett steg l\u00e4ngre och kan ge utdelning f\u00f6r st\u00f6rre projekt.<\/p>\n<p>S\u00e5 h\u00e4r \u00e4r en titt p\u00e5 hur detta ser ut i v\u00e5rt nuvarande projekt.<\/p>\n<h2>Prototyp att koda: Namnutrymmen<\/h2>\n<p>Jag har t\u00e4ckt namnutrymmen p\u00e5 djupet i tidigare inl\u00e4gg. Om du inte har l\u00e4st den <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/namnutrymmen-och-autoladdning-i-wordpress\/\" title=\"rekommenderar jag den\" >rekommenderar jag den<\/a>. Kom sedan tillbaka och kolla in resten av inl\u00e4gget.<\/p>\n<p>Om du v\u00e4ljer att hoppa \u00f6ver artikeln, h\u00e4r \u00e4r <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en kort definition av ett namnomr\u00e5de<\/a> :<\/p>\n<blockquote>\n<p>Namnomr\u00e5den \u00e4r designade f\u00f6r att l\u00f6sa tv\u00e5 problem som f\u00f6rfattare till bibliotek och applikationer st\u00f6ter p\u00e5 n\u00e4r de skapar \u00e5teranv\u00e4ndbara kodelement som klasser eller funktioner&#8230;<\/p>\n<\/blockquote>\n<p>Och den allm\u00e4nna tanken \u00e4r att vi organiserar v\u00e5ra klasser utifr\u00e5n en logisk relation de har med varandra.<\/p>\n<p>Dessutom organiserar vi \u00e4ven filerna i kataloger som matchar namnomr\u00e5det. Detta \u00e4r inget som m\u00e5ste g\u00f6ras, men jag tycker att det hj\u00e4lper att ha klasserna logiskt organiserade p\u00e5 disken p\u00e5 det s\u00e4tt som de \u00e4r virtuellt organiserade i namnutrymmet.<\/p>\n<p>Med det sagt, l\u00e5t oss organisera filerna.<\/p>\n<h3>Organisera filerna<\/h3>\n<p>Ist\u00e4llet f\u00f6r att b\u00f6rja med huvudpluginfilen, l\u00e5t oss b\u00f6rja med att organisera v\u00e5ra filer f\u00f6rst.<\/p>\n<ul>\n<li>Filerna Meta Box och Meta Box Display kommer att finnas i en katalog som heter <strong>Display<\/strong>. Detta \u00e4r helt godtyckligt, men eftersom det \u00e4r vad dessa filer g\u00f6r, verkar det vara logiskt att det \u00e4r d\u00e4r de skulle ligga.<\/li>\n<li>Vi kan ocks\u00e5 placera filerna <strong>message-description.php<\/strong> och <strong>no-post-list.php<\/strong> i den katalogen, men l\u00e5t oss placera dem i en underkatalog som heter <strong>Views<\/strong>. Du kanske vill kalla detta f\u00f6r <strong>mallar<\/strong> eller <strong>partier<\/strong> eller n\u00e5got liknande.<\/li>\n<li>D\u00e4refter har vi klasserna som ansvarar f\u00f6r att fr\u00e5ga databasen och klassen som ansvarar f\u00f6r att koordinera meddelanden. L\u00e5t oss placera var och en av dessa i <strong>Utility.<\/strong> Det finns andra st\u00e4llen de kan g\u00e5 till, men kom ih\u00e5g att syftet \u00e4r att visa hur man anv\u00e4nder namnutrymmen. S\u00e5 om du k\u00e4nner dig s\u00e5 sugen, justera g\u00e4rna dina filer s\u00e5 att de passar dig.<\/li>\n<\/ul>\n<p>Om du har f\u00f6ljt det vi har ovan b\u00f6r du ha en katalogstruktur som ser ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p>Ett s\u00e4tt att organisera dina filer.<\/p>\n<p>Nu \u00e4r det dags att definiera namnutrymmen f\u00f6r var och en av klasserna. Eftersom vi har organiserat dem alla i deras kataloger blir det l\u00e4tt att ange ett namnomr\u00e5de; Det \u00e4r dock viktigt att inse att vi m\u00e5ste anv\u00e4nda <strong><a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nyckelordet use<\/a><\/strong> n\u00e4r vi anv\u00e4nder klasser som finns i andra namnutrymmen.<\/p>\n<p>L\u00e5t oss g\u00e5 igenom alla v\u00e5ra filer och b\u00f6rja med filerna i <strong>Utility<\/strong>. F\u00f6rst b\u00f6rjar vi med <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-00-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Messenger<\/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>Du kommer att m\u00e4rka att namnutrymmet f\u00f6r filen visas i rubriken tillsammans med en deklaration om att anv\u00e4nda klassen <strong>Post Query<\/strong> som vi skapade. Jag har lagt till namnet p\u00e5 klassen i slutet av namnutrymmet, s\u00e5 jag beh\u00f6ver inte anv\u00e4nda det i hela kodbasen.<\/p>\n<p>L\u00e4gg m\u00e4rke till att konstrukt\u00f6ren nu ser <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-01-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/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>Jag har lagt till ett <strong>$plugin_dir-<\/strong> argument eftersom vi m\u00e5ste anv\u00e4nda detta f\u00f6r att visa resultaten av fr\u00e5gan korrekt. Och eftersom de nu finns i ett annat omr\u00e5de av applikationen ser funktionerna ut <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-02-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r<\/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>L\u00e5t oss sedan titta p\u00e5 klassen <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-03-post-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Query<\/a>. Ingenting mycket har f\u00f6r\u00e4ndrats i den h\u00e4r klassen f\u00f6rutom att vi har gett den ett namnutrymme, och vi har ocks\u00e5 uppdaterat fr\u00e5gan f\u00f6r att bara dra tillbaka tre inl\u00e4gg (enligt <a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/#comment-911828\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den h\u00e4r kommentaren<\/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>L\u00e4gg m\u00e4rke till i koden, jag har ocks\u00e5 <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6rfixat WP_Query<\/a> med ett snedstreck eftersom det \u00e4r en del av det globala namnomr\u00e5det.<\/p>\n<p>L\u00e5t oss g\u00e5 in i <strong>Display<\/strong> &#8211; katalogen och ta en titt p\u00e5 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-04-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Meta Box-klassen<\/a>. Detta har ocks\u00e5 f\u00e5tt ett namnutrymme och anv\u00e4nder ocks\u00e5 det fullt kvalificerade namnet p\u00e5 <strong>Meta Box Display<\/strong> -klassen som vi kommer att titta p\u00e5 ett \u00f6gonblick.<\/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>L\u00e4gg m\u00e4rke till att den h\u00e4r konstrukt\u00f6ren ocks\u00e5 accepterar plugin-katalogen som ett argument och skickar den till <strong>Meta Box Display<\/strong> -klassen ocks\u00e5. Detta \u00e4r f\u00f6r att de funktioner som ansvarar f\u00f6r att visa meddelanden kan hittas p\u00e5 r\u00e4tt plats i katalogen <strong>Views .<\/strong><\/p>\n<p>L\u00e5t oss slutligen se \u00f6ver <strong>Meta Box Display<\/strong> -klassen. Det h\u00e4r \u00e4r en enkel klass som inkluderar namnutrymmet och refererar till <strong>Post Messenger<\/strong> som vi har granskat ovan.<\/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>Vid det h\u00e4r laget har vi kommit en runda genom plugin-programmet. Med ett undantag: Bootstrap-filen. Vi har lagt till ett namnomr\u00e5de till det och m\u00e5ste uppdatera s\u00e4ttet <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-06-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">som det instansierades p\u00e5<\/a> :<\/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>Vi har n\u00e4mligen:<\/p>\n<ul>\n<li>definierade namnutrymmet,<\/li>\n<li>referera till platsen f\u00f6r <strong>Meta Box<\/strong> -klassen,<\/li>\n<li>uppdaterade s\u00f6kv\u00e4garna f\u00f6r att inkludera var man kan hitta filerna (vilket i slut\u00e4ndan kan g\u00f6ras med en autoloader),<\/li>\n<li>och uppdaterade <strong>add_action<\/strong> -anropet.<\/li>\n<\/ul>\n<p>Det h\u00e4r \u00e4r grejen med add action-anropet: Eftersom WordPress beh\u00f6ver hitta den h\u00e4r funktionen och funktionen finns i ett namnomr\u00e5de, m\u00e5ste det fullst\u00e4ndiga namnet p\u00e5 funktionen identifieras s\u00e5 att WordPress kan anropa den. D\u00e4rav behovet av <strong><a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.nsconstants.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">NAMESPACE<\/a><\/strong> i funktionens namn.<\/p>\n<h2>Nu \u00e4r vi organiserade (med ett undantag)<\/h2>\n<p>Som du m\u00e4rker l\u00e4gger namnutrymmen och kataloger som matchar dem mycket organisation till ett projekt. Det \u00e4r l\u00e4ttare att f\u00f6lja, l\u00e4ttare att f\u00f6rst\u00e5 var saker och ting tar v\u00e4gen (f\u00f6r b\u00e5de befintliga och nya filer). Och det ger mindre k\u00e4nsla att bara samla m\u00e5nga filer p\u00e5 en enda plats.<\/p>\n<p>\u00c4ven om en klass \u00e4r lite av en monolit, kan den fortfarande organiseras p\u00e5 ett s\u00e5dant s\u00e4tt som g\u00f6r underh\u00e5llet enkelt.<\/p>\n<p>Med det sagt finns det fortfarande n\u00e5got jag skulle \u00e4ndra p\u00e5 det h\u00e4r pluginet: Att g\u00e5 runt i katalogen f\u00f6r plugin-programmet s\u00e5 h\u00e4r \u00e4r inte n\u00e5got som hj\u00e4lper till med l\u00e5g sammanh\u00e5llning och det kopplar ihop klasserna t\u00e4tare eftersom bootstrap-filen m\u00e5ste skicka ett v\u00e4rde till en klass som skickar den till en annan klass som anv\u00e4nder den f\u00f6r att ladda filer och s\u00e5 vidare.<\/p>\n<p>S\u00e5 finns det s\u00e4tt att fixa detta? Absolut. Och det kanske vi tar en titt p\u00e5 i det sista inl\u00e4gget.<\/p>\n<p>Tills dess, kom ih\u00e5g att den senaste versionen av insticksprogrammet \u00e4r tillg\u00e4ngligt <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e5 huvudgrenen, taggad som 0.3.0, p\u00e5 GitHub<\/a>.<\/p>\n<h2>Serie inl\u00e4gg<\/h2>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/snabb-prototyping-med-wordpress-fraan-koncept-till-plugin\/\" title=\"Snabb prototyping med WordPress: fr\u00e5n koncept till plugin\">Snabb prototyping med WordPress: fr\u00e5n koncept till plugin<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/snabb-prototyping-med-wordpress-konceptanalys\/\" title=\"Snabb prototyping med WordPress: konceptanalys\">Snabb prototyping med WordPress: konceptanalys<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/rapid-prototyping-prototype-to-code-del-1\/\" title=\"Rapid Prototyping: Prototype To Code, del 1\">Rapid Prototyping: Prototype To Code, del 1<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rapid Prototyping: Prototype To Code, del 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/rapid-prototyping-introduktion-av-autoloading\/\" title=\"Rapid Prototyping: Introduktion av Autoloading\">Rapid Prototyping: Introduktion av Autoloading<\/a><\/li>\n<\/ol>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I det fortsatta arbetet med att g\u00e5 fr\u00e5n prototyp till kod kommer jag att ta plugin-programmet p\u00e5 g\u00e5ng och implementera gr\u00e4nssnitt f\u00f6r organisationen.<\/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":[848,922,724],"tags":[1173],"class_list":["post-228853","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-oevrig","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228853"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228853\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223922"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228853"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}