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