szoftver létrehozásakor hasznos megérteni a tervezési elvek széles skáláját. A legmegfelelőbb elvvel rendelkező rendszer megtervezésének megértése számtalan órányi fejlesztést és fejfájást takaríthat meg.

először beszéljünk egy kicsit az öröklésről. Öröklődés az, amikor egy osztály örökli az állapotot és / vagy viselkedést a szülő osztálytól. Tegyük fel, hogy tervezünk egy játékot, és szükségem van egy kutyára:

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

egy idő után rájövünk, hogy szoftverünknek, mint mindennek, macskákra van szüksége, ezért létrehozunk egy Macskaosztályt:

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

mivel a természet hív, hozzátesszük .poop () a macska és a kutya osztály:

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

ebben a példában két állat van, amelyek képesek kakilni. Sajnos mindkettő implementációt biztosít a poop() számára, tehát itt van némi kódmásolás. szóval emeljük .poop () egy közös állat osztály.

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

most, hogy van egy csomó állat kakil mindenhol, szükségünk van egy cleaningrobot:

CleaningRobot
.drive()
.clean()

szüksége van egy gyilkossági robotra is .meghajtó () és .öld meg() a macskák és kutyák, amelyek .kaki () ing az egész fehér padló:

MurderRobot
.drive()
.kill()

azóta .drive () most duplikált között CleaningRobot és MurderRobot hozunk létre egy Robot osztály, hogy azt.

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

így néz ki az egész szerkezet:

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

“a vevőink követelnek egy Murderrobotdogot. Képesnek kell lennie rá .megöl (),.hajtás (),.bark (), de nem tud kakilni ().

és most, megszívtuk. Egyszerűen nem tudjuk szépen beilleszteni a Gyilkosrobotdogot ebbe az öröklési hierarchiába. Létrehozhatunk egy új szülőobjektumot, ahol az összes megosztott funkciót elhelyezheti:

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

de ez azt jelenti, hogy a tárgyak egy csomó funkciót, hogy nem használják, így a végén egy Gorilla/banán probléma — kérsz egy banánt, de a végén egy gorilla kezében a banán és az egész dzsungelben vele.

ezt azonban Swift protokollokkal modellezhetjük.Hogyan lehet a protokollok jobb absztrakciót biztosítani?

a Swift protokollja meghatározza azokat a módszereket vagy tulajdonságokat, amelyeket egy osztály elfogadhat. Íme egy példa:

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

mivel az osztályok több protokollt is elfogadhatnak. A MurderRobotDog osztály elfogadja a Barker, Killer and driverprotokollt, ami azt jelenti, hogy a MurderRobotDog osztály implementációkat biztosít a bark(), kill(), and clean()számára.

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

a Swift 2.0 – tól mostantól eltávolíthatjuk a kód duplikációját azáltal, hogy alapértelmezett megvalósítást biztosítunk egy protokoll kiterjesztés használatával:

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

tehát megnéztünk egy példát egy öröklődési fára, amely lerobbant, majd megvizsgáltuk, hogyan kell átalakítani a protokoll(interfész) használatával.

a kérdés, hogy valószínűleg a fejedben most — mikor kell használni mindegyiket? Nos … a fejlesztők túlnyomó többsége egyetért abban, hogy előnyben kell részesítenünk az interfészt az öröklés felett. Sokan azt fogják mondani, hogy ha valaminek van “egy” kapcsolata, akkor örökséget kell használnia. Például Mattias ” egy ” ember, így örökölhetem az embert. Ha a kapcsolat ” van ” jellegű, például egy autónak “van” motorja, akkor kompozíciót kell használnia.

következtetés

a rendszer tervezésekor fontos, hogy kiválassza a modelljének megfelelő tervezési elvet. Sok körülmények között, ez csak jobb használni felület az első helyen. Rugalmasabb, erősebb, és nagyon könnyen elvégezhető.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.