Yksi niistä asioista, joista ohjelmoijat usein puhuvat, on halu jakaa ohjelmat pienempiin komponentteihin tai toimintoihin, jotta ne olisi helpompi jäljittää, lukea ja virheenkorjaus helpottaa.
Mutta ei ole kovinkaan harvinaista nähdä monoliittisia toimintoja, joissa on paljon koodikommentteja, jotka auttavat selittämään, mitä ohjelmassa tapahtuu.
En tyrmää tätä, koska en tiedä rajoituksia, joiden alla ohjelmoija työskenteli. Tuo on:
- Mikä oli hänen budjettinsa ohjelmaa rakentaessaan?
- Kuinka paljon aikaa hankkeen loppuun saattamiseen annettiin?
- Oliko projektin parissa paljon ihmisiä?
- Annettiinko ohjelmoijalle aikaa kirjoittaa koodi, jotta he voisivat testata sen, muuttaa sen uudelleen tai vain helpottaa sen lukemista?
Lyhyesti sanottuna, uskon, että on monia syitä siihen, että voimme lukea "huonoa koodia", eikä sen aina tarvitse olla ohjelmoijan vika (se on vain luonnollisin asia, joka meidän täytyy heittää pois lukiessamme josta emme pidä).
Tarkoittaako tämä kuitenkin sitä, että meidän ei pitäisi pyrkiä refaktoimaan tai kirjoittamaan koodia tavalla, joka helpottaa sen ymmärtämistä? Ei tietenkään. Olettaen, että meillä on aikaa tehdä niin, miten voisimme tehdä sen?
Purkaa ohjelmat pienempiin osiin
Kirjoittaminen tällaisesta aiheesta voi olla haaste, etenkin taloudessa, joka on yhtä aktiivinen kuin WordPressin verkkokauppa.
"Ollaan tarkkoja, Bob."
Toisin sanoen voin kirjoittaa siitä erittäin yksityiskohtaisesti käyttämällä laajennussarjaa, tarkastelemalla tietoja, analysoimalla kyselyitä ja osoittamalla, kuinka se tehdään. Tai voin kirjoittaa siitä hieman korkeammalla tasolla perimmäisenä tavoitteena näyttää, kuinka ohjelmat jaetaan pienempiin osiin.
Koska edellinen voidaan saavuttaa niin monella tavalla, valitsen jälkimmäisen. Tämä tarkoittaa, että tämä ei välttämättä käytä mitään tiettyjä laajennuksia ovat suoria kyselyitä. Se käyttää kuitenkin korkean tason esimerkkejä, jotka auttavat sinua käymään läpi sarjan kyselyitä ja silmukoita ja jakamaan ne pienempiin funktioihin.
Yleinen esimerkki
Oletetaan esimerkiksi, että työskentelen WordPress-laajennuksen ominaisuuden parissa, jonka perimmäinen tarkoitus on noutaa kaikki käyttäjän tallentamat eri maksutavat, jotka liittyvät hänen tiliinsä.
Haasteena on, että nämä tiedot ovat hajallaan useissa tietokantataulukoissa (käytettävien eri lisäosien takia), joten on joitain kyselyjä, jotka on suoritettava ja sitten haettava.
Tällaisten kyselyjen tekemisen vaiheet voivat mennä suunnilleen näin:
- saada nykyisen käyttäjän asiakastunnus,
- saada kaikki asiakkaan tilaustunnusnumerot
- määrittää, mitä maksutapoja kullekin tilaukselle käytettiin
- noutaa mainitut maksutavat ja lähettää sitten asiakkaalle valmistajan tiedot
Riippuen siitä, miten tietokanta on määritetty, riippuen SQL-taitosi tasosta ja sen mukaan, kuinka kaikki edellä mainitut tiedot käsittelevät eri laajennukset toimivat samanaikaisesti, voi olla helppoa kirjoittaa yksi suuri kysely näiden tietojen hakemiseksi.
Mutta jos olet työskennellyt verkkokaupan kanssa WordPressissä ja useissa laajennuksissa, tiedät, että se ei aina ole niin helppoa.
Sen sijaan katsot jotain, kuten:
- meidän on saatava asiakkaan profiili käyttäjän metatiedoista,
- meidän on löydettävä kaikki käyttäjän tekemät tilaukset, ja tämä voi usein liittyä viestiin tai viestin metatietotaulukkoon,
- maksutavat voidaan hyvin todennäköisesti tallentaa niiden taulukkoon, joka liittyy käyttäjään jonkin tyyppisen tunnuksen kautta,
- yllä oleva tunnus sijaitsee taulukossa ja liittyy tiettyyn tietoon toisessa taulukossa, josta sinun on sitten päätettävä tarkastelemalla kaikkialla tietokannassa olevia tietoja.
Viime kädessä sinun on luotava joukko kyselyitä vain ymmärtämällä ensin, kuinka etsimäsi tiedot tehdään. Se on riittävän haastavaa sellaisenaan. Mutta kun saat sen aikaan, oletetaan, että kirjoitat kyselysi peräkkäin ja käytät sitten kunkin tuloksia päästäksesi haluttuun tulokseen.
Tästä voi seurata jotain tällaista :
<?php
// First, read the user ID and meta value to get authorization information
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
user_id, meta_value
FROM $wpdb->usermeta
WHERE meta_key LIKE %s
AND user_id = %d
",
'%customer_profile_id%',
filter_input(INPUT_GET, 'customer_id')
),
ARRAY_A
);
$result = isset($results[0])? array_column($results[0], 'meta_value'): [];
if (empty($result)) {
return $result;
}
// Get the ID of the current customer.
$customers = $wpdb->get_results(
$wpdb->prepare(
"", // Your custom query goes here.
filter_input(INPUT_GET, 'customer_id')
),
ARRAY_A
);
$customer = isset($customers[0])? array_column($customers[0], 'customer_id'): [];
if (empty($customer)) {
return $customer;
}
// Get all of the order IDs from the set of orders returned from the previous query.
$orderIds = $wpdb->get_results(
$wpdb->prepare(
"", // Your custom query goes here.
$customer
),
ARRAY_A
);
return $orderIds;
// Finally, get all of the payment methods for the orders based on their Ids.
$orders = [];
foreach ($orderIds as $orderId) {
$results = $wpdb->get_results(
$wpdb->prepare(
"" // The query for retrieving various payment method information based on the $orderId
),
ARRAY_A
);
if (empty($results)) {
continue;
}
$orders[$orderId] = $results;
}
// Now send the information back to the user.
wp_send_json_success($orders);
Mutta sen ei tarvitse olla näin.
Ensinnäkin nämä ovat kaikki itsenäisiä kyselyitä, joissa on riippumattomia tulosjoukkoja, vaikka niitä on käytettävä rinnakkain. Tämä tarkoittaa, että voimme hajottaa ne osiin ja arvioida kunkin tulokset ennen kuin siirrymme seuraavaan vaiheeseen.
Lisäksi sen avulla voimme kirjoittaa pienempiä, yhtenäisempiä funktioita. Vaikka ne saattavat riippua toisistaan, voimme asettaa jokaisen funktion hyväksymään argumentin (tai joukon argumentteja, joista voimme hakea kaikki tiedot.
Ehkä lopputulos näyttää tältä :
<?php
public function getPaymentMethods()
{
$authInfo = $this->getAuthorizationInformation();
$currentCustomerId = $this->getCurrentCustomerId($authInfo);
$orders = $this->getCustomerOrders($currentCustomerId);
$paymentMethods = $this->getPaymentMethodsFromOrders($orders);
wp_send_json_success($orders);
}
private function getAuthorizationInformation()
{
global $wpdb;
$authInfo = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
user_id, meta_value
FROM $wpdb->usermeta
WHERE meta_key LIKE %s
AND user_id = %d
",
'%customer_profile_id%',
filter_input(INPUT_GET, 'customer_id')
),
ARRAY_A
);
return isset($authInfo[0])? array_column($authInfo[0], 'meta_value'): [];
}
private function getCurrentCustomerIdFromAuthInfo($authInfo)
{
global $wpdb;
$customers = $wpdb->get_results(
$wpdb->prepare(
"", // Your custom query goes here.
$authInfo;
),
ARRAY_A
);
return isset($customerId[0])? array_column($customerId[0], 'meta_value'): [];
}
private function getCustomerOrders($customerId)
{
global $wpdb;
$orderIds = $wpdb->get_results(
$wpdb->prepare(
"", // Your custom query goes here.
$customerId
),
ARRAY_A
);
return empty($orderIds)? []: $orderIds;
}
private function getPaymentMethodsFromOrders($orderIds)
{
$paymentMethods = [];
foreach ($orderIds as $orderId) {
$results = $wpdb->get_results(
$wpdb->prepare(
"" // The query for retrieving various payment method information based on the $orderId
),
ARRAY_A
);
if (empty($results)) {
continue;
}
$paymentMethods[$orderId] = $results;
}
return $paymentMethods;
}
En tietenkään voi näyttää varsinaista SQL:ää – no, en ainakaan kaikkialla – koska en tunne yleistä asetuksia enkä tiedä tarkalleen, mitä laajennuksia tai skeemoja se on, joiden kanssa työskentelet.
Mutta se ei ole koskaan ollut tämän postauksen tarkoitus.
Sen sijaan perimmäinen pointti, jonka yritän välittää, on tämä: Vaikka saatamme työskennellä erittäin rajoitetuissa rajoituksissa, voimme silti jakaa ohjelmia pienempiin osiin, jotka auttavat meitä kuvailemaan, mitä tapahtuu, ymmärtämään, miten se tehdään, ja sitten lähettämään tietoja. edestakaisin eri toimintojen välillä ja käyttäjälle ja takaisin.