Qual è lo schema che utilizza più istanze anziché più classi chiamate? Quando lo userei?

0

A volte trovo utile avere una singola classe con più istanze (configurate in modo diverso tramite le loro proprietà), piuttosto che più classi (ereditarietà).

??? Modello

  • Classe singola (Frutta)
  • Diversi tipi di frutta sono istanze di Fruit, con proprietà configurate correttamente.
  • Comportamento implementato come blocchi.

class Fruit {
    var name: String
    var color: UIColor
    var averageWeight: Double
    var eat: () -> ()
}

class FruitFactory {
    static func apple() -> Fruit {
        let fruit = Fruit()
        fruit.name = "Apple"
        fruit.color = UIColor.redColor()
        fruit.averageWeight = 50
        fruit.eat = {
            washFruit(fruit)
            takeBite(fruit)
        }
        return fruit
    }

    static func orange() -> Fruit {
        let fruit = Fruit()
        fruit.name = "Orange"
        fruit.color = UIColor.orangeColor()
        fruit.averageWeight = 70
        fruit.eat = {
            peelFruit(fruit)
            takeBite(fruit)
        }
        return fruit
    }
}

Modello di ereditarietà

Per riferimento, lo stesso avrebbe potuto essere implementato usando l'ereditarietà:

  • Classi multiple (frutta, mela, arancione)
  • Diversi tipi di frutta sono classi che ereditano da Fruit .
  • Comportamento implementato usando metodi standard che sono sovrascritti in sottoclassi.

class Fruit {
    var name: String
    var color: UIColor
    var averageWeight: Double
    func eat() {
        // abstract method
    }
}

class Apple: Fruit {
    var name = "Apple"
    var color = UIColor.redColor()
    var averageWeight = 50

    override func eat() {
        washFruit(self)
        takeBite(self)
    }
}

class Orange: Fruit {
    var name = "Orange"
    var color = UIColor.orangeColor()
    var averageWeight = 70

    override func eat() {
        peelFruit(self)
        takeBite(self)
    }
}

class FruitFactory {
    static func apple() -> Fruit {
        return Apple()
    }

    static func orange() -> Fruit {
        return Orange()
    }
}

Qual è il primo pattern chiamato?

Esistono risorse per aiutarmi a decidere quando utilizzare uno di questi modelli rispetto all'altro?

Al di sopra della mia testa, posso pensare ad almeno un motivo per preferire l'ereditarietà:

  • Immagina di dover aggiungere una nuova proprietà ad Apple, ma non a Orange (ad esempio averageCoreWeight ). Se usi l'ereditarietà, questo è banale. Se usi il primo pattern, ti verrà lasciata una proprietà che viene usata solo a volte.
posta Senseful 15.10.2015 - 02:24
fonte

2 risposte

1

What is the first pattern called?

Il primo modello sembra essere il modello di strategia travestito da Pattern di fabbrica . Presumo che il tuo obiettivo è di avere oggetti diversi conformi all'interfaccia di un Fruit, eventualmente implementando diversi algoritmi e valori per i membri.

the strategy pattern (also known as the policy pattern) is a software design pattern that enables an algorithm's behavior to be selected at runtime.

Protocolli in Swift (chiamati Interfaces in molti altri lingue) sono spesso utilizzate per il modello di strategia, poiché le classi che implementano un protocollo non devono altrimenti avere nulla in comune. Non devono derivare dalla stessa classe base o avere gli stessi membri (diversi da quello che definisce il protocollo).

Are there any resources to help me decide when to use one of these patterns over the other?

Il modo principale per aiutarti a decidere sull'applicazione di un pattern è innanzitutto conoscere i vari pattern. Esistono numerosi libri e risorse online dove i modelli sono catalogati e spiegati. La ricerca di modelli di progettazione software è un buon inizio.

Dopo aver appreso un modello interessante, esperienza e giudizio entrano in gioco nel decidere dove usarlo. È una trappola cercare di applicare un dato schema indiscriminatamente. Tuttavia, la prospettiva di provare qualcosa di nuovo è la chiamata di una sirena che spesso ci porta a scegliere un modello prima che il problema si presenti. Fai meglio di me ed evita questo errore.

    
risposta data 15.10.2015 - 23:43
fonte
1

Quando hai un oggetto di base che poi crei copie modificate, stai utilizzando il modello di prototipo . L'oggetto originale (il Fruit in questo caso) funge da modello prototipo da cui si costruiscono i singoli frutti. Poiché derivano tutti dalla classe Fruit originale, hanno una relazione ereditarietà prototipica (come originariamente notato da < a href="https://softwareengineering.stackexchange.com/users/33157/coredump"> @coredump ).

Non si specifica quale lingua si sta usando, ma Javascript è costruito interamente utilizzando il modello prototipo piuttosto che il modello classico per l'ereditarietà.

    
risposta data 16.10.2015 - 00:43
fonte

Leggi altre domande sui tag