Avatar billede mach3 Nybegynder
01. februar 2005 - 21:38 Der er 38 kommentarer og
2 løsninger

Oprettelse af objekt: Mest optimale placering?

Hej,

jeg har et spørgsmål angående oprettelse af objekter i min controller klasse.

Klassen indeholder 117 metoder, og de skal alle anvende et dataset og de skal alle sammen oprette et objekt af een af klasserne fra applikationslogik laget.

Skeletet er som følger:

public class ControllerClass
{
  public DataSet Metode1()
  {
      DataSet ds = new DataSet();
      Kunde kunde = new Kunde();
      ds = kunde.EnMetode();
  }

  public DataSet Metode2()
  {
      DataSet ds = new DataSet();
      Kunde kunde = new Kunde();
      ds = kunde.EnAndenMetode();
  }
}

Og sådan fortsætter det dernedaf. Som det fremgår oprettes der i hver funktion et nyt objekt af DataSet og Kunde. Jeg tænker, at jeg med fordel kan lave en konstruktør, og så bare placere dem der, dvs
 
public ControllerClass()
{
  DataSet ds = new DataSet();
  Kunde kunde = new Kunde();
}

Jeg har også forsøgt med:

public class ControllerClass
{
  DataSet ds = new DataSet();
  Kunde kunde = new Kunde();

  public DataSet Metode1()
  {
      ds = kunde.EnMetode();
  }

  public DataSet Metode2()
  {
      ds = kunde.EnAndenMetode();
  }
}

Og det virker også.

Er det lige meget, hvilken af de tre modeller man anvender? Alle løsninger fungerer kodemæssigt, men hvilken måde bør man gøre det på?

Og så et tillægsspørgsmål:
Når man opretter et nyt DataSet skriver jeg
DataSet ds = new DataSet();

Men når fx man opretter en integer skriver man
int tal;

og ikke
int tal = new int();

Hvornår ved man, om man skal lave en
blabla test = new blabla();

i stedet for
blabla test;
?

mvh
Avatar billede mach3 Nybegynder
01. februar 2005 - 21:39 #1
der skal naturligvis også stå
return ds;

i de metoder der returnerer DataSet.
Avatar billede arne_v Ekspert
01. februar 2005 - 21:48 #2
new DataSet()

er vel overflødig når du assigner noget til ds lige efter
Avatar billede arne_v Ekspert
01. februar 2005 - 21:50 #3
Og så undrer jeg mig over om kunde.EnMetode og kunde.EnAndenMetode ikke
bør være static ?
Avatar billede mach3 Nybegynder
01. februar 2005 - 21:51 #4
Jeg kender ikke så meget til static - hvad opnår man ved at gøre på den måde?
Avatar billede arne_v Ekspert
01. februar 2005 - 21:52 #5
Jeg synes ikke nogen af de 3 varianter er pæne.

Jeg kan bedre lide:

  public DataSet Metode1()
  {
      return Kunde.EnMetode();
  }
Avatar billede mach3 Nybegynder
01. februar 2005 - 21:53 #6
Svarer
DataSet ds = new DataSet();

til
int tal = new int();

For så dropper jeg den bare sidste del. Havde set det på nettet engang, så tænkte det var noget speciel med DataSet'et.
Avatar billede arne_v Ekspert
01. februar 2005 - 21:53 #7
Du undgår at oprette et objekt som du ikke skal bruge.

(forudsætter naturligvis at du ikke skal bruge et objekt)
Avatar billede arne_v Ekspert
01. februar 2005 - 21:54 #8
Man laver tit

DataSet ds = new DataSet();

fordi man så filler data settet fra en adapter
Avatar billede arne_v Ekspert
01. februar 2005 - 21:57 #9
Men

X x = new X();

gør det samme uanset hvad X er
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:00 #10
ok
Avatar billede arne_v Ekspert
01. februar 2005 - 22:00 #11
Jeg formoder at EnMetode f.eks. kunne være FindAll og FindAllWhereLike og den slags
Avatar billede arne_v Ekspert
01. februar 2005 - 22:13 #12
Er det en god ide at sende DataSet fra data lag gennem applikations lag ud til
præsentations lag ?

Eller var en collection af objects bedre ?
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:17 #13
>>
Er det en god ide at sende DataSet fra data lag gennem applikations lag ud til
præsentations lag ?

Det tror jeg måske du bedre kan svare på. Det jeg anvender DataSet'et til er for at fylde en dropdownliste eller fylde et TreeView eller et DataGrid osv som skal vises til brugeren.

Er det en dårlig ide, det jeg gør?
Avatar billede arne_v Ekspert
01. februar 2005 - 22:20 #14
Umiddelbart synes jeg at DataSet lyder meget tæt på databasen.

De kontroller du bruger - kan deres DataSource property ikke også sættes
til f.eks. en ArrayList ?
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:23 #15
Det er skam ikke tæt på databasen. DataSet'et sendes bare videre op i gennem applikationslaget til UI laget for at kunne blive vist.

>>
De kontroller du bruger - kan deres DataSource property ikke også sættes
til f.eks. en ArrayList ?

De kontroller jeg bruger er primært:
1. DataGrid
2. DropDownList
3. TreeView

Jeg anvender konsekvent DataSet som DataSource, men er frisk på at prøve noget nyt - har ikke prøvet at anvende ArrayList før :o)
Avatar billede arne_v Ekspert
01. februar 2005 - 22:25 #16
Så data settet indeholder ikke tabelnavne, feltnavne etc. ?
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:35 #17
>>
Så data settet indeholder ikke tabelnavne, feltnavne etc. ?

Tabelnavne er der ikke nogen af, men feltnavne anvender jeg. Eksempel fra en UI klasse, hvor en DropDownListe skal fyldes:

protected void FillDD(object sender, EventArgs e)
{
  TestHandler handler = new handler();
  DataSet ds = new DataSet();
  ds = handler.MetodeDerReturnereEtDataSetSomFyldesPåDropDownListe();
  ddlSted.DataSource = ds.Tables["dt"];
  ddlSted.DataTextField = ds.Tables["dt"].Columns["by"].ToString();
  ddlSted.DataBind();
  ddlSted.Items.Insert(0, "Vælg et element");
}

Denne metode kaldes i sidens Page_Load. Som jeg kan fornemme af hvad der ligger bag det du siger, så er dette ikke optimalt?
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:36 #18
Jeg laver lidt flere fejl end hvad godt er:

Der skulle have stået
TestHandler handler = new TestHandler();

Beklager.
Avatar billede arne_v Ekspert
01. februar 2005 - 22:37 #19
Igen kan

DataSet ds = new DataSet();
ds = handler.MetodeDerReturnereEtDataSetSomFyldesPåDropDownListe();

laves

som

DataSet ds = handler.MetodeDerReturnereEtDataSetSomFyldesPåDropDownListe();
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:39 #20
jeg vil rette det alle steder på een gang, så venter med det til i morgen :-)
Avatar billede arne_v Ekspert
01. februar 2005 - 22:39 #21
Jeg ved det ikke.

Jeg arbejder ikke med ASP.NET til daglig og ved ikke hvad man bruger
normalt.

Men umiddelbart synes jeg ikke at DataSet og DataTable er noget som skal
transporteres op fra data laget til præsentations laget.
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:41 #22
Er det fordi DataSet er for "avanceret" til at blive vist i UI laget?
Avatar billede arne_v Ekspert
01. februar 2005 - 22:43 #23
Nej.

Men fordi jeg ser et DataSet som en in memory data struktur som 1:1 afspejler
tabel strukturen i databasen. Og derved for du en tæt kobling mellem
dit præsentations lag og tabel struktur i databasen.
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:46 #24
Ja ok det giver mening.

Mange tak for hjælpen arne_v! Lader lige tråden køre videre og se om der er nogen der har et tip for det sidste her.
Avatar billede mach3 Nybegynder
01. februar 2005 - 22:47 #25
Læg et svar i øvrigt - venter bare lidt med at acceptere for at få nogle tip angående det sidste her.
Avatar billede arne_v Ekspert
01. februar 2005 - 22:48 #26
ok
Avatar billede burningice Nybegynder
01. februar 2005 - 23:10 #27
jeg vil også mene at DataSet bør man holde sig fra at bruge så snart du kommer mere end 2 skridt væk fra databasen (Stol aldrig på en kvinde der er mere end 3 meter fra køkkenet - det samme kan overføres til dataset og database :P). Lav istedet nogle typestærke objecter!

Kan også kun give arne ret i dit kludder med at oprette en masse objecter der aldrig bliver brugt.

Og ang. int, så skyldes det at der er nogle typer der har implicitte konstruktører:

int i = 5;
int i = new Int(5);

Det skulle gerne give det samme når det compiles.

Du skriver at man opretter en int ved at skrive

int i;

nej, det gør man ikke. Man opretter en int-variabel, men den peger endnu ikke på noget.
Avatar billede arne_v Ekspert
01. februar 2005 - 23:15 #28
value type - reference type
Avatar billede mach3 Nybegynder
01. februar 2005 - 23:16 #29
>>
Lav istedet nogle typestærke objecter!

et eksempel er velkomment :-)

mvh
Avatar billede burningice Nybegynder
01. februar 2005 - 23:22 #30
Avatar billede mach3 Nybegynder
01. februar 2005 - 23:22 #31
takker kigger på det
Avatar billede burningice Nybegynder
01. februar 2005 - 23:24 #32
arne>> vi har vist haft den diskussion en gang før :)

Ja, en int har faktisk en værdi med det samme, den behøves ikke at oprettes først som normale objecter.

Hvordan var det... hvis man lavede den som static kunne man godt få compilet et program der udskrev værdien af i som 0 selvom man ikke selv havde sat den til noget.
Avatar billede arne_v Ekspert
01. februar 2005 - 23:26 #33
Jeg har et eksempel liggende:

using System;
using System.Collections;

public class MyData
{
    private string s;
    public MyData()
    {
        s = "";
    }
    public MyData(string s)
    {
        this.s = s;
    }
    public string S
    {
        get
        {
            return s;
        }
        set
        {
            s = value;
        }
    }
}

public class MyCollection : CollectionBase
{
    public MyData this[int index]
    {
        get
        {
          return (MyData)List[index];
        }
    }
    public int Add(MyData value)
    {
        return List.Add(value);
    }
}

class MainClass
{
    public static void Main(string[] args)
    {
        MyCollection mycol = new MyCollection();
        mycol.Add(new MyData("A"));
        mycol.Add(new MyData("BB"));
        mycol.Add(new MyData("CCC"));
        for(int i = 0; i < mycol.Count; i++)
        {
            Console.WriteLine(mycol[i].S);
        }
    }
}
Avatar billede arne_v Ekspert
01. februar 2005 - 23:26 #34
Guidmaster har også skrevet en artikel her på Eksperten (dog er koden i VB.NET).
Avatar billede arne_v Ekspert
01. februar 2005 - 23:28 #35
cf>

Jep.

Men for en af min årgang så forskellen meget tydelig inden i hovedet:
  value type = X bytes
  reference type = 4 bytes som indeholder adressen på X bytes
Avatar billede mach3 Nybegynder
01. februar 2005 - 23:31 #36
arne_v >>

>>
public class MyCollection : CollectionBase

er dette noget som kan/skal beskrives i gennem design patterns? eller er det bare noget man anvender?
Avatar billede arne_v Ekspert
01. februar 2005 - 23:33 #37
Det er vist nærmest OOP pre pattern !

Ganske almindelig arv fra en abstrakt klasse.

Men læs den artikel cf refererede til.
Avatar billede mach3 Nybegynder
01. februar 2005 - 23:33 #38
ok
Avatar billede mach3 Nybegynder
10. februar 2005 - 01:54 #39
beklager jeg først skriver nu - har haft en del at se til.

cf >> kom også med et svar.
Avatar billede burningice Nybegynder
10. februar 2005 - 09:01 #40
:) don't we all ;)

svar :)
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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