weak typing (tsz. weak typings)
Ez lehet kényelmes is (gyors kódírásnál), de veszélyes is, mert rejtett típushibákat, furcsa viselkedést okozhat.
Ahogy a strong typing-nél is láttuk, a típusosság két független dimenzióban vizsgálható:
Dimenzió | Skála |
---|---|
Típusellenőrzés ideje | statikus — dinamikus |
Típusellenőrzés szigorúsága | erős (strong) — gyenge (weak) |
Weak typing tehát arra utal, hogy a nyelv nem ragaszkodik szigorúan a típusokhoz, sokféle keverést automatikusan megenged.
A weak typing legismertebb példái közé tartozik a JavaScript. Nézzünk konkrét példákat!
console.log("5" + 3); // "53" --> String lesz
A JavaScript a +
operátornál automatikusan eldönti: ha az egyik operandus string, akkor a másikat is stringgé alakítja.
console.log("5" - 3); // 2 --> Szám lesz!
console.log("5" * 3); // 15 --> Szám lesz!
Itt a -
és *
operátor miatt a string "5"
automatikusan számmá (Number
) konvertálódik.
console.log(Boolean("")); // false
console.log(Boolean("hello")); // true
console.log(Boolean(0)); // false
console.log(Boolean(123)); // true
A JavaScript automatikusan értelmezi, hogy mely típusok “igazak” vagy “hamisak”.
A C nyelv is weak typing bizonyos szempontból.
int x = 10;
float y = x; // automatikus konverzió
Itt az int
automatikusan float
-tá konvertálódik.
Még veszélyesebb példa:
void* p = malloc(10);
int* q = (int*)p;
Itt a void*
és int*
közötti konverzió explicit ugyan, de C-ben teljesen szabadon megtehető — erősen típusos nyelvekben ilyet nem lehetne megtenni vagy csak szigorú szabályokkal.
A PHP is nagyon gyengén típusos nyelv.
echo "5" + 10; // 15
echo "5 apples" + 10; // 15 (warning mellett)
PHP automatikusan próbál számot kinyerni a sztring elejéből.
if ("0") {
echo "TRUE";
} else {
echo "FALSE";
}
// Kiírja: TRUE
Itt a "0"
string igaznak számít a PHP-ban, ami sok hibához vezethet.
Miért lehet hasznos a gyenge típusosság?
A weak typing legfőbb hátránya az, hogy könnyen rejtett hibákhoz vezet.
console.log( + {}); // ""
console.log({} + ); // 0
Itt nem intuitív az eredmény, mert az operandusok automatikus konverzión mennek keresztül.
if ("0") {
console.log("true"); // true, pedig "0" vizuálisan hamisnak tűnhet
}
Ez tipikus forrása a JavaScript bugoknak.
console.log(0 == "0"); // true
console.log(false == "0"); // true
console.log(false == ); // true
A ==
operátor automatikusan konvertál típusokat, ami néha abszurd eredményeket ad.
A ===
(strict equality) operátort ajánlott inkább használni, ami nem végez automatikus konverziót.
console.log(0 === "0"); // false
Tulajdonság | Strong typing | Weak typing |
---|---|---|
Típuskonverzió | Csak explicit | Gyakran implicit |
Hibák észlelése | Inkább fordítási időben | Futási időben, néha rejtve |
Típusbiztonság | Nagy | Alacsony |
Fejlesztési sebesség | Lassabb | Gyorsabb |
Kód olvashatósága | Jobb | Rosszabb lehet |
Hibakeresés (debug) | Könnyebb | Néha nagyon nehéz |
Használat típusa | Nagy rendszerek | Kis scriptek, prototípusok |
Nyelv | Statikus/dinamikus | Erős/gyenge típusosság |
---|---|---|
C | Statikus | Gyenge |
C++ | Statikus | Vegyes (gyenge alapon) |
Java | Statikus | Erős |
C# | Statikus | Erős |
Python | Dinamikus | Erős |
JavaScript | Dinamikus | Gyenge |
PHP | Dinamikus | Gyenge |
Ruby | Dinamikus | Erős |
Go | Statikus | Erős |
Rust | Statikus | Erős |