Programozás: A „Yoda Feltételek”

A WPCS, vagyis a WordPress fejlesztéséhez közösségileg elfogadott kódszabvány jelenleg előírja az úgynevezett Yoda kondíciók használatát. Több alkalommal is felmerült már ennek a szabálynak a módosítása vagy eltörlése, és most a végleges döntés előkészítésekor újra felhevült vita a fejlesztők körében, hogy kell-e változtatni, vagy sem.

Mik azok a Yoda feltételek?

Yoda feltételekről akkor beszélünk, amikor egy if kondícióban a két összehasonlítandó elemet felcseréljük, például:

if ( 'red' == $color ) {

Mivel a felcserélt szórend hasonlít a Star Wars filmekből ismert Yoda furcsa beszédmódjára (legalábbis az eredeti, angol nyelvűre), ezért nevezték el ezt a technikát Yoda feltételnek.

Magyar nyelven a Yoda név több ok miatt sem illik erre úgy, mint angolul: egyrészt a magyar szórend szabadabb jellegéből adódóan kevésbé hat idegennek a felcserélt sorrend, másrészt a Csillagok Háborúja magyar szinkronja teljes mértékben figyelmen kívül hagyja Yoda szövegeinek rendhagyó nyelvtanát.

Mire jók a Yoda feltételek?

A Yoda feltételek fő célja, hogy kiküszöböljön egy konkrét programozói hibát, mégpedig azt, amikor összevetés helyett egy változóhoz véletlenül hozzárendelünk egy értéket. Ez akkor fordul elő, ha kettő (vagy három) egyenlőségjel helyett csak egyet használunk egy if feltételben:

if ( $color = 'red' ) {

A fenti if blokk belsejében lévő kód mindig le fog futni, mivel a $color értékének ellenőrzése helyett itt a $color értékét változtatjuk red-re (ez az ún. „hozzárendelés feltételben”). Ráadásul, mivel ez érvényes kód, ezért az esetek többségében a PHP semmilyen hibaüzenetet nem fog kiírni, így könnyen észrevétlen maradhat a bug.

Ha hozzá vagyunk szokva, hogy mindig Yoda feltételeket használjunk, akkor a fenti, hibás feltételt így írnánk meg:

if ( 'red' = $color ) {

Ez viszont már nem érvényes kód, a PHP fatális hibát fog kiírni, és egyből észrevesszük a problémát.

Nagyjából ennyi a Yoda feltételek célja, ehhez viszont meg kell szokni ezt a technikát annyira, hogy automatikusan alkalmazzuk a kód írásakor.

A Yoda feltételek hátrányai

A Yoda feltételek használatának csak egy előnye van, de több hátrányt is fel tudunk sorolni:

Nehezebben olvasható kód

A Yoda feltételek nyilvánvaló hátránya az, hogy a kód olvashatósága romlik. Sok fejlesztő számára a megszokott sorrendtől való eltérés megakasztja a kód értelmezését, és ez hatványozottan igaz lehet a diszlexiától és más tanulási nehézségektől szenvedő programozók számára.

A kódot egyszer írják, de sokan-sokszor olvassák, ezért fontos, hogy könnyen olvasható kódot írjunk, ami lehetőleg leköveti az emberi nyelvek gondolatmenetét. Bár magyarul mind a „ha a szín piros”, mind a „ha piros a szín” helyes, angolul az „if red is the color” furcsának és helytelennek hat.

Bizonyos fejlesztők szerint hozzá lehet szoktatni magunkat a Yoda feltételekhez annyira, hogy ne is tűnjön fel, hogy más a sorrend, sőt, egyesek szerint még könnyebb is átlátni utána az összehasonlításokat. Mások szerint szerint viszont nem lehet megszokni, és nem is hajlandóak használni ezt a technikát a szoftvereikben (vagy esetleg használják, de utálják). Mind a két táborban vannak tapasztalt programozók, akik a WP core fejlesztésében is részt vettek.

Mindenesetre, ha hozzászokik az ember, akkor olyan esetekben is használni fogja, amikor nincs értelme, mert a „hozzárendelés feltételben” hiba nem is fordulhat elő. Például így:

if ( 'Luke Skywalker' === $this->getName() ) {

Ha a programozó túlzásba viszi a Yoda feltételek használatát, akkor előfordulhatnak ehhez hasonló eredmények is:

if ( 5 >= $count ) {

Bizonyára kevesen vitatnák, hogy egy ilyen összehasonlítás értelmezése bonyolultabb, mint a „hagyományos” $count <= 5 verzióé.

A Yoda feltételek feleslegessé váltak

A WordPress fejlesztésének első szakaszában, amikor ez az előírás és sok másik bekerült a WPCS-be, nem léteztek még megfelelő eszközök az említetthez hasonló hibák kiküszöbölésére. Ma már elérhetőek különböző IDE-k és statikus elemző eszközök, amik már a kód írása közben jelzik, ha hibát vétünk, és okafogyottá teszik a Yoda feltételek megkövetelését.

A WPCS egyébként több másik szabályt is tartalmaz, ami feleslegessé teszi a Yoda feltételeket. Egyrészt alapból tiltja a „hozzárendelés feltételben” alkalmazását. Másrészt előírja a „szigorú összehasonlítást” (strict comparison) – amikor lehetséges, mindig ezt kell alkalmazni, és ennek a szintaxisa a három egyenlőségjel:

if ( $color === 'red' ) {

A fejlesztőnek a kód írása közben mindenképpen el kell döntenie, hogy lehet-e szigorú összehasonlítást használni, vagy sem (három vagy kettő egyenlőségjelet használjon), és így valószínűleg el fogja kerülni azt, hogy véletlenül csak egy egyenlőségjelet írjon be.

Yoda feltételek a WordPress-ben

A WordPress programozási sztenderdje 15 évvel ezelőtt tette kötelezővé a Yoda feltételek használatát. Bár már abban az időben is voltak ellenérvei ezen technika használatának, manapság szinte csak azok maradtak.

A népszerű PHP-s szoftverek közül a WordPress-en kívül csak a Symfony keretrendszer kódszabványa írja elő a Yoda feltételek alkalmazását. Egy hasonló vita itt is lezajlott 2020-ban, és akkor úgy döntöttek, hogy marad az előírás.

A fejlesztők többsége ezzel szemben egyértelműen a Yoda feltételek ellen foglal állást. Elég megnézni a reakciók számát a Github vitaoldalon, ami a szabály eltörléséről szól: 36 helyeslő emoji, 2 elutasító. Egy programozó szavazást is indított a Twitteren, ennek az eredménye szintén a Yoda feltételek ellen szól: a válaszolók 32%-a Yoda-párti, 68%-a pedig ellenzi.

Egy másik fejlesztő megvizsgált 93 ezer WordPress plugint, hogy megtudja, mennyire elterjedt a Yoda feltételek használata a bővítmények világában. Az eredmény: a pluginoknak mindössze 12%-a alkalmazza ezt a technikát.

A WPCS Javascript-re vonatkozó szabályai nem teszik kötelezővé a Yoda feltételeket, de nem is tiltják őket – szimplán a fejlesztőre hagyják a döntést. Pedig JS-ben talán még van is létjogosultsága a Yoda feltételeknek. Vegyük például az alábbi feltételt:

if ( variable.equals( "value" ) ) {

Ha a variable értéke null, akkor ez a kód hibára fog futni. Ezzel szemben a „yodásított” változat hiba nélkül fog futni akkor is, ha a változó értéke null:

if ( "value".equals( variable ) ) {

Az előírás eltörléséről szóló Github vitaoldalt 3 évvel ezelőtt nyitották, de már korábban is felvetődött a kérdés a fejlesztők körében. Az elmúlt hetekben a Github oldalon látszólag konszenzus született, és készült egy poszt a make.wordpress.org oldalon ezzel kapcsolatban. Ezen poszt alatt újra fellángoltak a viták, amik jelenleg is folynak. Mivel a többség láthatóan ellenzi a Yoda feltételek használatát, az előírást szinte biztosan el fogják törölni a WPCS-ben, ám az még kérdéses, hogy teljesen be is fogják-e tiltani ezen technika használatát a jövőben.


A Szerzőről
Piller Balázs senior webfejlesztő, SEO specialista, és a WordPress szakértője. Számos sikeres projektben vett részt vezető fejlesztőként. Az általa írt kód jelenleg több mint 1 000 000 webhelyen fut.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.