10 Kérdések a programozó javascript interjúra, mindenki válaszoljon a könyvtárra
1. Prototípusos örökség (szintén: prototípusok, objektum-referenciák)
2. Funkcionális programozás (szintén: lezárások, első osztályú funkciók, lambda)
Fogalmam sincs a paradigmákról, ne beszéljünk prototípusos OOP-ról vagy funkcionális programozásról.
A funkcionális programozás magában foglalja a matematikai függvények kiszámítását, elkerülve a közös állapotokat és a változó adatokat. A Lisp (1958-ban meghatározott) az első funkcionális programozási nyelvek egyike és erősen ihlette a lambda calculi. A Lisp-et és a hasonló nyelveket ma is széles körben használják.
1. Tiszta funkciók / funkciók tisztasága
2. A mellékhatások elkerülése
3. A funkciók egyszerű összetétele
4. Példák a funkcionális nyelvekre: Lisp, ML, Haskell, Erlang, Clojure, Elm, F Sharp, OCaml stb.
5. A funkcionális programozást támogató funkciók: első osztályú funkciók, magasabb rendű függvények, arguments / értékekként funkcionálnak
1. Tiszta funkciók hiánya / mellékhatások elkerülése
2. Ne adjon példákat a funkcionális nyelvekre
Osztály öröklés: az instrukciók osztályokból öröklődnek, alosztály-kapcsolatok jönnek létre (az osztályok hierarchikus osztályozása). Az instanciákat a függvény-konstruktoron keresztül hajtja végre az új leíró. Az osztály példánya nem tartalmazhat osztályleírást az ES6-dal kezdődően.
Prototípusos öröklés: a példányokat közvetlenül a más objektumokból származtatják, gyárakban vagy Object.create () alkalmazásban, és a példák sok különböző objektumból állhatnak, hogy egyszerűsítsék a szelektív öröklést. A prototípus öröksége egyszerűbb és rugalmasabb, mint az osztály öröksége.
1. Osztályok: szoros kapcsolatok, hierarchia
2. Prototípusok: összefonódás öröklés, delegáció, funkcionális örökség, összetétel
Ne mutasd az örökség prototípus előnyeit az osztály fölött
PLO előnyei: könnyen értelmezhető objektumfogalom és hívási módszerek. Az OOP a deklaratív helyett inkább az imperatív stílust kívánja használni, amely a gép utasításainak közvetlen sorozata.
Az OOP hátrányai: rendszerint függ az általános állapotoktól. Az objektumok és viselkedésük egy olyan entitással függ össze, amelyhez számos függvény elérhetõ egy nem meghatározott sorrendben, ami kiszámíthatatlan viselkedéshez, például a verseny állapotához vezethet.
PL előnyei: olyan funkcionális paradigmát alkalmaznak, amely elkerüli a közös állapotokat és a nemkívánatos hatásokat, kiküszöböli a versengő funkciók miatt felmerülő hibákat. Az implicit programozási funkciók miatt a funkciók általában radikálisan leegyszerűsödnek és könnyen átalakíthatók az OOP-hoz képest, a kód újrahasználatához képest.
A tiszta funkciókat használó számításokat egyszerűen át lehet méretezni több processzorra vagy elosztott számítástechnikai klaszterekre anélkül, hogy félve volna az erőforrásokért való küzdelemtől.
FP hátrányok: a funkcionális megközelítések túlzott kihasználása, mint például az implicit programozás, a kód olvashatóságának csökkenéséhez vezethet, mivel a végső kód absztraktabbá, tömörebbé és kevésbé konkréttá válik.
Gyakrabban az emberek jobban ismerik az OOP-t és az imperatív megközelítést, így a funkcionális programozás egyes közös nyelvhasználói nehézségeket okozhatnak a kezdőknek.
1. Általános feltételek, nemkívánatos viselkedés problémái
2. Az OP lehetőségei a programkód radikális egyszerűsítésére
3. A tanulás nehézségei
4. Káros hatások és azok hatása a program megbízhatóságára
5. A változás összetettsége és az OO kódbázis általános törékenysége, szemben a funkcionális stílussal
Nem is beszélve az egyik megközelítés hiányosságairól - mindenki, aki találkozott egyikével, pár vagy két hátrányt ismerve
A trükk kérdés. A helyes válasz soha. A kompozíció egyszerűbb és rugalmasabb megközelítés, mint az örökölt osztályok.
"... a tárgyak összetétele jobb, mint az osztályok öröksége"
A prototípus örökségének több típusa létezik:
1. Delegáció (prototípus lánc)
2. Összekötés (myxines, Object.assign ())
3. Funkcionális örökség (nem szabad összetéveszteni a funkcionális programozással, a funkció a privát / kapszulázás lezárásának létrehozására szolgál)
1. Olyan esetekben, amikor a modulok vagy a funkcionális programozás nem nyújt nyilvánvaló megoldást
2. Ha egy objektumot több forrásból kell összeállítania
3. Mindenesetre, amikor örökséget kell alkalmazni
1. Nem tudom, mikor használják a prototípusokat
2. Nem tudom a myxinekről vagy az Object.assign ()
Ez egy idézet a "Design Patterns: Elements of Reusable Object-Oriented Software" című könyvből. A kód újrahasználatát úgy kell elérni, hogy a kis mértékegységeket egy új objektumba összeszereljük, nem pedig osztályok öröklésével és hierarchiák létrehozásával.
1. Az örökség és a szoros kapcsolatok elkerülése
Ne nevezzen semmilyen fent említett problémát. Ne magyarázza meg a különbséget az összetétel és az örökség között, vagy ne mondja el a kompozíció előnyeit.
A kétirányú adatkommunikáció azt jelenti, hogy az interfészmezők dinamikusan kapcsolódnak az adatmodellhez, vagyis amikor az interfész mezők megváltoznak, a modell változik, és fordítva.
Az egyirányú adatfolyam azt jelenti, hogy csak a modell az igazság forrása. Változások a kezelőfelületen, amelyek jelzik a felhasználónak a modell szándékát (vagy a "React" tárolását). A lényeg az, hogy az adatok mindig egy irányban haladnak, ami megkönnyíti a megértést.
Az egyirányú adatáramok determinisztikusak, míg a kétirányú kötés nemkívánatos hatásokat okozhat, amelyeket nehezebb követni és megérteni.
1. React egy új, kanonikus példa egyirányú adatfolyamra, így a React megemlítése jó ötlet. A Cycle.js egy újabb népszerű implementációja egyirányú adatáramlásnak.
2. A szögletes egy népszerű keret, amely kétirányú kötést alkalmaz.
Az ilyen fogalmak megértésének elmulasztása, a különbség magyarázata.
A monolitikus architektúra azt jelenti, hogy az alkalmazásod egyetlen koherens kódblokkként van írva, amelynek összetevői együtt dolgoznak és megosztott erőforrásokat használnak.
A mikroszolgáltatások megközelítése azt sugallja, hogy az alkalmazás számos apró, független alkalmazásból áll, amelyek képesek saját erőforrásaikra és potenciálisan nagyszámú egyedi gépen dolgozni.
A monolitikus architektúra előnyei: A monolitikus architektúra legfontosabb előnye, hogy a legtöbb alkalmazásnak általában számos gyakori problémája van, például a naplózás, a sebességkorlátozás és a biztonsági funkciók igénye - könnyebb megoldást találni minden egyes összetevőre egyetlen alkalmazásban.
A monolitikus alkalmazás hátrányai: mivel minden összetevő szorosan kapcsolódik egymáshoz, ahogy az alkalmazás fejlődik, nehezebb megérteni, számos unobvious függőséget és mellékhatást jeleznek.
A mikroszolgáltatók előnyei: a mikroszolgáltatók általában jobb szervezésűek, mivel minden egyes elem elvégzi feladatát, és a többi komponenstől függetlenül működik. A különálló összetevőkön alapuló alkalmazás is könnyebben átkonfigurálható és módosítható.
Mikroszolgálatok kiesése: új mikroszolgáltatás létrehozásakor sok olyan hirtelen probléma jelentkezhet, amelyek a tervezés során nem voltak várhatóak. Monolitikus alkalmazások esetén a middleware segítségével különböző end-to-end problémák megoldhatók sok munka nélkül.
Egy mikro-szolgáltatási architektúrában szükség lesz minden egyes keresztmetszeti problémára az egyes modulok felső szintjére, vagy egy másik szolgáltatási szintre kell beágyazni őket, amelyen keresztül az összes forgalom halad.
Végül is a monolitikus architektúrák általában külső szolgáltatási szint mellett irányítják a forgalmat, de monolitikus architektúrával a munka költségeit elhalaszthatja, amíg a projekt éretté válik.
A mikroszolgáltatókat gyakran alkalmazzák saját virtuális gépeken vagy tárolókban, ami a konfliktusok számának gyors növekedését eredményezi a virtuális erőforrások felett.
1. A kezdeti magas költségek ellenére a mikroszolgáltatók hosszú távon kedvezőek a jobb skálázás miatt
2. Gyakorlati különbségek a mikroszolgáltatók és a monolit alkalmazások között
1. Az építészetbeli különbségek nem ismertek
2. A mikroszolgáltatások hátrányainak figyelmen kívül hagyása
3. Alábecsülje a mikro-szolgáltatások skálájának előnyeit
A szinkron programozás azt jelenti, hogy a feltételek és a funkcióhívások kivételével a kódot egymás után hajtják végre fentről lefelé, hosszadalmas feladatokra, például hálózati kérésekre és a lemezről történő olvasásra / írásra.
Az aszinkron programozás azt jelenti, hogy ha egy reteszelő műveletre van szükség, a kérés elküldésre kerül és a kód továbbra is blokkolás nélkül működik, amíg az eredmény várható. Amikor a válasz készen van, egy megszakítás aktiválódik, ez kiváltja az eseménykezelőt, és a vezérlőszál folytatódik. Így egy programfolyam több párhuzamos műveletet is feldolgozhat.
A felhasználói interfészek alapvetően aszinkronak, a legtöbb időt arra költik, hogy a felhasználói bevitel a ciklus megszakítására és a kezelő elindítására szolgál.
A Node.js alapértelmezés szerint aszinkron, sőt, a szerver időtúllétét hurokban tölti, várva a hálózati kérést.
1. A zárak jelentése, a teljesítményre gyakorolt hatás
2. A kezelők megértése és miért fontosak az interfészekhez
1. A szinkronizáció és az aszinkronitás feltételeinek meg nem értése
2. Nem képes meghatározni a termelékenységre gyakorolt hatást