WordPress ei ole minimalistinen arkkitehtuuri. Se ei ole tiukasti kapseloitu, dependency-injection -vetoinen moderni framework. Se on historiallinen, evolutiivinen järjestelmä, joka on rakennettu käytännöllisyyden, yhteensopivuuden ja joustavuuden ehdoilla.
Yksi tämän filosofian näkyvimmistä ilmentymistä on globaali tila.
Ja PHP-maailmassa globaali tila tarkoittaa usein yhtä asiaa:
$GLOBALS.
Monelle kehittäjälle globaalit muuttujat ovat punainen vaate. Toisille ne ovat välttämätön työkalu. WordPressissä ne ovat perustavanlaatuinen osa järjestelmän DNA:ta.
Kyse ei ole vain tyylistä.
Kyse on siitä, miten koko järjestelmä toimii.
Mitä globaali tila oikeastaan tarkoittaa?
Globaali tila tarkoittaa, että data on saatavilla kaikkialla runtime’n aikana.
Ei tarvitse:
-
välittää parametreja
-
injektoida riippuvuuksia
-
rakentaa objektiketjuja
Voit vain viitata muuttujaan.
WordPress käyttää tätä laajasti:
-
$wpdb
-
$wp_query
-
$post
-
$wp_rewrite
-
lukemattomat sisäiset rakenteet
Globaali tila on WordPressin koordinaatiomekanismi.
Historiallinen konteksti: miksi näin tehtiin?
WordPress syntyi aikana, jolloin PHP-sovellukset:
-
olivat proseduraalisia
-
eivät käyttäneet moderneja arkkitehtuurimalleja
-
priorisoivat yksinkertaisuutta
Globaalit muuttujat olivat normaali käytäntö.
WordPress ei ole “unohtanut” modernia arkkitehtuuria.
Se on rakennettu eri aikakaudella eri prioriteeteilla.
Käytännöllisyys voitti puhtauden
Globaalit muuttujat mahdollistivat:
-
yksinkertaisen API:n
-
helpon plugin-kehityksen
-
matalan oppimiskynnyksen
Lisäosan ei tarvitse rakentaa monimutkaista dependency graphia.
Riittää:
global $wpdb;
Ja maailma avautuu.
Globaali tila ja WordPressin joustavuus
Globaali tila tekee WordPressistä poikkeuksellisen joustavan.
Lisäosa voi:
-
lukea queryn tilan
-
muokata globaaleja rakenteita
-
vaikuttaa renderöintiin
-
tehdä interventioita missä tahansa vaiheessa
WordPress ei ole suljettu järjestelmä.
Se on avoin runtime-ekosysteemi.
Globaalit muuttujat ovat tämän avoimuuden infrastruktuuri.
Sivuvaikutukset: missä ongelmat syntyvät?
Globaalit muuttujat eivät ole ilmaisia.
Niiden hinta on sivuvaikutukset.
Sivuvaikutus tarkoittaa, että koodi:
-
muuttaa tilaa
-
joka vaikuttaa muualla
-
usein implisiittisesti
Ja globaalissa tilassa “muualla” tarkoittaa käytännössä kaikkialla.
Ennustettavuuden rapautuminen
Kun mikä tahansa koodi voi muuttaa globaalia tilaa:
-
järjestelmän käyttäytyminen muuttuu kontekstisidonnaiseksi
-
debuggaus vaikeutuu
-
syy-seuraussuhteet hämärtyvät
Bugia ei synny yhdestä rivistä.
Se syntyy interaktioista.
$post: globaali muuttuja, globaali kaaos
$post on täydellinen esimerkki.
Loopissa:
-
WordPress asettaa globaalin $post-objektin
-
template-tagit lukevat sitä
-
funktiot olettavat sen olemassaolon
Jos lisäosa muuttaa $postia:
-
vaikutus leviää kaikkialle template-logiikkaan
Koodi näyttää harmittomalta.
Vaikutus voi olla systeeminen.
Klassinen bugikategoria
Custom query ilman wp_reset_postdata().
$post jää väärään tilaan.
Template-logiikka alkaa käyttäytyä “satunnaisesti”.
Ei satunnaista.
Globaali tila on korruptoitunut.
Globaali tila ja debuggaus
Globaalin tilan ongelma ei ole vain virheet.
Se on virheiden luonne.
Globaalit bugit ovat:
-
epälineaarisia
-
kontekstisidonnaisia
-
emergenttejä
Virhe ei ole siellä missä oire näkyy.
Virhe on siellä missä tila muuttui.
Ja tila saattoi muuttua kymmenen funktiokutsua aiemmin.
Temporal coupling: ajallinen riippuvuus
Globaalit muuttujat synnyttävät ajallista riippuvuutta.
Koodi olettaa:
“Globaali tila on tässä muodossa juuri nyt.”
Jos suoritusjärjestys muuttuu:
-
tila muuttuu
-
logiikka hajoaa
Hooks-järjestelmä + globaali tila = erittäin herkkä dynamiikka.
Plugin-ekosysteemi ja emergenssi
WordPress ei ole yksi sovellus.
Se on:
-
core
-
teema
-
lisäosat
-
hookit
-
globaalit rakenteet
Lisäosa A muuttaa globaalia muuttujaa.
Lisäosa B olettaa sen alkuperäisen tilan.
Lisäosa C muuttaa sen uudelleen.
Lopputulos:
Käyttäytyminen, jota kukaan ei eksplisiittisesti suunnitellut.
Emergenssi ei ole bugi.
Se on arkkitehtuurin luonnollinen seuraus.
Globaali tila vs moderni arkkitehtuuri
Modernit frameworkit suosivat:
-
kapselointia
-
dependency injectionia
-
eksplisiittisiä rajapintoja
WordPress suosii:
-
globaalia saatavuutta
-
runtime-muokattavuutta
-
joustavuutta
Toinen malli ei ole “väärä”.
Ne ratkaisevat eri ongelmia.
WordPress optimoi laajennettavuutta, ei arkkitehtuurista puhtautta.
Testattavuus: globaalin tilan klassinen uhri
Globaalit muuttujat vaikeuttavat testattavuutta.
Testit suosivat:
-
eristettyjä komponentteja
-
ennustettavaa tilaa
-
kontrolloitavia riippuvuuksia
Globaali tila:
-
on jaettu
-
voi muuttua odottamatta
-
vaikea mockata
WordPress-testauksessa tämä näkyy jatkuvasti.
Muistinhallinta ja globaalit muuttujat
Globaali viittaus = objekti pysyy muistissa.
Pitkissä prosesseissa:
-
WP-CLI
-
batch-ajot
-
importit
globaalit rakenteet voivat kasvattaa muistifootprintia.
Ei klassinen muistivuoto.
Mutta muistinkäytön kertymä.
Globaali tila ja turvallisuus
Globaalit muuttujat eivät ole suora tietoturva-aukko.
Mutta ne voivat:
-
lisätä kompleksisuutta
-
synnyttää epäselviä tilasiirtymiä
-
vaikeuttaa reasoningia
Turvallisuus ei hajoa vain virheistä.
Se hajoaa epäselvästä logiikasta.
Miksi WordPress ei “korjaa” tätä?
Koska kyse ei ole bugista.
Se on design-päätös.
Globaalit muuttujat mahdollistavat:
-
plugin-ekosysteemin
-
backward compatibilityn
-
matalan oppimiskynnyksen
Täydellinen modernisointi rikkoisi valtavan määrän koodia.
WordPress on evolutiivinen järjestelmä, ei vallankumouksellinen.
Kypsä strategia: globaalin tilan kanssa eläminen
Realistinen lähestymistapa ei ole:
“Globaalit muuttujat ovat pahoja.”
Realistinen lähestymistapa on:
“Globaalit muuttujat ovat osa WordPressin fysiikkaa.”
Kypsä kehittäjä:
-
minimoi globaalin tilan manipuloinnin
-
resetoi tilan oikein
-
ymmärtää sivuvaikutukset
-
välttää implisiittisiä oletuksia
Globaali tila ei ole virhe.
Se on voima, jota täytyy käsitellä varoen.
Filosofinen ydin
Globaalit muuttujat ovat kuin jaettu todellisuus.
Kaikki voivat nähdä sen.
Kaikki voivat muuttaa sen.
Kukaan ei täysin hallitse sitä.
WordPress ei ole suljettu kone.
Se on ekosysteemi.
Ja ekosysteemeissä jaettu tila synnyttää emergenssiä, sivuvaikutuksia ja toisinaan kaaosta.
Mutta myös poikkeuksellista joustavuutta.
Lopuksi: globaali tila ei ole vihollinen
Globaali tila ei ole WordPressin arkkitehtuurinen virhe.
Se on kompromissi.
Se ostaa:
-
joustavuutta
-
laajennettavuutta
-
yksinkertaisuutta
Ja maksaa:
-
ennustettavuudella
-
kapseloinnilla
-
testattavuudella
Hyvä WordPress-kehitys ei yritä paeta tätä todellisuutta.
Se oppii navigoimaan siinä.
Koska lopulta WordPress ei ole laboratorioarkkitehtuuri.
Se on käytännön internetin evolutiivinen organismi.
