výrazy implicitní a explicitní si zvyknou, když je poprvé uslyšíte. Když je slyšíte z hlediska programování, co přesně to pro vás znamená? Je jedna cesta lepší než druhá? Zde projdeme každou z těchto myšlenek a poskytneme příklady s některými výhodami návrhu, které mohou pocházet z nich.

výrazy

v programování se implicitní často používají k označení něčeho, co pro vás udělal jiný kód v zákulisí., Explicitní je ruční přístup k provedení změny, kterou chcete mít, napsáním pokynů, které mají být provedeny explicitně. Na menším obrázku, implicitní a explicitní jsou často termíny používané pro lití typů do typu, který byste měli být. Ve větší obrázek, možná mluvíš o konvence nad konfigurací, kde úmluva je to, co je implicitně pro tebe udělal pomocí kódu základnu nebo rámec a konfigurace je jednoduše explicitní nastavení.,

existují také rozdíly vhodnosti nebo přínosu pro použití v závislosti na dotyčném programovacím jazyce a na tom, zda je jazyk staticky napsán nebo dynamicky zadán. Záleží také na tom, zda lze věci odvodit z doby běhu nebo během kompilace. Vzhledem k těmto faktorům tvrzení, že jedna metodika je lepší než jiná, může být pravdivá pouze v úzkých kontextech, protože musíte vzít v úvahu návrh programovacích jazyků a dotyčných programů.,

příklad implicitní a explicitní přetypování v C je následující:

int implicit;implicit = 4.5;int explicit;explicit = (int)4.5; 

Zde názvy proměnných implicit explicit byly definovány typu int. Jakmile danou hodnotu 4.5 implicitní verze má kompilátor převést to, co by normálně být float nebo double typ na celé číslo vzhledem k tomu, že explicitní verze má výslovně obsazení to celé s použitím (int), že to, co vrhá ten typ.,

Staticky typované jazyky

V staticky typované jazyky, jako je Rez drtivá většina tvorby hodnoty a úkol bude mít explicitní typ anotace požadavky s výjimkou všude tam, kde kompilátor může odvodit typ. Následující příklad ukazuje explicitní a implicitní typy v rezu.

fn add_one(input: u8) -> u8 { input + 1}let four = add_one(3);

zde je metoda add_one explicitní o typu vstupu a typu výstupu., Počet 1 přidávány tady je implicitně provedeno u8 číslo v době kompilace podle kontextu pomáhá odvodit typ a dále na u8 je implementována pouze pro práci s u8 čísla. Poslední řádek je implicitně zadán jako u8 protože samotná metoda definuje typ, který bude vrácen.

Co lze odvodit v rezu, je docela působivé při použití generik. Použití závěru je však omezeno na věci, které mohou být známy v době kompilace., Pokud to nemůže být známo v době kompilace, musíte explicitně definovat typ v libovolném bodě přiřazení. Přijmout následující definici metody:

use std::ops::Add;fn add_both<T: Add>(a: T, b: T) -> T::Output { a + b}

Zde T může být libovolný typ, který implementuje vlastnost Add. T::Output je definován typ, kdy Přidat vlastnost je definována pro váš konkrétní typ a je obvykle stejného typu jako T sám v tomto případě. Nyní, pokud poskytneme dvě čísla jako parametry, kompilátor odvodí Typ.,

let x = add_both(3 , 4 ); // implicit typelet y: u8 = add_both(3u8 , 4u8 ); // explicit typelet z: u32 = add_both(3u32, 4u32); // explicit type

při spuštění výše uvedeného kódu x je odvozen Typ i32. y z příklady vyžadují vstupní parametr typy, aby být známo, kdy poskytované funkce jako inference pro T::Output není nutně stejné jako to, co T může být odvozena jako. To by default do i32 a pak přiřazení i32 u8 nebo u32 je prostě špatně.,

Dynamicky typované jazyky

s dynamicky typované jazyky, budete muset méně starat o typy, samo o sobě, a více o implicitní nebo explicitní objekty nebo chování. Modelování kódu kolem objektů, které mají stejné chování, je to, co je známé jako kachní psaní, což je vyšší doména myšlení v objektově orientovaném programování, kde je manipulace s těmito objekty implicitní. Zatímco modelování kódu kolem konkrétních tříd objektů je podobně jako použití explicitního nebo implicitního psaní., Ale když přijmete jakýkoli druh objektu jako vstup, pak kód v této části musí buď zpracovat různé objekty explicitně nebo předat tuto odpovědnost jinde.

pro objasnění, když píšete kód pro zpracování různých druhů věcí, pak píšete explicitní kód. Pokud však tento stejný kód již byl napsán a Vy jej znovu používáte pomocí jednoduchého volání metody, pak je chování v tomto novém kontextu implicitní. Implicitní je, že se věci dělají automaticky a zpracovávají mimo váš současný rozsah.,

v Ruby má většina typů návrh pro explicitní nebo implicitní konverzi. Myšlenka je implicitní převod metody jsou určeny k použití v implicitní kontexty a explicitní konverze jsou určeny pro vývojáře psát inline v mnohem více kontextech. Dovolte mi to ukázat příkladem.

# explicit"4".to_i + "5".to_i# => 9# implicitclass Seven def to_int 7 endendArray.new(Seven.new)# => 

Zde explicitní příklad je velmi zřejmé, pro čtenáře, že jsme se převod String, objekty Integer objektu a provedení sčítání mezi dvěma., A implicitní příklad není pro čtenáře tak zřejmý, protože metoda Array.new implicitně volá metodu to_int na jakémkoli parametru, který je uveden. Celá třída má metodu to_int definovanou na každé instanci, která se jednoduše vrátí. Pokud napíšete 42.to_int jednoduše se dostanete zpět 42. Toto použití Použití implicitní konverze jako vstupního krytu pro volání metod je skvělým designem pro bezpečnost typu podle návrhu. Zde je to, co se stane, když mu dáte špatný druh objektu jako vstup, který nedefinuje to_int.,

Array.new("32")# TypeError (no implicit conversion of String into Integer)

nejenže selže, ale dává nám užitečnou zprávu, že se pokusil o implicitní konverzi a řekne třídě daného objektu a třídě objektu, kterou očekává. Implicitní metody konverze v Ruby je způsob, jak říci, že tento objekt je opravdu to, co očekáváte. A explicitní konverze jednoduše provede konverzi na očekávaný Typ.

Ruby má implicitní a explicitní možnosti pro mnoho svých základních objektů.,

Ruby má také několik tříd se metody třídy, které budou buď dělat implicitní konverze nebo vrátí nil, a že název metody je try_convert.

můžeme následovat příklad Ruby s Array.new a mít dobrý stráž pro druh vstupních parametrů, které jsme dali navrhováním implicitních konverzí pro naše vlastní typy. Pro tento příklad, jelikož to_f je explicitní převod na desetinné číslo v Ruby budeme používat as_ jako prefix místo to_., Zde je základní příklad implicitnosti jako vzoru pro bezpečnost.

nyní to pomůže ostatním vývojářům, kteří používají třídu Bar, aby ji neprošli jako nekompatibilní parametr. Vyplývá to z konvence v rámci Ruby jazyka a mělo by být mnohem jednodušší pro vývojáře pochopit s více užitečných chyb. Když máte jiné předměty, které byste chtěli převést do Foo objekt pak můžete definovat as_f metoda na to pro explicitní konverze a vývojáře, kteří používají to, že nový objekt bude explicitní v jeho používání Bar.new(Baz.new.as_f)., Tím je zajištěno, že kód bude fungovat tolik, kolik Bar a Foo již fungují.

shrnutí

akt implicitního a explicitního kódování a implicitní a explicitní kód je definován kontextem provádění dalšího chování nebo nastavení typu/obsazení. Konkrétně jsou implicitní nebo explicitní metody definovány kontexty, ve kterých mají být použity. Implicitní kód může být velmi pěkný zážitek, pokud jsou věci dobře pojmenované, protože to udržuje věci jednoduché.,

Nicméně, implicitní kód, který dělá věci v zákulisí pro vás, může být také obtížné problém řešit, když udělal špatně. Explicitní kód je Kód jasný, když se na něj podíváte, protože specifika toho, co se děje, je již stanovena před vámi a nemusíte sledovat problémy jinde, ale obecně to znamená mnohem více práce. Sama o sobě se může stát ohromující, takže nalezení správné rovnováhy mezi nimi je často nejlepším řešením. Buďte explicitní, když musíte, a implicitní, když jsou koncepty návrhu a pojmenování snadno pochopitelné., To bude pro pohodlnější zážitek z vývoje.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *