Jak MVC v Kakau vypadá doopravdy? - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Odkud pochází fotografka Anne Erhard?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Software

Jak MVC v Kakau vypadá doopravdy?

30. srpna 2005, 00.00 | V minulém dílu našeho seriálu o programování v Cocoa jsme si ukázali koncepci MVC – Model, View, Controller – jíž správně navržené objektové aplikace odpovídají, a jíž jsou také "na míru" šity služby standardních tříd AppKitu. Než se ale pustíme do popisu těchto konkrétních tříd, vyplatí se ukázat si ještě jeden příklad velmi jednoduché aplikace.

V minulém dílu našeho seriálu o programování v Cocoa jsme si ukázali koncepci MVC – Model, View, Controller – jíž správně navržené objektové aplikace odpovídají, a jíž jsou také "na míru" šity služby standardních tříd AppKitu. Než se ale pustíme do popisu těchto konkrétních tříd, vyplatí se ukázat si ještě jeden příklad velmi jednoduché aplikace.

Jde o to, že minule jsme si sice ukázali koncepční příklad kódu, odpovídajícího struktuře MVC, a na jeho základě – aspoň doufám ☺ – bylo snadné pochopit, jak MVC a vzájemné vazby v jeho rámci fungují. Nicméně... tak, jak jsme si to ukázali, se v "Kakau" už dávno neprogramuje: bylo by to poněkud značně nepohodlné.

Dnes si proto ukážeme aplikaci sice triviální, ale zato – aspoň zhruba – odpovídající tomu, jak se v současném vývojovém prostředí aplikace vytvářejí: pro model použijeme služby Core Data, pro kontrolér bindings, a nebude zapotřebí napsat ani jediný řádek v Objective C (ale tím se zase, samozřejmě, budeme zabývat v příštích dílech našeho seriálu ☺). "Naprogramujeme" si to nejjednodušší možné účetnictví – jen přehled účtů a transakcí na nich.

Projekt

Nechceme aplikaci, jež pracuje s dokumenty; v našem případě budeme kompletní data udržovat někde na jediném místě (samozřejmě bychom v případě skutečné aplikace časem přidali služby pro import a export v různých formátech). Spustíme Xcode, vyžádáme si vytvoření nového projektu, a vybereme tedy vzor "Core Data Application".

Xcode automaticky připraví aplikaci, obsahující vše potřebné (dokonce, jak uvidíme za chvilku, i kód, který data při spuštění aplikace načte z disku a před ukončením aplikace na něj změny opět ukládá).

Model

Začneme sestavením datového modelu. Datové modelování a jeho využití je – jako systém Core Data – novinkou Mac OS X Tiger; my se mu budeme později věnovat v mnohem podrobnější podobě. Dnes si ale řekneme jen naprosté základy.

Modelování je založeno na klasických datových "ER" modelech – modelech založených na "entitách" a "relacích". Entita je v zásadě datový objekt, či lépe řečeno, jeho popis (můžeme si představit, že entita je "třída", a konkrétní datový objekt je "její instance": nezřídka tomu tak skutečně bývá, jakkoli v našem dnešním jednoduchém případě nikoli). Jsme-li zvyklí pracovat s klasickými databázemi, entita zhruba odpovídá tabulce (a konkrétní datové objekty pak jejím řádkům).

Relace mezi entitami odpovídají vztahům: entita může obsahovat odkaz na jinou (relace 1:1), nebo na řadu jiných (1:N). To znamená, že z datového objektu prvé entity můžeme získat datový objekt (1:1) nebo pole datových objektů (1:N) té druhé.

My dnes nadefinujeme docela triviální datový model: bude obsahovat jen dvě entity, Account a Transaction. Ta prvá bude mít atributy bank a number (číslo účtu), pro zjednodušení budou oba typu "string". Druhá entita Transaction pak bude mít atribut title typu "string" – popis transakce – a atribut amount typu "decimal" – částku, jíž transakce odpovídá. (Samozřejmě, v reálném případě bychom zavedli atributů mnohem více, ale pro ukázku základní koncepce nám to stačí).

Mezi entitami definujeme relaci account z Transaction do Account – relace 1:1, jež pro danou transakci určí, ke kterému z účtů se vztahuje; a relaci k ní inversní: transactions z Account do Transaction – ta bude samozřejmě 1:N, neboť pro daný účet vrátí seznam všech relací, jež mu patří.

Práce s editorem modelů v Xcode je jednoduchá a intuitivní: vložíme entity, určíme jejich atributy, a navážeme mezi nimi obě relace. Nezapomeneme určit, že relace jsou vzájemně inversní:

Součástí modelu je samozřejmě také kód, který jej čte z disku a zapisuje na disk. Ten bychom museli napsat sami... nebýt toho, že vzor projektu "Core Data Application" již takovýto kód obsahuje za nás: systém Xcode nám připravil třídu ExtremelySimpleAccAppDelegate, jež se postará o načtení a uložení modelu podle potřeby. Jediná změna, jež je zapotřebí (nebo přinejmenším vhodná), je doplnění jména aplikační složky z názvu aplikace – v našem případě "ExtremelySimpleAcc" – na reversní DNS (např. tedy "cz.ocs.ExtremelySimpleAcc"), jež je zaručeně bezkonfliktní:

- (NSString *)applicationSupportFolder {
    NSString *applicationSupportFolder = nil;
    FSRef foundRef;
    OSErr err = FSFindFolder(kUserDomain, kApplicationSupportFolderType,
      kDontCreateFolder, &foundRef);
    if (err != noErr) {
        NSRunAlertPanel(@"Alert", @"Can't find application support folder", @"Quit", nil, nil);
        [[NSApplication sharedApplication] terminate:self];
    } else {
        unsigned char path[1024];
        FSRefMakePath(&foundRef, path, sizeof(path));
        applicationSupportFolder = [NSString stringWithUTF8String:(char *)path];
        applicationSupportFolder = [applicationSupportFolder
          stringByAppendingPathComponent:@"cz.ocs.ExtremelySimpleAcc"];
    }
    return applicationSupportFolder;
}

(Mimochodem... bez kódu nízké úrovně, uvedeného nahoře – FSFindFolder, FSRefMakePath, kvůli nimž se dokonce užívá taková prehistorická "ošklivost", jako pole znaků s fixní délkou pro jméno souboru – bychom se dokázali obejít; když už nám jej ale vývojový systém vygeneroval, nebudeme jej zbytečně "čistit".)

Tím je model kompletně hotov. Zbývá nám sestavit grafické uživatelské rozhraní aplikace a určit vazby mezi ním a modelem pomocí kontrolérových objektů a systému bindings. To si ukážeme příště.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: