Rapid Prototyping: Prototype to Code, osa 2
Edellinen viesti osoittaa paljon työtä jonkin kerran nopean prototyypin ottamiseksi ja prototyypin ottamiseksi koodaamaan. Jos et ole seurannut, olemme tehneet seuraavasti:
- puhui ja rakensi prototyypin laajennukselle,
- kaaviollisesti yksi oliolähtöinen lähestymistapa voi toimia,
- ja muutti prototyyppimme todelliseksi koodiksi.
Tässä vaiheessa voimme tehdä vielä muutamia asioita koodimme parantamiseksi. Voimme nimittäin ottaa käyttöön nimiavaruuksien käsitteen. Tämä vie organisaation askeleen pidemmälle ja voi maksaa osinkoja isommille projekteille.
Joten tässä on katsaus, miten tämä toimii nykyisessä projektissamme.
Prototyyppi Koodiin: Nimiavaruudet
Olen käsitellyt nimiavaruuksia perusteellisesti aiemmissa viesteissä. Jos et ole lukenut, suosittelen. Palaa sitten takaisin ja katso postauksen loppuosa.
Jos päätät ohittaa artikkelin, tässä on lyhyt määritelmä nimiavaruudesta :
Nimiavaruudet on suunniteltu ratkaisemaan kaksi ongelmaa, joita kirjastojen ja sovellusten tekijät kohtaavat luodessaan uudelleenkäytettäviä koodielementtejä, kuten luokkia tai toimintoja…
Ja yleinen ajatus on, että järjestämme tunnit niiden loogisen suhteen perusteella.
Lisäksi järjestämme tiedostot hakemistoihin, jotka vastaavat nimiavaruutta. Tätä ei tarvitse tehdä, mutta mielestäni se auttaa, jos luokat järjestetään loogisesti levylle samalla tavalla kuin ne ovat virtuaalisesti järjestetty nimiavaruudessa.
Järjestetään tiedostot tämän jälkeen.
Tiedostojen järjestäminen
Sen sijaan, että aloittaisit päälaajennustiedostosta, aloitetaan järjestämällä tiedostomme ensin.
- Meta Box- ja Meta Box Display -tiedostot sijaitsevat Display -nimisessä hakemistossa. Tämä on täysin mielivaltaista, mutta koska nämä tiedostot tekevät niin, näyttää järkevältä, että ne sijaitsevat siellä.
- Voimme myös sijoittaa viesti-description.php- ja no-post-list.php- tiedostot kyseiseen hakemistoon, mutta sijoitetaan ne Views -nimiseen alihakemistoon. Haluat ehkä kutsua tätä malliksi tai osittaiseksi tai vastaavaksi.
- Seuraavaksi meillä on luokat, jotka vastaavat tietokannan kyselyistä ja luokka, joka vastaa viestinnän koordinoinnista. Laitetaan jokainen näistä Utilityyn. Tietysti he voisivat mennä muihin paikkoihin, mutta muista, että tarkoitus on esitellä, kuinka nimiavaruuksia käytetään. Joten jos olet niin halukas, voit muokata tiedostojasi mielesi mukaan.
Jos olet noudattanut yllä olevia ohjeita, sinulla pitäisi olla hakemistorakenne, joka näyttää suunnilleen tältä:
Yksi tapa järjestää tiedostot.
Nyt on aika määritellä nimiavaruudet jokaiselle luokalle. Koska olemme järjestäneet ne kaikki hakemistoihinsa, nimitilan määrittäminen on helppoa; On kuitenkin tärkeää ymmärtää, että meidän on käytettävä use – avainsanaa, kun käytämme muissa nimiavaruuksissa sijaitsevia luokkia.
Käydään läpi jokainen tiedostomme alkaen Utilityn tiedostoista. Aloitamme ensin Post Messengerillä :
<?php
/**
* Display content for the meta box when requested.
*
* @author Tom McFarlin
* @since 0.2.0
*/
namespace McFarlinTRPUtility;
use McFarlinTRPUtilityPost_Query;
/**
* Retrieves information from the class responsible for querying the database and
* renders it in the context of our meta box when called via the Meta Box Display.
*
* @author Tom McFarlin
* @since 0.2.0
*/
class Post_Messenger {
// Snip for brevity.
}
Huomaat, että tiedoston nimiavaruus näkyy otsikossa yhdessä ilmoituksen kanssa luomamme Post Query -luokan käyttämisestä. Olen lisännyt luokan nimen nimiavaruuden loppuun, joten minun ei tarvitse käyttää sitä koko koodikannassa.
Huomaa, että rakentaja näyttää nyt tältä :
<?php
/**
* Instantiates the class by setting a reference to the query.
*
* @param string $plugin_dir The path to the root of the plugin directory.
*/
public function __construct( $plugin_dir) {
$this->query = new Post_Query();
$this->plugin_dir = trailingslashit( $plugin_dir );
}
Olen lisännyt $plugin_dir- argumentin, koska meidän on käytettävä sitä näyttääksemme kyselyn tulokset oikein. Ja koska ne sijaitsevat nyt sovelluksen eri alueella, toiminnot näyttävät tältä :
<?php
/**
* Displays the description of the content of the meta box.
*
* @access private
*/
private function get_post_message() {
include_once $this->plugin_dir. 'Display/Views/post-list.php';
}
/**
* Displays the description of the content of the meta box.
*
* @access private
*/
private function get_description() {
include_once $this->plugin_dir. 'Display/Views/message-description.php';
}
/**
* Displays a message of there are no recent posts.
*
* @access private
*/
private function get_no_posts_message() {
include_once $this->plugin_dir. 'Display/Views/no-post-list.php';
}
Katsotaan seuraavaksi Post Query -luokkaa. Mikään ei ole muuttunut tässä luokassa, paitsi että olemme antaneet sille nimitilan, ja olemme myös päivittäneet kyselyä vain vetääksemme takaisin kolme viestiä (tämän kommentin mukaisesti ).
<?php
namespace McFarlinTRPUtility;
/**
* Queries the database for three most recent posts. Returns the query to the
* caller so that it can be interrogates for posts or not.
*
* @author Tom McFarlin
* @since 0.2.0
*/
class Post_Query {
// Snip for brevity.
private function get_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'desc',
);
$this->query = new WP_Query( $args );
return $this->query;
}
}
Huomaa koodissa, että olen myös esikorjannut WP_Queryn kauttaviivalla, koska se on osa globaalia nimiavaruutta.
Siirrytään Display – hakemistoon ja katsotaan Meta Box -luokkaa. Tälle on myös annettu nimiavaruus ja se käyttää myös Meta Box Display -luokan täyttä nimeä, jota tarkastelemme hetken kuluttua.
<?php
namespace McFarlinTRPDisplay;
use McFarlinTRPDisplayMeta_Box_Display;
/**
* Registers the Meta Box with WordPress. Defines the ID, title, display function,
* and the post type on which it will live.
*
* @author Tom McFarlin
* @since 0.2.0
*/
class Meta_Box {
/**
* A reference to the class that will display the contents in the meta box.
*
* @access private
* @var Meta_Box_Display
*/
private $meta_box_display;
/**
* Instantiates the class by setting its property equal to a reference to its display.
*
* @param string $plugin_dir A reference to the root of the plugin's directory.
*/
public function __construct( $plugin_dir) {
$this->meta_box_display = new Meta_Box_Display( $plugin_dir );
}
// Snip for brevity.
}
Huomaa, että tämä rakentaja hyväksyy myös lisäosien hakemiston argumenttina ja välittää sen myös Meta Box Display -luokkaan. Tämä tarkoittaa, että viestien näyttämisestä vastaavat toiminnot löytyvät oikein paikaltaan Näkymät – hakemistosta.
Lopuksi tarkastellaan Meta Box Display -luokkaa. Tämä on yksinkertainen luokka, joka sisältää nimitilan ja viittaukset Post Messengeriin, jota olemme tarkastaneet edellä.
<?php
/**
* Defines the display for the meta box.
*
* @author Tom McFarlin
* @since 0.2.0
*/
namespace McFarlinTRPDisplay;
use McFarlinTRPUtilityPost_Messenger;
/**
* Defines the display for the meta box that will render the content in the
* context of its meta box.
*
* @author Tom McFarlin
* @since 0.2.0
*/
class Meta_Box_Display {
/**
* A reference to the class that will display the contents in the meta box.
*
* @access private
* @var Post_Messenger
*/
private $messenger;
/**
* Instantiates the object by setting a property equal to that of the class
* responsible for rendering the messages from the post query.
*
* @param string $plugin_dir A reference to the root of the plugin's directory.
*/
public function __construct( $plugin_dir) {
$this->messenger = new Post_Messenger( $plugin_dir );
}
/**
* If there are posts to display, renders them in the metabox. Otherwise, displays
* a note that there are no posts to display.
*/
public function display() {
$this->messenger->get_message();
}
}
Tässä vaiheessa olemme saavuttaneet täyden ympyrän laajennuksen kautta. Yhdellä poikkeuksella: Bootstrap-tiedosto. Olemme lisänneet siihen nimitilan, ja meidän on päivitettävä tapa , jolla se ilmennetään :
<?php
namespace McFarlinTRP;
use McFarlinTRPDisplayMeta_Box;
include 'Display/class-meta-box.php';
include 'Display/class-meta-box-display.php';
include 'Utility/class-post-messenger.php';
include 'Utility/class-post-query.php';
add_action( 'add_meta_boxes', __NAMESPACE__. 'trp_start' );
/**
* Starts the plugin.
*/
function trp_start() {
$meta_box = new Meta_Box( dirname( __FILE__) );
$meta_box->init();
}
Meillä on nimittäin:
- määritteli nimiavaruuden,
- mainitse Meta Box -luokan sijainti,
- päivitti polut sisältämään tiedostojen löytämisen (mikä voidaan viime kädessä tehdä automaattilatauksella),
- ja päivitti add_action- kutsun.
Tässä on lisätoimintokutsu: Koska WordPressin on löydettävä tämä funktio ja funktio sijaitsee nimiavaruudessa, funktion täydellinen nimi on tunnistettava, jotta WordPress voi kutsua sen. Tästä syystä funktion nimessä tarvitaan NAMESPACE.
Nyt olemme järjestäytyneet (yhtä poikkeusta lukuun ottamatta)
Kuten huomaat, nimitilat ja niitä vastaavat hakemistot lisäävät projektiin paljon organisointia. Sitä on helpompi seurata, helpompi ymmärtää, missä asiat menevät (sekä olemassa oleville että uusille tiedostoille). Ja se antaa vähemmän tunnetta, kun keräät useita tiedostoja yhteen paikkaan.
Vaikka luokka olisikin hieman monoliitti, se voidaan silti järjestää niin, että ylläpito on helppoa.
Tässä lisäyksessä on kuitenkin vielä jotain, mitä muutan: Pluginin hakemiston kiertäminen tällä tavalla ei auta heikentyneessä koheesiossa ja se yhdistää luokat tiiviimmin yhteen, koska bootstrap-tiedoston on välitettävä arvo yksi luokka, joka siirtää sen toiseen luokkaan, joka käyttää sitä tiedostojen lataamiseen ja niin edelleen.
Onko siis olemassa keinoja korjata tämä? Ehdottomasti. Ja ehkä tarkastelemme sitä viimeisessä viestissä.
Muista siihen asti, että laajennuksen uusin versio on saatavilla päähaarassa, joka on merkitty 0.3.0:ksi, GitHubissa.