termit implisiittinen ja eksplisiittinen totuttelua, kun ensin kuulla niitä. Kun kuulet ne ohjelmoinnin kannalta, mitä se merkitsee sinulle? Onko yksi tapa parempi kuin toinen? Tässä käydään läpi jokainen näistä ideoista ja annetaan esimerkkejä joitakin suunnittelu malli etuja, jotka voivat tulla niistä.
termit
ohjelmoinnissa implisiittisesti viitataan usein johonkin, joka on tehty sinulle muilla koodeilla kulissien takana., Eksplisiittinen on manuaalinen tapa toteuttaa toivomasi muutos kirjoittamalla selkeästi tehtävät ohjeet. Pienemmässä kuvassa implisiittiset ja eksplisiittiset ovat usein termejä, joita käytetään tyyppien valamisessa siihen tyyppiin, mikä se olisi. Isompi kuva, saatat olla puhumme yleissopimuksen yli kokoonpano, jossa yleissopimus on mitä on implisiittisesti tehty sinulle koodin pohja tai kehys, ja kokoonpano on yksinkertaisesti avointa asetukset.,
On myös eroja asianmukaisuuden tai hyötyä joko käyttää riippuen ohjelmointi kieli kysymys ja onko kieli on staattisesti kirjoitettu tai dynaamisesti kirjoitetaan. Se riippuu myös siitä, voidaanko asiat päätellä juoksuajasta vai koostamisen aikana. Koska nämä tekijät, joten väite, että yksi menetelmä on parempi kuin toinen voi vain olla totta sisällä kapea yhteyksissä, koska sinun täytyy ottaa huomioon suunnittelu ohjelmointikieliä ja ohjelmia kysymys.,
esimerkki implisiittinen ja eksplisiittinen tyyppimuunnos C on seuraava:
int implicit;implicit = 4.5;int explicit;explicit = (int)4.5;
Tässä muuttujan nimet implicit
ja explicit
oli määritelty tyyppi voi olla int
. Kun annetaan arvo 4.5
implisiittinen versio on kääntäjä muuntaa mitä normaalisti float-tai double-tyyppinen kokonaisluku katsoo, että nimenomainen versio on nimenomaisesti heittää se kokonaisluku, jossa käytetään (int)
on mitä heittää tyyppi.,
Staattisesti kirjoitettu kielellä
staattisesti kirjoitettu kielellä, kuten Ruoste valtaosa arvon luominen ja tehtävä on selkeä-tyyppinen kommentointi vaatimukset lukuun ottamatta, missä kääntäjä voi päätellä tyyppi. Seuraavassa on esimerkki osoittaa eksplisiittisiä ja implisiittisiä tyyppejä ruosteessa.
fn add_one(input: u8) -> u8 { input + 1}let four = add_one(3);
Tässä menetelmässä add_one
on selkeästi tulon tyyppi ja tiedostotyyppi., Numero 1
lisätään tässä on implisiittisesti tehty u8
numero kokoaminen aikaa kuin kontekstin avulla päätellä, tyyppi ja lisäksi u8
on toteutettu vain työskennellä u8
numerot. Viimeinen rivi on implisiittisesti kirjoitetaan olla u8
koska menetelmä itsessään määritellään tyyppi, joka palautetaan.
Mitä ruosteessa voi päätellä, on aika vaikuttavaa geneeristen aineiden käytön kanssa. Päättelyn käyttö rajoittuu kuitenkin asioihin, jotka voidaan tietää kokoamisajankohtana., Jos sitä ei voida tietää kokoamisajankohtana, sinun on nimenomaisesti määriteltävä tyyppi missä tahansa kohdekohdassa. Ota seuraava menetelmä määritelmä:
use std::ops::Add;fn add_both<T: Add>(a: T, b: T) -> T::Output { a + b}
Täältä T
voi olla mikä tahansa tyyppi, joka toteuttaa piirre Add
. T::Output
tyyppi on määritelty, kun Lisää piirre on määritelty erityinen tyyppi ja on yleensä sama tyyppi kuin T
itse tässä tapauksessa. Nyt jos Tarjoamme kaksi numeroa parametreina kääntäjä päättelee tyypin siihen.,
let x = add_both(3 , 4 ); // implicit typelet y: u8 = add_both(3u8 , 4u8 ); // explicit typelet z: u32 = add_both(3u32, 4u32); // explicit type
Kun ajaa edellä koodi x
on päätelty olevan tyyppi i32
. y
ja z
esimerkkejä vaativat input-parametri tyypit olla tiedossa, kun jotka toimivat päätellä, että T::Output
ei välttämättä ole sama kuin mitä T voi olla päätellä niin. Se olisi oletuksena i32
ja sitten määrittämällä i32
kuin u8
tai u32
on yksinkertaisesti väärä.,
Dynaamisesti kirjoitettu kielellä
Nyt dynaamisesti kirjoitettu kielellä, sinun täytyy huolehtia vähemmän siitä, tyypit, sinänsä, ja enemmän siitä, nimenomaisia tai implisiittisiä esineitä tai käyttäytymistä. Mallinnus koodin ympärillä esineitä, jotka ovat samoja käytös on mitä on tunnetaan duck typing joka on korkeampi domain ajattelu olio-ohjelmointi, jossa käsitellään niitä esineitä, on implisiittinen. Kun taas koodin mallinnus tiettyjen objektiluokkien ympärille muistuttaa paljolti eksplisiittistä tai implisiittistä kirjoittamista., Mutta kun hyväksyt minkä tahansa esineen syötteenä, kyseisen osion koodin on joko käsiteltävä eri objekteja nimenomaisesti tai luovuttava siitä vastuusta muualla.
selvennykseksi, kun kirjoitat koodia käsittelemään erilaisia asioita, niin kirjoitat eksplisiittistä koodia. Kuitenkin, kun tämä sama koodi on jo kirjoitettu ja olet uudelleenkäyttö se yksinkertainen menetelmä puhelu, sitten käyttäytyminen tässä uudessa tilanteessa on sitten implisiittinen. Implisiittisesti asioita tehdään ikään kuin automaattisesti ja käsitellään ulkopuolella nykyisen soveltamisalan.,
Rubyssa useimmilla tyypeillä on eksplisiittinen tai implisiittinen muunnos. Ajatus on implisiittinen konversio menetelmät ovat tarkoitettu käytettäväksi implisiittinen yhteyksissä ja avointa muunnokset ovat tarkoitettu kehittäjät voivat kirjoittaa inline paljon enemmän yhteyksissä. Haluan osoittaa tämän esimerkilläni.
# explicit"4".to_i + "5".to_i# => 9# implicitclass Seven def to_int 7 endendArray.new(Seven.new)# =>
Tässä selkeä esimerkki tekee siitä hyvin selvää lukijalle, että olemme muuntaa String
objektit Integer
objekti ja suorittamalla lisäksi näiden kahden välillä., Ja implisiittinen esimerkki ei ole niin itsestään selvää, että lukija Array.new
menetelmä epäsuorasti kutsuu to_int menetelmä siitä, mikä parametri on annettu. Kokonaisluku luokka on menetelmä to_int määritelty kussakin tapauksessa se, että yksinkertaisesti palata itse. Jos kirjoitat 42.to_int
et yksinkertaisesti saada takaisin 42
. Tämä implisiittisen muuntamisen käyttö menetelmäkutsujen syöttösuojana on erinomainen muotoilu tyyppiturvallisuudelle. Tässä on, mitä tapahtuu, jos annat sille vääränlaisen kohde tulo, joka ei määritellä to_int
.,
Array.new("32")# TypeError (no implicit conversion of String into Integer)
Ei vain se onnistu, mutta se antaa meille hyödyllinen viesti, että implisiittinen muuntaminen yritettiin ja kertoo luokan objekti annetaan ja luokan objektin, se odottaa. Implisiittinen muuntaminen menetelmiä Ruby on tapa sanoa tämä esine todella on mitä odotat. Ja eksplisiittinen muuntaminen on yksinkertaisesti tehdä muuntaminen tyyppi odotettu.
Rubylla on implisiittisiä ja eksplisiittisiä vaihtoehtoja monille sen ydinkohteille.,
Ruby on myös muutama luokat luokan menetelmiä, jotka ovat joko implisiittinen muuntaminen tai palauttaa nil ja että menetelmän nimi on try_convert
.
Voimme seurata Ruby on esimerkiksi Array.new
ja on hyvä vartija, millainen input parametrit, olemme antaneet suunnittelemalla implisiittiset muunnokset oman mukautetun tyyppejä. Tässä esimerkissä, koska to_f
on nimenomainen muuntaminen Float numero Ruby käytämme as_
etuliitteenä sen sijaan to_
., Tässä perusesimerkki implisiittisyydestä turvallisuuden mallina.
Nyt tämä auttaa muita kehittäjiä, jotka käyttävät Bar
luokka ei läpäise sitä niin yhteensopimaton parametri. Se seuraa yleissopimusta Rubyn kielellä ja sen pitäisi olla paljon helpompaa kehittäjille ymmärtää enemmän hyödyllisiä virheitä. Kun sinulla on muita esineitä, jotka haluat muuntaa Foo esine sitten voit määritellä as_f
tapa se nimenomainen muuntaminen ja kehittäjä, joka käyttää, että uusi esine tulee olla nimenomaisesti, sen käyttö Bar.new(Baz.new.as_f)
., Tämä varmistaa, että koodi toimii niin paljon kuin Bar
ja Foo
ovat jo töissä.
Tiivistelmä
teko implisiittinen ja eksplisiittinen koodaus, ja implisiittinen ja nimenomaista koodia, on määritelty yhteydessä suorittamisen tiedostojen käyttäytymistä tai tyypin asetus/valu. Erityisesti implisiittiset tai eksplisiittiset menetelmät määritellään niissä yhteyksissä, joissa niitä on tarkoitus käyttää. Implisiittinen koodi voi olla erittäin mukava kokemus, jos asiat ovat hyvin nimetty, koska se pitää asiat yksinkertaisina.,
kuitenkin implisiittinen koodi, koodin tekeminen kulissien takana sinulle, voi olla myös vaikea asia ratkaista, kun tehdään väärin. Avointa koodia tekee koodi selvää, kun katsot sitä tarkemmin, mitä on tehty on jo säädettyihin ennen ja sinun ei tarvitse jäljittää asioista muualla, mutta yleensä merkitsee paljon enemmän työtä sen kirjoittamisesta. Yksin se voi tulla ylivoimaiseksi, joten oikean tasapainon löytäminen näiden kahden välillä on usein paras ratkaisu. Ole selkeä, kun sinun täytyy, ja implisiittisesti, kun suunnittelu ja nimeäminen käsitteitä on helppo ymmärtää., Se tekee helpompaa kehitystä kokemus.