
V tomto blogu vám představím koncept rozhraní a jak mohou být užitečné i v dynamických jazycích. Budu také používat implementaci knihovny.js, aby koncept do JavaScriptu, a ukázat vám, jak získat nějaký další nástroj z rozhraní.
Google definuje rozhraní jako “ bod, kde jsou dva systémy, subjekty, organizace atd. seznamte se a komunikujte, “ a tato definice platí pro rozhraní v programování. Ve vývoji softwaru je rozhraní strukturou, která vynucuje specifické vlastnosti objektu — ve většině jazyků je tento objekt třídou.
zde je příklad rozhraní v Javě:
Ve výše uvedeném příkladu, Car
rozhraní popisuje třídu, která má dvě metody s žádný typ návratu, z nichž oba se jeden celočíselný argument. Podrobnosti o implementaci každé funkce jsou ponechány na třídě, proto metody nemají žádné tělo. Zajistit třída implementuje Car
rozhraní, můžeme použít implements
klíčové slovo:
Rozhraní v Javascriptu
Rozhraní nejsou věc v Javascriptu, ne úplně stejně. JavaScript je dynamický jazyk, kde typů se mění tak často, že vývojář nemusí mít vůbec uvědomil, protože toto lidé tvrdí, že není třeba pro rozhraní, které mají být přidány do ECMAScript standardu, že JavaScript je založen na.
JavaScript se však masivně rozrostl jako backendový jazyk ve formě uzlu.js, a s tím přicházejí různé požadavky a jiný dav, který může mít jiný názor. Chcete-li k tomu přidat, jazyk se rychle stává nástrojem front-end; dostal se do bodu, kdy mnoho vývojářů zapíše drtivou většinu svého HTML uvnitř .soubory js ve formě JSX.
Tak jako jazyk roste na více rolí, je užitečné, pak se ujistěte se, že jeden z našich nejdůležitějších datových struktur je to, co jsme očekávali, že je. JavaScript může mít class
klíčové slovo, ale ve skutečnosti je to jen uninstantiated funkce konstruktoru, a kdysi nazval je jednoduše objektu. Objekty jsou všudypřítomné, takže je někdy výhodné zajistit, aby odpovídaly určitému tvaru.
v Poslední době v práci jsem našel případ, kdy developer očekával majetku vrácena jako součást API odpověď true
, ale místo toho dostal "true"
, což způsobuje chybu. Snadná chyba a ta, které by se také dalo vyhnout, kdybychom měli rozhraní.
ale počkejte, je toho víc!
rozhraní, s několika drobnými úpravami, by mohla být použita k přetvoření objektů. Představte si implementaci „přísného“ rozhraní, kde nejsou povoleny žádné vlastnosti mimo rozhraní, mohli bychom tyto vlastnosti smazat nebo přejmenovat, nebo dokonce hodit chybu, pokud se s nimi setkáme.
Takže teď máme rozhraní, které nám řekne, kdy nám chybí určité vlastnosti, ale také až budeme mít neočekávané vlastnosti, nebo pokud vlastnostmi typy nejsou to, co očekáváme. To přidává další možnosti, například refaktorování odpovědi z API a přidání další vrstvy bezpečnosti nad standardní chování rozhraní. Mohli bychom také použít rozhraní v jednotkových testech, pokud je necháme házet chyby.
implementovat.js
implementovat.JS je knihovna, která se pokouší přinést rozhraní do JavaScriptu. Myšlenka je jednoduchá: definujte rozhraní, definujte typy jeho vlastností a použijte jej k zajištění toho, aby objekt byl tím, co očekáváte.
nastavení
nejprve nainstalujte balíček:
npm install implement-js
dále vytvořte .js souboru a import implement
Interface
type
:
Naše první rozhraní
K vytvoření rozhraní, jednoduše zavolejte Interface
a předat řetězec jako název rozhraní — to není doporučeno, ale pokud vynecháte jméno, unikátní ID bude generován. Tato možnost vrátí funkce, která přijímá objekt, v němž jsou vlastnosti type
objekty, druhý argument může také být předány s možností zobrazit varování, házet chyby, odstranit nebo přejmenovat vlastnosti, zajistit pouze vlastnosti rozhraní jsou přítomny, nebo rozšířit existující Interface
.
zde je rozhraní, které popisuje auto:
seats
vlastnost, která by měla být typu číslo, cestující pole, které obsahuje objekty, které musí sami provádět Passenger
rozhraní, a obsahuje beep
nemovitosti, která by měla být funkce. error
strict
volby byly stanoveny na hodnotu true, což znamená, že chyby bude vyvolána, pokud je vlastnost rozhraní chybí, a také, když nemovitost není na rozhraní je našel.
Prováděcí naše rozhraní
Nyní chceme implementovat naše rozhraní, v jednoduchém příkladu jsme se vytvořit objekt pomocí objektu doslovný a uvidíme, jestli jsme schopni implementovat naše rozhraní.
za Prvé, jsme se vytvořit Ford
objekt, pak se budeme snažit realizovat to proti naší Car
rozhraní:
Jak vidíme z komentáře výše, to vyhodí chybu. Podívejme se zpět na naše Car
rozhraní:
můžeme vidět, že zatímco všechny vlastnosti jsou přítomny, přísný režim, je také pravda, což znamená, že další vlastnost fuelType
způsobí chybu být hozen. Navíc, i když Máme vlastnost passengers
, není to pole.
aby bylo možné správně implementovat rozhraní, odstraníme fuelType
a změňte hodnotu passengers
tak, že je pole obsahující objekty, které implementují Passenger
rozhraní:
„Ale JavaScript není Objektově Orientovaný jazyk!“
je pravda, že zatímco rozhraní jsou typicky spojené s objektově orientovaných jazyků, a JavaScript je multi-paradigmatický jazyk, který používá prototypal dědičnost, rozhraní může být stále velmi užitečné.
například pomocí implement-js
můžeme snadno refaktorovat odpověď API a zároveň zajistit, že se neodchýlila od toho, co očekáváme. Zde je příklad použitý ve spojení s redux-thunk
:
za Prvé, jsme se definovat TwitterUser
rozhraní, které rozšiřuje User
rozhraní, jako objekt s twitterId
twitterUsername
vlastnosti. trim
je pravda, což znamená, že budeme zrušit všechny vlastnosti, které nejsou popsány v TwitterUser
rozhraní. Protože naše API vrací vlastnosti v nepřátelském formátu, přejmenovali jsme vlastnosti z twitter_username
a twitter_id
na verze camelcase.
dále musíme definovat asynchronní akce s redux-thunk
akce aktivace volání API, a můžeme použít naše TwitterUser
rozhraní vyřadit vlastnosti, které nechceme a aby bylo zajištěno, že implementuje vlastnosti očekáváme, s správné typy. Pokud dáváte přednost, aby se vaše akce tvůrců pure(er) nebo nepoužívejte redux-thunk
, možná budete chtít zkontrolovat rozhraní uvnitř twitterService.getUser
a vrátí výsledek.
Poznámka: při rozšíření možnosti rozhraní nejsou zděděny
testy jednotek jsou také vhodným místem pro použití rozhraní:
shrnutí
Jsme viděli, jak rozhraní může být užitečné v Javascriptu: i když to je vysoce dynamický jazyk, kontrolovat tvar objektu, a to jsou vlastnosti určitého datového typu nám dává další vrstvu bezpečnosti jsme, jinak by přišli. Tím, že jsme navázali na koncept rozhraní a použili implement-js
, jsme také mohli získat další nástroj navíc k přidanému zabezpečení.