[Alg] Hoe deze class op te bouwen?

Pagina: 1
Acties:

  • Harm
  • Registratie: Mei 2002
  • Niet online
In mijn iOS-app heb ik een class met de volgende definitie:
Swift:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Achievement {
    enum Achievement {
        case MoneySaved
        case ObjectsBuilt
    }
    
    var type: Achievement
    var description = String()
    var threshold = Double()
    
    init(type: Achievement, description: String, threshold: Double) {
        self.type = type
        self.description = description
        self.threshold = threshold
    }
}

Elders gebruik ik deze class als volgt:
Swift:
1
2
var monetaryAchievements = [Achievement]()
var objectAchievements = [Achievement]()

Is dat logisch? Of is het beter om 'type' weg te laten en de class Achievement te subclassen? Of is het juist praktischer om 'type' weg te laten in de class Achievement en puur en alleen in de naam van de array (zie laatsgenoemde codevoorbeeld) het type terug te laten komen. Oftewel, waar doe ik goed aan?

[ Voor 4% gewijzigd door Harm op 16-09-2015 14:55 ]


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Als je achievements ook eigen gedrag implementeren dan zou ik subclassen, anders zou ik voor een type enum gaan.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • +1 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Ik zou de enum helemaal weglaten... en dan kom je al snel uit op een struct:

Swift:
1
2
3
4
5
6
7
8
9
10
11
12
struct Achievement {
    var description: String
    var threshold: Double
    
    init(description: String, threshold: Double) {
        self.description = description
        self.threshold = threshold
    }
}

var monetaryAchievements: [Achievement] = []
var objectAchievements: [Achievement] = []


Anders ben je alleen maar dubbele boekhouding aan 't doen. Wat je ook zou kunnen doen is ze allemaal in één array stoppen, en dan twee extra get-properties:

Swift:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct Achievement {
    enum Achievement {
        case MoneySaved
        case ObjectsBuilt
    }
    
    var type: Achievement
    var description: String
    var threshold: Double
    
    init(type: Achievement, description: String, threshold: Double) {
        self.type = type
        self.description = description
        self.threshold = threshold
    }
}

class Profile {
    var achievements: [Achievement] = []
    
    var monetaryAchievements: [Achievement] {
        return achievements.filter { $0.type == .MoneySaved }
    }
    
    var objectAchievements: [Achievement] {
        return achievements.filter { $0.type == .ObjectsBuilt }
    }
}

  • Harm
  • Registratie: Mei 2002
  • Niet online
Grijze Vos schreef op woensdag 16 september 2015 @ 16:34:
Als je achievements ook eigen gedrag implementeren dan zou ik subclassen, anders zou ik voor een type enum gaan.
Goed punt! Dat is echter niet het geval, elke achievement is hetzelfde, alleen dus met een andere type. Als dat wel het geval wordt, moet ik inderdaad gaan subclassen.
chris schreef op woensdag 16 september 2015 @ 17:22:
Ik zou de enum helemaal weglaten... en dan kom je al snel uit op een struct:
Die optie had ik nog niet bedacht, maar is als het om een hele eenvoudige class gaat best goed toepasbaar. Het grote verschil zit dan dus in de naam van de variabele en niet zozeer in de inhoud van die variabele. Dat vind ik toch niet heel sterk, gezien de volatiliteit van variabelenamen (geen heel sterk argument ;-) ).
chris schreef op woensdag 16 september 2015 @ 17:22:
Wat je ook zou kunnen doen is ze allemaal in één array stoppen, en dan twee extra get-properties:
Ik ga voor deze optie kiezen. Waarom? Omdat die Achievements allemaal hetzelfde zijn, alleen van een ander type, maar dat maakt ze niet wezenlijk anders. Ze allemaal in één array stoppen is daarmee heel logisch, met name omdat ze zo ook filterbaar zijn—wat ik nog niet kende.

Dank!