Avatar billede Droa Seniormester
31. august 2016 - 18:09 Der er 6 kommentarer og
1 løsning

Interface til og læse fra en filstruktur

Hej Eksperter

Jeg ville gerne lave et godt og robust interface til og læse en fil struktur, men jeg har ingen ide om hvor jeg skal starte, og om der findes et Design til det i forvejen.

Ideen er at jeg har en fil Roster, i rod mappen, som linker alle underliggende filer sammen.

Roster.xml
- Item000
- - VCard.xml
- - Bookmarks.xml
- - History.xml
- Item001
- - VCard.xml
- - Bookmarks.xml
- - History.xml

....

findes der en måde og manage de filer med et interface, hvor den loader dem ind i hukommelsen, checker hvis filen er opdateret udefra, og gemmer ændringer i filerne igen?

hvis ikke, hvordan burde ens fremgangmåde være og lave sådan et interface?

på forhånd tak
Avatar billede arne_v Ekspert
31. august 2016 - 18:30 #1
Jeg er ikke sikker paa hvad du soeger.

Et C# interface er vel naesten givet af din problem beskrivelse.


public interface IStorage
{
    void LoadAllFromDisk();
    void MergeUpdatesFromDisk();
    void SaveUpdatesToDisk();
}
Avatar billede Droa Seniormester
31. august 2016 - 21:56 #2
snakkede mere om funktionaliteten bag interface, da et interface vel er ubrugeligt uden :)
Avatar billede arne_v Ekspert
01. september 2016 - 00:22 #3
Ah. Et design til en implementation bag ved interfacet.

Hmm - jeg taenker lige lidt pg poster nogle tanker senere.
Avatar billede Droa Seniormester
01. september 2016 - 00:40 #4
Mine egne tanker var og loade alle XmlDocumenter ind i mit Item Object, og have en liste med alle Item Objecter, der så styres af en Controller, hvis jeg ikke fejler i og forstå hvad Controller navnet kan bruges til.

så f.eks alle Load/Save/Merge Mathoder styres af RosterController classen, der bruger en Builder til og danne Item objekterne, med mine XmlDocument's?

dog er Builder designet ikke så godt til er opdatere dens data tror jeg, og det er lidt der jeg ikke kan komme videre.
Avatar billede Droa Seniormester
01. september 2016 - 00:44 #5
pseudo kode

class RosterController{
  private List<Item> _items
    ctor RoseterController(roster.xml){
          foreach(item in roster.xml){
                var newitem = new ItemBuilder(item.path).AddDefaultVCardFile().AddDefaultBookmarks().AddDefaultHistory().Build()
                _items.Add(newitem)
}
}
}
Avatar billede arne_v Ekspert
01. september 2016 - 02:14 #6
Tanker indtil videre:


using System;
using System.Collections.Generic;

namespace Foobar.DomainModel
{
    public abstract class Persistable
    {
        public bool Dirty { get; set; }
    }
    public class Rooster : Persistable
    {
        // some properties where set also sets Dirty
        public List<Item> Items { get; set; }
    }
    public class Item : Persistable
    {
        // some properties where set also sets Dirty
        public VCard VCard { get; set; }
        public Bookmarks Bookmarks { get; set; }
        public History History { get; set; }           
    }
    public class VCard : Persistable
    {
        // some properties where set also sets Dirty   
    }
    public class Bookmarks : Persistable
    {
        // some properties where set also sets Dirty   
    }
    public class History : Persistable
    {
        // some properties where set also sets Dirty   
    }
}

namespace Foobar.Persist.API
{
    using Foobar.DomainModel;
    public interface IPersister
    {
        Rooster LoadAll();
        void MergeUpdates(Rooster rooster);
        void SaveUpdates(Rooster rooster);
    }
}

namespace Foobar.Persist.Common
{
    using Foobar.DomainModel;
    using Foobar.Persist.API;
    public abstract class PersisterBase : IPersister
    {
        public Rooster LoadAll()
        {
            Rooster rooster = LoadRooster();
            rooster.Items = LoadItems(rooster);
            foreach(Item itm in rooster.Items)
            {
                itm.VCard = LoadVCard(rooster, itm);
                itm.Bookmarks = LoadBookmarks(rooster, itm);
                itm.History = LoadHistory(rooster, itm);
            }
            return rooster;
        }
        public abstract Rooster LoadRooster();
        public abstract List<Item> LoadItems(Rooster rooster);
        public abstract VCard LoadVCard(Rooster rooster, Item itm);
        public abstract Bookmarks LoadBookmarks(Rooster rooster, Item itm);
        public abstract History LoadHistory(Rooster rooster, Item itm);
        public void MergeUpdates(Rooster rooster)
        {
            // TODO   
        }
        public void SaveUpdates(Rooster rooster)
        {
            foreach(Item itm in rooster.Items)
            {
                if(itm.VCard.Dirty)
                {
                    SaveVCard(rooster, itm, itm.VCard);
                }
                if(itm.Bookmarks.Dirty)
                {
                    SaveBookmarks(rooster, itm, itm.Bookmarks);
                }
                if(itm.History.Dirty)
                {
                    SaveHistory(rooster, itm, itm.History);
                }
                if(itm.Dirty)
                {
                    SaveItem(rooster, itm);
                }
            }
            if(rooster.Dirty)
            {
                SaveRooster(rooster);
            }
        }
        public abstract void SaveVCard(Rooster rooster, Item itm, VCard vcard);
        public abstract void SaveHistory(Rooster rooster, Item itm, History history);
        public abstract void SaveBookmarks(Rooster rooster, Item itm, Bookmarks bookmarks);
        public abstract void SaveItem(Rooster rooster, Item itm);
        public abstract void SaveRooster(Rooster rooster);
    }
}

namespace Foobar.Persist.XML
{
    // class XMLPersister that extends PersisterBase   
}
Avatar billede Droa Seniormester
01. september 2016 - 02:30 #7
Det virker utroligt rent kodet, kan godt lide den stil, giver mig nogen ret gode ideer, jeg må lige sove på den kode, mange tak for eksemplet, jeg må virkeligt til og tage mig sammen og lære de mere avanceret koncepter så jeg ikke roder så meget rundt i dem, når jeg prøver og lave løsninger :) er altid System.IO der driller mig, når det kommer til design. Mange tak igen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester