Ці з'яўляецца стварэнне асобных класаў для простых структур дадзеных з'яўляюцца празмернасцю ў Objective-C

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

Ніжэй прыведзены прыклад адказаў, атрыманых ад вэб-сэрвісу:

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

або

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

абоmore complex

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

I want to create separate class fабоeach response, e.g. NameResponse, TotalResponse, LocationInfoResponse and subclass them from Response class.

Я ўпэўнены, што ў Java, якая была б досыць кампактныя, каб стварыць некалькі класаў, але не ўпэўнены, Objective-C.

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

я думаю

response.name

лепш

json valueForKey: "name"

Ці не так?

Калі ласка, пастаўце як бы вы ў адказе і клас за кожны адказ з'яўляецца празмернасцю ў гэтым выпадку?

2

3 адказы

Для збору на імя-значэнне, слоўнік, аб'ект можа спатрэбіцца. Калі ваша праца ObjC здараецца на платформе Apple, разгледзім NSDictionary .

На самай справе, я здзіўлены ваш JSON парсер патрабуе пэўных класаў. JSON карты даволі чыста па класах какава - у вас ёсць NSDictionary для аб'ектаў, NSArray для масіваў, NSString і NSNumber для скаляраў.

3
дададзена
Не, я думаю, што гэта больш устойлівым да якое змяняецца схеме. Акрамя таго, дазваляе значна больш просты код парсера.
дададзена аўтар Seva Alekseyev, крыніца
Як вы думаеце, што справа з NSDictionary непасрэдна ў дынамічна выцягваць ўсе неабходныя ўласцівасці ад гэтага лепш і лягчэй, чым пакункі дадзеных на класы, а затым працаваць з класамі як аб'екты першага класа, і г.д.?
дададзена аўтар Vladimir, крыніца

Пасля ваша мадэль дадзеных выразна указана ніколі не залішне. І фармальныя тыпы дадзеных лепшы выгляд спецыфікацыі - яны ўжо рэалізаваны!

Калі адказы вэб-службы перадаюцца паміж пластамі прыкладання, выкарыстоўваць класы. Калі сфера іх выкарыстання дастаткова мала, NSDictionary можа быць прымальным.

3
дададзена
Маючы мадэль дадзеных выразна вызначана практычна гарантуе несумяшчальнасць з будучымі версіямі сэрвісу.
дададзена аўтар Seva Alekseyev, крыніца
Дакладна. Менавіта таму ОП цалкам верагодна, НЕ перспектыўная пратакол, і, калі будучыня раптам здарыцца ... упс! «Просты» у тэксце пытання з'яўляецца чымсьці паддаўкі.
дададзена аўтар Seva Alekseyev, крыніца
@SevaAlekseyev, «Просты», гэта праўда, і хлусня. Я на самой справе пачаў з простымі адказамі, які мае 1 ці 2 ўласцівасці, але ёсць і больш складанае злучэнне, як трэці адказ з дадзенымі пра месца.
дададзена аўтар Vladimir, крыніца
@Seva Versioning і сумяшчальнасць з'яўляецца складанай праблемай, з якой справа, верагодна, выходзіць за рамкі таго, што просіць ОП, і павінен разглядацца пры праектаванні службы з самага пачатку. Якія структуры менавіта кліент WS будзе распакаваць адказ у не будзе ні зрабіць перапынак або сумяшчальнасць. (У адрозненне ад <�я> як будзе распакаваць яго, як якое адсутнічае/староннія значэння апрацоўваюцца, як менавіта будзе адказ будзе выкарыстоўвацца ў далейшым, і г.д.)
дададзена аўтар millimoose, крыніца
@Seva Я таксама мяркуючы, што OP знаходзіцца пад кантролем службы і што гэта адзіная мэта складаецца, каб пракарміць аднаго кліента, на выпадак выкарыстання, які патрабуе менш futureproofing чым апублікаваны вэб-інтэрфейсы, прызначаных для шырокага спажывання.
дададзена аўтар millimoose, крыніца
Асноўная праблема з выкарыстаннем ObjC слоўнікаў для захоўвання JSON з'яўляецца тупым сінтаксіс патрабуецца як набор і атрымаць ад іх дадзеныя. Дынамічны мову як ObjC проста напрошваецца на больш элегантныя апрацоўкі дынамічнага DDL-х.
дададзена аўтар Perception, крыніца

Objective-C класы не цяжкія, падкласы не праблема прадукцыйнасці. Вы можаце стварыць абстрактны клас і змясціць свае базавыя поля там. Тады падкласы па меры неабходнасці дадаваць палі, атрыманне ў спадчыну, як гэта мае сэнс па шляху.

У залежнасці ад вашых патрэбаў, проста разбору JSON ў якасці NSArray/NSDictionary можа працаваць нармальна. Вы можаце выкарыстоўваць valueForKeyPath: , каб хадзіць шляхамі і атрымаць канкрэтныя значэння з каранёвай калекцыі. Я лічу гэтае рашэнне элегантны складаных калекцый, якія выкарыстоўваюць цяжкую кампазіцыю. Выкарыстоўвайце #define або канстантнасцю , каб стварыць ключы шляху, каб яны лёгка змяніць, і вы можаце атрымаць час кампіляцыі праверкі вашых ключоў.

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

3
дададзена