Správnost postupu   zodpovězená otázka

C#, Architektura

Zdravím. Chtěl bych si ověřit jeden postup, jestli je správný nebo jestli by nešel udělat jednodušeji:

Na webu bych rád použil více datových zdrojů. proto mám interface:

public interface IInterface1
{
    string Str1 { get; set; }
}

potom, mám pro každý datový zdroj třídu:

public class Class1 : IInterface1
{
    Data data_ = new Data()
    public string IInterface1.Str1
    {
        get
        {
            return data_.str_1;
        }
        set
        {
            data_.str_1 = value;
        }
    }
}

a nyní třídu Class2

public class Class2
{
    IInterface1 interface_ = null;

    public Class2()
    {
        if(UseXML)
        {
            interface_ = new Class1();
        }
    }

    public string String1
    {
        get
        {
            return interface_.Str1
        }
        set
        {
            interface_.Str1 = value;
        }
    }
}

kód je jiný, ale jen pro ukázku. Jak sjem říkal. Chci použít více datových zdrojů, takže chci např získat hodnotu String1, tak zavolám label.Text=Class2.String1; a pokud je v té třídě UseXML na true, tak se inicializuje třída Class1 a načítají se data z ní. Pokud by tam bylo třeba false, inicializovala by se jiná třída.

Problém je ale v tom, že takových vlastností mám v každé třídě asi třicet, a příjde mi, že je píšu furt dokola. Že mám spoustu toho stejného kódu, a proto pochybuji o správnosti.

Chtěl bych vědět, jesstli to tedy je správně, a pokud ano, jestli by se to dalo nějakým způsobem zjednodušil

Mnohokrát děkuji

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ukážu praktický příklad:

public interface IClanek
{
    public string Nazev { get; set; }
    public string Text { get; set; }
    public DateTime Publikovano { get; set; }

    public void LoadById(int id);
}

public class ClanekDB : IClanek
{
    // pokud vlastnosti nic speciálního nedělají, dá se použít zkrácená syntaxe
    public string Nazev { get; set; }
    public string Text { get; set; }
    public DateTime Publikovano { get; set; }

    public void LoadById(int id)
    {
        // v této metodě načtete článek s daným id z databáze a naplníte vlastnosti
    }
}

public class ClanekXml : IClanek
{
    public string Nazev { get; set; }
    public string Text { get; set; }
    public DateTime Publikovano { get; set; }

    public void LoadById(int id)
    {
        // v této metodě načtete článek s daným id, ale tentokrát z XML souboru
    }
}

Pro získání textu článku použijete například tento kód, který se podívá do konfigurace a zjistí, jestli jsou články v databázi nebo v XML:

// toto vytvoření článku je dobré dát do nějaké třídy jako
// statickou metodu (třeba Clanek.Create nebo tak nějak, ať se
// vám to v projektu neopakuje stokrát; oceníte v případě, že si
// vzpomenete, že chcete ještě třetí způsob práce s daty)
IClanek clanek;
if (Convert.ToBoolean(ConfigurationManager.AppSettings["PouzitXml"]))
    clanek = new ClanekXml();
else
    clanek = new ClanekDB();

// načíst článek
clanek.LoadById(15)

Ještě poznámečka - pan Linhart doporučoval interfaces, já bych doporučil spíš použít místo interfacu třídu - pak ty property budete mít jen na jednom místě a můžete mít v původní třídě i některé věci, které jsou společné pro všechny typy uložení dat.

No a vaše třídy samozřejmě kromě metody LoadById by asi měly umět i vrátit seznam všech článků, které obsahují nějaký text, nebo je nějak seřadit, zobrazit jen druhých 10 atd.

Pokud chcete provázat datové komponenty v ASP.NET s touto datovou vrstvou, pak se na to dá použít komponenta ObjectDataSource.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak by se to dalo dělat místo toho interface tou třídou? Myslíte mít v té třídě pouze ty property, a například v jiné třídě by byly pouze metody např load/save které by data načetly/uložily bud do db nebo do xml?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
public abstract class Clanek
{
    public string Nazev { get; set; }
    public string Text { get; set; }
    public DateTime Publikovano { get; set; }

    // tady si nadeklarujete všechny hlavičky metod, které musí poděděná třída implementovat
    // v poděděné třídě můžete mít i další metody, ale tady jsou ty společné, které budou obecné pro všechny typy dat
    // konkrétní implementace pro databázi jsou pak už ve třídách ClanekDB a ClanekXML
    public abstract void LoadById(int id);
}

public class ClanekXML : Clanek
{
    // vlastnosti se zdědily ze třídy Clanek, nepíšou se znovu

    // implementace metod
    public override void LoadById(int id)
    {
        // načtení článku z DB
    }
}

Použití je pak stejné.

Doporučuji přečíst si nejnovější seriál, který tu máme, není úplný, v několika dnech vyjde další díl, ale jsou tam ty objekty celkem podrobně vysvětlené. Budete v tom mít o něco jasněji.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Díky moc

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback