Fedezze fel a React experimental_useMemoCacheInvalidation-t, egy hatĂ©kony eszközt a memoizáciĂł finomszemcsĂ©s vezĂ©rlĂ©sĂ©hez. Tanuljon meg teljesĂtmĂ©nyt optimalizálni.
A React experimental_useMemoCacheInvalidation elsajátĂtása: MĂ©lyrehatĂł elemzĂ©s a memo-gyorsĂtĂłtár vezĂ©rlĂ©sĂ©rĹ‘l
A React, a felhasználĂłi felĂĽletek Ă©pĂtĂ©sĂ©hez szĂ©les körben alkalmazott JavaScript könyvtár, folyamatosan fejlĹ‘dik, hogy a fejlesztĹ‘k a szĂĽksĂ©ges eszközöket biztosĂtsák a teljesĂtmĂ©ny- Ă©s karbantarthatĂł alkalmazások lĂ©trehozásához. Az egyik ilyen evolĂşciĂł, jelenleg a kĂsĂ©rleti fázisban, az experimental_useMemoCacheInvalidation. Ez a hatĂ©kony horog granuláris vezĂ©rlĂ©st kĂnál a memoizáciĂł felett, lehetĹ‘vĂ© tĂ©ve a fejlesztĹ‘k számára a teljesĂtmĂ©ny finomhangolását Ă©s a gyorsĂtĂłtár Ă©rvĂ©nytelenĂtĂ©si stratĂ©giák nagyobb pontossággal törtĂ©nĹ‘ kezelĂ©sĂ©t. Ez a blogbejegyzĂ©s elmĂ©lyĂĽl az experimental_useMemoCacheInvalidation bonyodalmaiba, átfogĂł ismereteket nyĂşjtva kĂ©pessĂ©geirĹ‘l Ă©s gyakorlati alkalmazásairĂłl, a React fejlesztĹ‘k globális közönsĂ©gĂ©nek.
A memoizáció szükségességének megértése
MielĹ‘tt belemerĂĽlnĂ©nk az experimental_useMemoCacheInvalidation-be, elengedhetetlen a memoizáciĂł alapvetĹ‘ fogalmának megĂ©rtĂ©se, Ă©s annak, hogy miĂ©rt elengedhetetlen a React alkalmazásokhoz. A memoizáciĂł egy optimalizálási technika, amely magában foglalja a drága fĂĽggvĂ©nyhĂvások eredmĂ©nyeinek gyorsĂtĂłtárazását, Ă©s azok Ăşjrafelhasználását, amikor ugyanazok a bemenetek ismĂ©t megjelennek. Ez megakadályozza a redundáns számĂtásokat, Ă©s jelentĹ‘sen javĂtja a teljesĂtmĂ©nyt, kĂĽlönösen összetett számĂtások vagy adatlekĂ©rĂ©si műveletek esetĂ©n.
A Reactban a memoizáciĂłt elsĹ‘sorban a useMemo Ă©s a React.memo (funkcionális Ă©s osztálykomponensekhez) használatával Ă©rjĂĽk el. Ezek az eszközök lehetĹ‘vĂ© teszik a fejlesztĹ‘k számára, hogy utasĂtsák a Reactot a komponensek Ăşjrarajzolására vagy az Ă©rtĂ©kek ĂşjraszámĂtására, csak akkor, ha a fĂĽggĹ‘sĂ©geik megváltoznak. Azonban az összetett alkalmazásokban a fĂĽggĹ‘sĂ©gek hatĂ©kony kezelĂ©se Ă©s a pontos gyorsĂtĂłtár-Ă©rvĂ©nytelenĂtĂ©s biztosĂtása kihĂvássá válhat. Itt lĂ©p a kĂ©pbe az experimental_useMemoCacheInvalidation.
Az experimental_useMemoCacheInvalidation bemutatása
Az experimental_useMemoCacheInvalidation egy React horog, amelyet a memoizáciĂł explicitabb vezĂ©rlĂ©sĂ©re terveztek. LehetĹ‘vĂ© teszi a fejlesztĹ‘k számára, hogy meghatározzák azokat a konkrĂ©t feltĂ©teleket, amelyek mellett egy memoizált Ă©rtĂ©ket Ă©rvĂ©nytelenĂteni kell, ahelyett, hogy kizárĂłlag a fĂĽggĹ‘sĂ©gi tömbökre támaszkodnának. Ez a finomabb szintű vezĂ©rlĂ©s hatĂ©konyabb gyorsĂtĂłtár-kezelĂ©st tesz lehetĹ‘vĂ©, Ă©s bizonyos forgatĂłkönyvekben jelentĹ‘s teljesĂtmĂ©nyjavuláshoz vezethet.
Az experimental_useMemoCacheInvalidation főbb jellemzői:
- Explicit Ă©rvĂ©nytelenĂtĂ©s: A
useMemo-val ellentĂ©tben, amely automatikusan Ă©rvĂ©nytelenĂti a gyorsĂtĂłtárazott Ă©rtĂ©ket a fĂĽggĹ‘sĂ©gek változásakor, azexperimental_useMemoCacheInvalidationlehetĹ‘vĂ© teszi az Ă©rvĂ©nytelenĂtĂ©sre vonatkozĂł konkrĂ©t kritĂ©riumok meghatározását. - FinomszemcsĂ©s vezĂ©rlĂ©s: EgyĂ©ni logikát határozhat meg annak meghatározásához, hogy mikor kell ĂşjraszámĂtani a gyorsĂtĂłtárazott Ă©rtĂ©ket. Ez kĂĽlönösen hasznos összetett adatszerkezetekkel vagy állapotváltozásokkal valĂł foglalkozáskor.
- JavĂtott teljesĂtmĂ©ny: A gyorsĂtĂłtár-Ă©rvĂ©nytelenĂtĂ©si folyamat vezĂ©rlĂ©sĂ©vel optimalizálhatja alkalmazása teljesĂtmĂ©nyĂ©t, csökkentve a felesleges Ăşjrarajzolásokat Ă©s számĂtásokat.
MegjegyzĂ©s: Ahogy a neve is sugallja, az experimental_useMemoCacheInvalidation mĂ©g kĂsĂ©rleti fázisban van. Az API Ă©s a viselkedĂ©s a jövĹ‘beli React kiadásokban változhat. Elengedhetetlen, hogy naprakĂ©sz maradjon a legĂşjabb React dokumentáciĂłval Ă©s a közössĂ©gi vitákkal kapcsolatban, amikor ezt a horgot használja.
Az experimental_useMemoCacheInvalidation használata
Az experimental_useMemoCacheInvalidation alapvető szintaxisa a következő:
import { experimental_useMemoCacheInvalidation as useMemoCacheInvalidation } from 'react';
function MyComponent(props) {
const [data, setData] = React.useState(null);
const [cacheKey, setCacheKey] = React.useState(0);
const memoizedValue = useMemoCacheInvalidation(
() => {
// Drága számĂtás vagy adatlekĂ©rĂ©s
console.log('Computing memoized value');
return computeExpensiveValue(props.input);
},
() => [cacheKey, props.input]
);
return (
<div>
<p>Memoized Value: {memoizedValue}</p>
<button onClick={() => setCacheKey(prev => prev + 1)}>Invalidate Cache</button>
</div>
);
}
Bontsuk le ezt a kódrészletet:
- Importálás: Importáljuk az
experimental_useMemoCacheInvalidation-t a 'react' csomagbĂłl. - SzámĂtási fĂĽggvĂ©ny: Az elsĹ‘ argumentum egy fĂĽggvĂ©ny, amely a memoizálandĂł Ă©rtĂ©ket adja vissza. Itt helyezzĂĽk el a drága számĂtási vagy adatlekĂ©rĂ©si logikát.
- ÉrvĂ©nytelenĂtĂ©si fĂĽggvĂ©ny: A második argumentum egy fĂĽggvĂ©ny, amely Ă©rtĂ©kek tömbjĂ©t adja vissza. A React Ăşjra vĂ©grehajtja az elsĹ‘ fĂĽggvĂ©nyt, valahányszor ezek az Ă©rtĂ©kek megváltoznak.
- FĂĽggĹ‘sĂ©gek: Az Ă©rvĂ©nytelenĂtĂ©si fĂĽggvĂ©nyben megadjuk azokat a fĂĽggĹ‘sĂ©geket, amelyeknek a gyorsĂtĂłtár Ă©rvĂ©nytelenĂtĂ©sĂ©t kell kiváltaniuk. Ez hasonlĂt a
useMemo-ban lĂ©vĹ‘ fĂĽggĹ‘sĂ©gi tömbhöz, de nagyobb rugalmasságot tesz lehetĹ‘vĂ©. - PĂ©lda: Van egy cacheKey-ĂĽnk, amely a memoizált Ă©rtĂ©k Ă©rvĂ©nytelenĂtĂ©sĂ©t váltja ki a gomb segĂtsĂ©gĂ©vel törtĂ©nĹ‘ növelĂ©skor. A komponens tulajdonságait is fĂĽggĹ‘sĂ©gkĂ©nt használjuk.
Gyakorlati példák és felhasználási esetek
Vessünk egy pillantást néhány gyakorlati forgatókönyvre, ahol az experimental_useMemoCacheInvalidation különösen előnyös lehet.
1. Ă–sszetett számĂtások optimalizálása
KĂ©pzeljen el egy olyan komponenst, amely felhasználĂłi bemeneten alapulĂł számĂtásigĂ©nyes számĂtást vĂ©gez. MemoizáciĂł nĂ©lkĂĽl ez a számĂtás a komponens Ăşjrarajzolásakor minden alkalommal Ăşjra vĂ©grehajtásra kerĂĽlne, ami potenciálisan teljesĂtmĂ©nybeli szűk keresztmetszetekhez vezethet. Az experimental_useMemoCacheInvalidation segĂtsĂ©gĂ©vel memoizálhatja a számĂtás eredmĂ©nyĂ©t, Ă©s a gyorsĂtĂłtárat csak a releváns bemeneti Ă©rtĂ©kek változásakor Ă©rvĂ©nytelenĂtheti.
import { experimental_useMemoCacheInvalidation as useMemoCacheInvalidation } from 'react';
function ComplexCalculationComponent(props) {
const { inputValue } = props;
const result = useMemoCacheInvalidation(
() => {
console.log('Performing complex calculation');
// Szimuláljon egy összetett számĂtást
let sum = 0;
for (let i = 0; i < 1000000; i++) {
sum += i * inputValue;
}
return sum;
},
() => [inputValue]
);
return (
<div>
<p>Input Value: {inputValue}</p>
<p>Result: {result}</p>
</div>
);
}
2. API-kbĂłl lekĂ©rdezett adatok gyorsĂtĂłtárazása
API-kbĂłl törtĂ©nĹ‘ adatlekĂ©rĂ©skor gyakran kĂvánatos az eredmĂ©nyek gyorsĂtĂłtárazása a felesleges hálĂłzati kĂ©rĂ©sek elkerĂĽlĂ©se Ă©rdekĂ©ben. Az experimental_useMemoCacheInvalidation használhatĂł a gyorsĂtĂłtár hatĂ©kony kezelĂ©sĂ©re.
import { experimental_useMemoCacheInvalidation as useMemoCacheInvalidation } from 'react';
import { useState, useEffect } from 'react';
function DataFetchingComponent(props) {
const [data, setData] = useState(null);
const [refreshKey, setRefreshKey] = useState(0);
const fetchData = useMemoCacheInvalidation(
async () => {
console.log('Fetching data from API...');
// Szimuláljon egy API-hĂvást
const response = await fetch(`https://api.example.com/data?param=${props.param}`);
const jsonData = await response.json();
return jsonData;
},
() => [props.param, refreshKey]
);
useEffect(() => {
setData(fetchData);
}, [fetchData]);
if (!data) {
return <p>Loading...</p>;
}
return (
<div>
<p>Data: {JSON.stringify(data)}</p>
<button onClick={() => setRefreshKey(prevKey => prevKey + 1)}>Refresh Data</button>
</div>
);
}
3. A származtatott állapot memoizálása
Használhatja az experimental_useMemoCacheInvalidation-t a származtatott állapot, pĂ©ldául a más állapotváltozĂłkon alapulĂł átalakĂtott adatok memoizálására is.
import { experimental_useMemoCacheInvalidation as useMemoCacheInvalidation } from 'react';
import { useState } from 'react';
function DerivedStateComponent() {
const [items, setItems] = useState([1, 2, 3, 4, 5]);
const [filterValue, setFilterValue] = useState('');
const filteredItems = useMemoCacheInvalidation(
() => {
console.log('Filtering items...');
return items.filter(item => String(item).includes(filterValue));
},
() => [items, filterValue]
);
return (
<div>
<input
type="text"
value={filterValue}
onChange={(e) => setFilterValue(e.target.value)}
placeholder="Filter items..."
/>
<ul>
{filteredItems.map(item => (
<li key={item}>{item}</li>
))}
</ul>
</div>
);
}
Legjobb gyakorlatok és szempontok
Bár az experimental_useMemoCacheInvalidation hatĂ©kony kĂ©pessĂ©geket kĂnál, elengedhetetlen, hogy körĂĽltekintĹ‘en használja, Ă©s kövesse a legjobb gyakorlatokat a potenciális buktatĂłk elkerĂĽlĂ©se Ă©rdekĂ©ben.
- TeljesĂtmĂ©nybeli szűk keresztmetszetek azonosĂtása: Az
experimental_useMemoCacheInvalidationhasználata elĹ‘tt gondosan elemezze az alkalmazását a teljesĂtmĂ©nybeli szűk keresztmetszetek azonosĂtása Ă©rdekĂ©ben. A memoizálást csak ott szabad alkalmazni, ahol valĂłban szĂĽksĂ©ges. - FĂĽggĹ‘sĂ©gek minimalizálása: Tartsa a fĂĽggĹ‘sĂ©geket az Ă©rvĂ©nytelenĂtĂ©si fĂĽggvĂ©nyben a minimumon. A tĂşlzott fĂĽggĹ‘sĂ©gek felesleges gyorsĂtĂłtár-Ă©rvĂ©nytelenĂtĂ©shez vezethetnek, Ă©s megakadályozhatják a memoizáciĂł cĂ©lját.
- AlternatĂvák mĂ©rlegelĂ©se: Fedezzen fel alternatĂv megoldásokat, pĂ©ldául a
useMemoĂ©s aReact.memolehetĹ‘sĂ©geket, mielĹ‘tt azexperimental_useMemoCacheInvalidation-t választaná. Ezek az egyszerűbb alternatĂvák elegendĹ‘ek lehetnek sok használati esetre. - Alapos tesztelĂ©s: Alaposan tesztelje komponenseit az
experimental_useMemoCacheInvalidationsegĂtsĂ©gĂ©vel, hogy megbizonyosodjon arrĂłl, hogy a gyorsĂtĂłtár-Ă©rvĂ©nytelenĂtĂ©si logika a várt mĂłdon működik, Ă©s nem okoz semmilyen váratlan viselkedĂ©st. - A teljesĂtmĂ©ny figyelĂ©se: Használjon teljesĂtmĂ©nyprofilozĂł eszközöket a memoizáciĂł hatásának a alkalmazás teljesĂtmĂ©nyĂ©re valĂł monitorozásához. Ez segĂt azonosĂtani azokat a terĂĽleteket, ahol tovább optimalizálhatja a kĂłdját.
- Dokumentáció és kódkommentek: Mindig dokumentálja az
experimental_useMemoCacheInvalidationhasználatának okait, Ă©s adjon világos kĂłdkommenteket a gyorsĂtĂłtár-Ă©rvĂ©nytelenĂtĂ©si logika magyarázatához. Ez nagymĂ©rtĂ©kben javĂtja a karbantarthatĂłságot, kĂĽlönösen a globális csapatok számára, ahol a fejlesztĹ‘k kĂĽlönbözĹ‘ háttĂ©rrel Ă©s a kĂłdbázis ismeretĂ©nek kĂĽlönbözĹ‘ szintjeivel rendelkezhetnek. - Értse meg a kompromisszumokat: A memoizáciĂł a memĂłriahasználat Ă©s a teljesĂtmĂ©ny közötti kompromisszumot foglal magában. Legyen tudatában a gyorsĂtĂłtárazott Ă©rtĂ©kekkel járĂł potenciális memĂłriafelhasználásnak, kĂĽlönösen nagymĂ©retű adatkĂ©szletekkel vagy összetett objektumokkal valĂł foglalkozáskor. PĂ©ldául az összetett, gyakran nem változĂł objektumok tárolása drágább lehet, mint az ĂşjraszámĂtás.
- A kontextus számĂt: Az optimális memoizáciĂłs stratĂ©gia változhat a konkrĂ©t felhasználási esettĹ‘l Ă©s az alkalmazás jellemzĹ‘itĹ‘l fĂĽggĹ‘en. Gondosan fontolja meg az alkalmazása kontextusát, Ă©s válassza ki a memoizáciĂłs megközelĂtĂ©st, amely a legjobban megfelel az igĂ©nyeinek. Vegye figyelembe a hálĂłzati sebessĂ©g Ă©s a hardver kĂĽlönbsĂ©geit rĂ©giĂłnkĂ©nt azok számára, akik adatokat lekĂ©rdeznek.
Ă–sszehasonlĂtás a useMemo-val Ă©s a React.memo-val
Hasznos megérteni a kapcsolatot az experimental_useMemoCacheInvalidation, a useMemo és a React.memo között.
useMemo: Ez a horog memoizál egy Ă©rtĂ©ket, Ă©s csak akkor számolja Ăşjra, ha a fĂĽggĹ‘sĂ©gei megváltoznak. Alkalmas egyszerű memoizáciĂłs forgatĂłkönyvekhez, ahol a fĂĽggĹ‘sĂ©gek egyĂ©rtelműen definiáltak.React.memo: Ez a magasabb rendű komponens memoizál egy funkcionális komponenst, megakadályozva az Ăşjrarajzolást, ha a tulajdonságai nem változtak. Hasznos a komponensfrissĂtĂ©sek optimalizálásához.experimental_useMemoCacheInvalidation: Ez a horog explicitabb vezĂ©rlĂ©st biztosĂt a memoizáciĂł felett azáltal, hogy lehetĹ‘vĂ© teszi az egyĂ©ni Ă©rvĂ©nytelenĂtĂ©si kritĂ©riumok meghatározását. Olyan forgatĂłkönyvekhez kĂ©szĂĽlt, ahol finomszemcsĂ©s vezĂ©rlĂ©sre van szĂĽksĂ©g a gyorsĂtĂłtár Ă©rvĂ©nytelenĂtĂ©se felett.
LĂ©nyegĂ©ben az experimental_useMemoCacheInvalidation kiterjeszti a useMemo funkcionalitását, nagyobb rugalmasságot kĂnálva az Ă©rvĂ©nytelenĂtĂ©si logika meghatározásában. MindegyikĂĽk kĂĽlönbözĹ‘ problĂ©mákat old meg, Ă©s egyĂĽtt is használhatĂłk.
Globális szempontok és hozzáférhetőség
A globális közönség számára történő alkalmazások fejlesztésekor elengedhetetlen a következő tényezők figyelembevétele:
- LocalizáciĂł Ă©s internacionalizáciĂł (i18n): GyĹ‘zĹ‘djön meg arrĂłl, hogy alkalmazása támogatja a több nyelvet, Ă©s alkalmazkodik a kĂĽlönbözĹ‘ kulturális preferenciákhoz. FordĂtsa le a felhasználĂłi felĂĽlet elemeit, formázza helyesen a dátumokat Ă©s számokat, Ă©s kezelje a szöveg irányát (pl. jobbrĂłl balra Ărott nyelvek). A React i18next Ă©s a hasonlĂł könyvtárak segĂthetnek ebben.
- TeljesĂtmĂ©nyoptimalizálás a kĂĽlönbözĹ‘ hálĂłzati feltĂ©telekhez: A felhasználĂłk szerte a világon kĂĽlönbözĹ‘ hálĂłzati sebessĂ©geket tapasztalnak. Optimalizálja alkalmazását a kĂĽlönbözĹ‘ hálĂłzati feltĂ©telekhez a következĹ‘vel:
- A kötegek méretének csökkentése kódosztással és fa-remegéssel.
- Tartalomelosztó hálózatok (CDN) használata statikus eszközök kiszolgálására a felhasználókhoz közelebb eső szerverekről.
- A webhez való képek optimalizálása, megfelelő formátumok (pl. WebP) és méretek használata.
- Lustázott betöltĂ©s megvalĂłsĂtása a nem kritikus erĹ‘forrásokhoz.
- HozzáfĂ©rhetĹ‘sĂ©g: Tervezze meg alkalmazását Ăşgy, hogy az hozzáfĂ©rhetĹ‘ legyen a fogyatĂ©kkal Ă©lĹ‘ felhasználĂłk számára, betartva a Webes Tartalom HozzáfĂ©rhetĹ‘sĂ©gi Irányelveket (WCAG). BiztosĂtsa a szemantikus HTML megfelelĹ‘ használatát, adjon alternatĂv szöveget a kĂ©pekhez, Ă©s tegye az alkalmazást navigálhatĂłvá billentyűzettel. A
react-ariaĂ©s a hasonlĂł könyvtárak segĂthetnek. - Kulturális Ă©rzĂ©kenysĂ©g: Legyen figyelemmel a kulturális kĂĽlönbsĂ©gekre, Ă©s kerĂĽlje a bizonyos kultĂşrákban sĂ©rtĹ‘ vagy nem megfelelĹ‘ tartalom vagy design használatát. Kutassa Ă©s Ă©rtse meg a cĂ©lközönsĂ©gĂ©nek kulturális árnyalatait.
- IdĹ‘zĂłnák Ă©s dátumok: JelenĂtse meg a dátumokat Ă©s idĹ‘pontokat olyan formátumban, amelyet a kĂĽlönbözĹ‘ idĹ‘zĂłnákban lĂ©vĹ‘ felhasználĂłk könnyen megĂ©rtenek. Fontolja meg a lehetĹ‘sĂ©get a felhasználĂłk számára, hogy megadják a preferált idĹ‘zĂłnájukat. A
date-fnsvagy a hasonlĂł könyvtárak segĂthetnek ebben. - Bemeneti mĂłdszerek: Támogasson kĂĽlönfĂ©le bemeneti mĂłdszereket, beleĂ©rtve a billentyűzetet, az Ă©rintĂ©st Ă©s a hangbemenetet. Fontolja meg az olyan akadálymentesĂtĂ©si eszközöket, mint a kĂ©pernyĹ‘olvasĂłk.
Ezeknek a tényezőknek a figyelembevételével egy valóban globális alkalmazást hozhat létre, amely zökkenőmentes felhasználói élményt nyújt mindenkinek, függetlenül a tartózkodási helyétől vagy hátterétől.
Következtetés
Az experimental_useMemoCacheInvalidation egy Ă©rtĂ©kes eszköz a React fejlesztĹ‘k számára, akik a teljesĂtmĂ©ny optimalizálására Ă©s a gyorsĂtĂłtár Ă©rvĂ©nytelenĂtĂ©sĂ©nek nagyobb pontossággal törtĂ©nĹ‘ kezelĂ©sĂ©re törekszenek. A kĂ©pessĂ©geinek megĂ©rtĂ©sĂ©vel Ă©s körĂĽltekintĹ‘ alkalmazásával jelentĹ‘sen javĂthatja React alkalmazásainak hatĂ©konyságát, ami a globális közönsĂ©g számára válaszkĂ©szebb Ă©s Ă©lvezetesebb felhasználĂłi Ă©lmĂ©nyhez vezet. Ne feledje, hogy tájĂ©kozĂłdjon ennek a horognak a kĂsĂ©rleti jellegĂ©rĹ‘l, Ă©s gondosan fontolja meg annak használatát az adott projektjĂ©nek kontextusában.
A React ökoszisztĂ©ma folyamatos fejlĹ‘dĂ©sĂ©vel az olyan eszközök, mint az experimental_useMemoCacheInvalidation, egyre fontosabb szerepet játszanak abban, hogy a fejlesztĹ‘k nagyteljesĂtmĂ©nyű, mĂ©retezhetĹ‘ Ă©s karbantarthatĂł alkalmazásokat tudjanak Ă©pĂteni, amelyek elĂ©rhetik a felhasználĂłkat szerte a világon. Fontos, hogy mindig a teljes körű tesztelĂ©st helyezze elĹ‘tĂ©rbe, Ă©s ragaszkodjon a memoizálás legjobb gyakorlataihoz az optimális teljesĂtmĂ©ny biztosĂtása Ă©s a lehetsĂ©ges problĂ©mák elkerĂĽlĂ©se Ă©rdekĂ©ben. A jĂł szoftvermĂ©rnöki elvek, pĂ©ldául a kommentálás Ă©s a világos elnevezĂ©si konvenciĂłk, mĂ©g kritikusabbak a globális fejlesztĹ‘i közönsĂ©g fenntartásához, akik jobban hozzászokhattak a kĂĽlönbözĹ‘ nyelvekhez Ă©s keretrendszerekhez.