ohjelmistoa luotaessa on hyödyllistä ymmärtää monenlaisia suunnitteluperiaatteita. Ymmärtäminen, miten suunnitella järjestelmä sopivin periaate voi säästää lukemattomia tunteja kehitystä ja päänsärkyä.

puhutaan ensin vähän perinnöstä. Periytyminen on kun Luokka perii tilan ja / tai käyttäytymisen vanhemmalta luokalta. Sanotaan, että suunnittelemme peliä ja tarvitsen Koiran.:

class Dog {
func bark(){
print("Bark")
}
}

jonkin ajan kuluttua ymmärrämme, että ohjelmistomme, kuten kaikki, tarvitsee kissoja, joten luomme Kissaluokan:

class Cat{
func .meow(){
print("Meow!")
}
}

koska luonto kutsuu, lisätään .kakka () kissa ja koira-luokkaan:

class Dog {
func bark(){
print("Bark")
}
func poop(){
print("Poop")
}
}class cat{
func meow(){
print("Meow")
}
func poop(){
print("Poop")
}
}

tässä esimerkissä meillä on kaksi eläintä, jotka pystyvät kakkaamaan. Valitettavasti molemmat tarjoavat toteutuksia poop(): lle, joten tässä on jonkin verran koodikopiointia. joten nostamme .kakka () yhteiseen Eläinluokkaan.

Animal
.poop()Dog
.bark()Cat
.meow()

nyt kun kaikkialla on paljon eläimiä kakkimassa, tarvitaan siivoustrobotti:

CleaningRobot
.drive()
.clean()

tarvitset myös Murderrobotin, joka voi .drive () ja .tappaa () kissat ja koirat, jotka ovat .kakkaa () pitkin valkoisia lattioita:

MurderRobot
.drive()
.kill()

lähtien .drive () on nyt monistettu CleaningRobot ja MurderRobot luomme robotti luokan laittaa se.

Robot
.drive()CleaningRobot
.clean()MurderRobot
.kill()

tältä koko rakennelma näyttää:

Robot
.drive()CleaningRobot
.clean()MurderRobot
.kill()Animal
.poop()Dog
.bark()Cat
.meow()

”Asiakkaamme vaativat Murderrobotdogia. Sen on pystyttävä siihen .tappaa(), .asema(), .kuori (), mutta se ei voi kakata ().

Ja nyt ollaan kusessa. Emme yksinkertaisesti voi sovittaa Murderrobotdogia mukavasti tähän perintöhierarkiaan. Voisimme luoda uuden vanhemman objektin, johon laitat kaikki Jaetut toiminnot:

GameObject
.bark()Robot
.drive()CleaningRobot
.clean()MurderRobot
.kill()MurderRobotDogAnimal
.poop()DogCat
.meow()

mutta se tarkoittaa, että esineissä on tonneittain toimintoja, joita ne eivät käytä, joten päädyt Gorilla/banaani — ongelmaan-pyydät banaania, mutta päädyt gorillan pitelemään banaania ja koko viidakkoa sen kanssa.

tätä voidaan kuitenkin mallintaa Swiftin protokollilla.Miten protokollat voivat tarjota parempaa abstraktiota?

Swiftin protokolla määrittelee menetelmät tai ominaisuudet, jotka luokka voi sitten ottaa käyttöön. Tässä on esimerkki:

protocol Barker {
func bark()
}
protocol Pooper {
func poop()
}
protocol Driver {
func drive()
}
protocol Cleaner {
func clean()
}
protocol Killer {
func kill()
}

koska luokat voivat hyväksyä useita protokollia. MurderRobotDog-Luokka omaksuu Barker, Killer and driver – protokollan, eli MurderRobotDog-luokka tarjoaa toteutuksia bark(), kill(), and clean(): lle.

class MurderRobotDog: Barker,Killer, Driver{
func bark() {
print("Bark!")
}
func driver() {
print("Drive!")
}
func killer() {
print("Kill!")
}}

Swift 2.0: sta lähtien voimme nyt poistaa koodin päällekkäisyyden antamalla oletustoteutuksen protokollalaajennuksen avulla:

protocol Barker {
func bark()
}
extension Barker {
func bark() {
print("Bark!")
}
}class Dog: Barker{}
let myDog = Dog()
myDog.bark() // prints "Bark!"

joten olemme tarkastelleet esimerkkiä perintöpuusta, joka hajosi, ja sitten katsoimme, miten sen uudelleenjärjestely käytetään protokollaa(käyttöliittymä).

kysymys, joka lienee nyt mielessäsi, on — milloin käyttää jokaista? No … valtaosa kehittäjistä on samaa mieltä siitä, että meidän pitäisi suosia käyttöliittymää perinnön sijaan. Moni sanoo, että jos jollain on ”on” – suhde, kannattaa käyttää perintöä. Esimerkiksi Mattias ” on ” mies, joten voin periä miehen. Jos suhde on” on ”luonteeltaan, kuten auton” on ” Moottori, sinun pitäisi käyttää koostumusta.

johtopäätös

järjestelmää suunniteltaessa on tärkeää valita oikea suunnitteluperiaate mallilleen. Monissa olosuhteissa, se on vain parempi käyttää käyttöliittymä ensinnäkin. Se on joustavampi, tehokas, ja se on myös erittäin helppo tehdä.

Vastaa

Sähköpostiosoitettasi ei julkaista.