Is het maken van afzonderlijke klassen voor eenvoudige gegevensstructuren overkill in Objective-C

I am creating simple web-service client inobjective-cand found that creating separate class fofeach kind of web-service's response could be overkill. Perhaps this becauseobjective-chas two files - H&M.

Hier is een voorbeeld van de antwoorden van webservice:

{"name": "John", status: "OK"}

of

{"total": "5500", status: "OK"}

ofmore complex

{"location": {"x": "140", "y": "90", "z": "0"}, 
 "color": "red", status: "OK"}

I want to create separate class fofeach response, e.g. NameResponse, TotalResponse, LocationInfoResponse and subclass them from Response class.

Ik ben er zeker van dat het in Java vrij compact zou zijn om wat klassen te maken, maar niet zeker van Objective-C.

UPDATE 1 One reason to use classes over NSDictionary is that code is more safe and better defined, e.g.:

I denk

response.name

is beter dan

json valueForKey: "name"

Is het niet?

Kunt u alstublieft aangeven hoe u dit in het antwoord zou doen en is een klasse per antwoord in dit geval overdreven?

2

3 antwoord

Voor een verzameling naam/waarde kan een woordenboekobject handig zijn. Als uw ObjC-werk toevallig op een Apple-platform staat, overweeg dan NSDictionary .

Ik ben zelfs verrast dat je JSON-parser specifieke klassen vereist. JSON kaarten behoorlijk netjes op de Cocoa klassen - je hebt je NSDictionary voor objecten, NSArray voor arrays, NSString en NSNumber voor scalars.

3
toegevoegd
Nee, ik denk dat het stabieler is voor het zich ontwikkelende schema. Zorgt ook voor veel eenvoudiger parser-code.
toegevoegd de auteur Seva Alekseyev, de bron
Denkt u dat het direct en op een dynamische manier omgaan met de NSDictionary alle nodige eigenschappen eruit halen beter en lichter is dan het omzetten van gegevens in klassen en dan werken met klassen als eersteklas objecten, enz.?
toegevoegd de auteur Vladimir, de bron

Het is nooit overdreven om uw datamodel duidelijk te specificeren. En formele gegevenstypen zijn de beste soort specificatie - ze zijn al geïmplementeerd!

Als de antwoorden van de webservice worden overgedragen tussen de lagen van uw toepassing, gebruikt u klassen. Als de omvang van hun gebruik klein genoeg is, kan een NSDictionary acceptabel zijn.

3
toegevoegd
Het duidelijk gespecificeerd hebben van uw gegevensmodel garandeert bijna een onverenigbaarheid met toekomstige versies van de dienst.
toegevoegd de auteur Seva Alekseyev, de bron
Rechts. Dat is precies waarom het OP vrij waarschijnlijk NIET toekomstbestendig is van het protocol, en wanneer de toekomst plotseling gebeurt ... oeps! "Eenvoudig" in de vraagtekst is iets van een weggeefactie.
toegevoegd de auteur Seva Alekseyev, de bron
@SevaAlekseyev, "Eenvoudig", dit is waar en onwaar. Ik ben eigenlijk begonnen met eenvoudige antwoorden die 1 of 2 eigenschappen hebben, maar er is een complexere samenstelling zoals de derde reactie met locatiegegevens.
toegevoegd de auteur Vladimir, de bron
@Seva Versiebeheer en compatibiliteit is een lastig onderwerp dat waarschijnlijk buiten het bestek valt van wat het OP vraagt, en moet worden aangepakt bij het ontwerpen van de service om mee te beginnen. Wat precies een WS-client structureert, zal een antwoord ontmaskeren en compatibiliteit niet veroorzaken of verbreken. (In tegenstelling tot hoe het zal ontmaskeren, hoe ontbrekende/externe waarden worden behandeld, hoe precies zal de reactie verder worden gebruikt, etc.)
toegevoegd de auteur millimoose, de bron
@Seva Ik ga er ook van uit dat het OP de controle heeft over de service en dat het alleen maar de bedoeling is om deze ene client te voeden, een use-case die minder toekomstbestendig is dan gepubliceerde web-API's die zijn ontworpen voor een breed gebruik.
toegevoegd de auteur millimoose, de bron
Het primaire probleem met het gebruik van ObjC-woordenboeken om JSON op te slaan, is de stompzinnige syntaxis die vereist is om zowel gegevens in te stellen als er gegevens uit te halen. Een dynamische taal zoals ObjC smeekt gewoon om een ​​elegantere afhandeling van dynamische DDL's.
toegevoegd de auteur Perception, de bron

Objectief-C-klassen zijn niet zwaar, subclassering is geen prestatieprobleem. Je zou een abstracte klasse kunnen maken en je basisvelden daarin kunnen plaatsen. Subklasse vervolgens zo nodig om velden toe te voegen, die het erven omdat het onderweg zinvol is.

Afhankelijk van je behoeften kan het eenvoudig werken van de json in een NSArray/NSDictionary goed werken. U kunt dan valueForKeyPath: gebruiken om paden te lopen en specifieke waarden uit uw rootcollectie te halen. Ik vind deze oplossing elegant op complexe collecties die een zware compositie gebruiken. Gebruik #define of const om de padtoetsen aan te maken, zodat ze gemakkelijk kunnen worden gewijzigd en u de compileertijdvalidatie van uw sleutels kunt krijgen.

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html#//apple_ref/occ/instm/NSObject/valueForKeyPath:

3
toegevoegd