Avatar billede bildsoe Nybegynder
10. juni 2011 - 13:56 Der er 16 kommentarer og
1 løsning

Hvad skal jeg bruge til at gemme konstante værdier i?

Hej

Jeg er ved at lave en applikation til håndtering af nogle cases for et produktionsfirma. Jeg er ved at lave en grafisk oversigt, og har der brug for at kunne skifte mellem oversigtstyper og størrelser. Jeg vil gerne lave et objekt af en art, hvor man kan vælge disse fra, så når jeg f.eks skal tegne ikoner så kan jeg har jeg en funktion der hedder:

drawIcon();

Jeg vil gerne kunne angive at den f.eks. skal gøre som følger:

drawIcon(Iconsize.Big);

Lad os nu sige at de forskellige icon-sizes både skal indeholde oplysninger om størrelse, margen, placering og andet, hvad ville så være den bedste måde at implementere det på. Kan man godt det med enums, og vil enums være det rigtige at bruge?

Jeg har typisk løst det problem jeg har nu ved at f.eks. bare sende en int med:

drawIcon(2);

Og så lavet testen under drawIcon();

public void drawIcon(int iconSize)
{


    if(iconSize==2)
    {
        //Do stuff!!!
    }
}

Men dette virker bare meget uelegant.

Mvh
Thomas
Avatar billede keysersoze Guru
10. juni 2011 - 14:02 #1
Umiddelbart lyder enums til at være det rigtige valg - enums er i bund og grund jo også bare et tal så du kan ikke gemme ekstra informationer i dem, de er "kun" en sigende repræsentation for nogle tal.

Derfor skal du stadig bare lave if-sætninger i din kode som hvis du sende almindelige tal med, men altså bare sammenligning på enums, fx;

public void drawIcon(Iconsize pIconsize)
{
  if(pIconsize == Iconsize.Big)
  {
    //Do stuff!!!
  }
}
Avatar billede bildsoe Nybegynder
10. juni 2011 - 14:07 #2
Hmmm ok. Troede egentligt at jeg på en eller anden på kunne gøre sådan at f.eks. Iconsize.Small, Iconsize.Big og Iconsize.Large f.eks. alle sammen var værdier af typen IconSize. Så jeg f.eks. kunne lave følgende:

public void drawIcon(Iconsize pIconsize)
{
 

    Bitmap bm = new Bitmap(Properties.Resources.box, new Size(pIconsize.Width,pIconsize.Height);


}
Avatar billede keysersoze Guru
10. juni 2011 - 14:49 #3
Jeg ville stadig gøre det med en enum, men teoretisk burde det være muligt at lave et interface med de ønskede properties samt de nødvendige klasser benyttende interfacet og som satte værdierne for så kunne metoden tage imod interfacet og værdierne aflæses.
Avatar billede heinzdmx Nybegynder
10. juni 2011 - 14:51 #4
Så skal du lave et interface som de forskellige typer implementere. Så er det ikke længere et enum, men en klasse.


interface IIconsize
{
  int Width { get; }
  int Height { get; }
}


Så skal alle 3 typer implementere det.

Derefter lave en klasse der implementere det:


class IconsizeBig : IIconsize
{
  private int mWidth = 200;
  private int mHeight = 200;

  public int Width
  {
      get
      {
        return mWidth;
      }
  }

  public int Height
  {
      get
      {
        return mHeight;
      }
  }
}


Og


class IconsizeMedium : IIconsize
{
  private int mWidth = 100;
  private int mHeight = 100;

  public int Width
  {
      get
      {
        return mWidth;
      }
  }

  public int Height
  {
      get
      {
        return mHeight;
      }
  }
}



Osv.
Avatar billede plohse33 Nybegynder
10. juni 2011 - 15:01 #5
Hvorfor ikke lave med et (switch) statement.

Dette er et meget simpelt stykke kode, og bruger string. Men kunne evt give dig et hint til hvordan du kunne gøre det.'

Evt smid noget mere kode.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SwitchTest
{
    class Program
    {
        static void Main(string[] args)
        {
            bool IsActive = true;
            Console.WriteLine("Vælg ikon størrelse");
            Console.WriteLine("\nSmall\nMedium\nLarge");
            Console.WriteLine();
                       
            while (IsActive)
            {
                string valg = Console.ReadLine();
                IconSize(valg);
               
            }
   
           
        }

            public static void IconSize(string valg)
            {
                switch(valg)
                {
                    case "Small":
                        Console.WriteLine("Kald metoden som skal eksekverer ting med SMALL værdi");
                       
                        break;
                    case "Medium":
                        Console.WriteLine("Kald metoden som skal eksekverer ting med MEDIUM værdi");
                       
                        break;
                    case "Large":
                        Console.WriteLine("Kald metoden som skal eksekverer ting med LARGE værdi");
                       
                        break;
                    default:
                        Console.WriteLine("Du har valgt en ugyldig værdi");
                        break;
                       

                }
               
               
               
            }



       
    }
}
Avatar billede keysersoze Guru
10. juni 2011 - 15:07 #6
#4 exactement.
Avatar billede janus_007 Nybegynder
10. juni 2011 - 17:43 #7
#2 og #4 svar er den korrekte løsning såfremt bildsoe har mulighed for at gøre sådan med sin Bitmap :)

plohse og andre idéer med if/ switch bryder open/ closed principle og skal undgåes for hver en pris! , det skriger på en refactoring hvis man stødte på det engang :)

plohse, her er et par gode eksempler at lære af : http://blog.strongminds.dk/open-closed-principle/
Avatar billede bildsoe Nybegynder
14. juni 2011 - 09:28 #8
Tak for alle svarene.

@heinzdmx: smider du et svar så får du pointene.
Avatar billede heinzdmx Nybegynder
14. juni 2011 - 10:51 #9
Svar her :)
Avatar billede arne_v Ekspert
26. juni 2011 - 00:10 #10
Lidt sene kommentarer.

Den bedste loesning vil afhaenge af hvad man har brug for.

Jeg ville nok vaelge:

begraenset antal mulige ikon stoerrelser og immutable ikoner => abstrakt basis klasse med abstrakte properties med stoerrelse og konkrete klasser som arver og implementerer de properties

begrundelse: det er den model som matcher virkeligheden bedst

begraenset antal mulige ikon stoerrelser og mutable ikoner => property med ref til interface med forskellige klasse implementationer (grundliggende #4)

begrundelse: interfacet er lidt uldent i forhold til virkeligheden, men det muliggoer at andre stoerelsen af et ikon uden at lave et helt ny ikon

rigtigt mange antal mulige ikon stoerrelser => gem stoerrelser som properties af numerisk type

begrundelse: ikke saa elegant men fleksibelt med hensyn til hvad der er muligt

Jeg er enig i kritikken af switch. Det er en kerne egenskab i OOP at egenskaber bygges ind i typer via polymorfi og ikke haandteres med switch paa type.
Avatar billede bildsoe Nybegynder
04. juli 2011 - 13:52 #11
Hej Arne

Tak for den sene kommentar. Hvad er mutable/immutable? Ifølge det du skriver ovenfor, så er det det der bliver afgørende for mig, da jeg har begrænset antal mulige ikonstørrelser.
Avatar billede arne_v Ekspert
04. juli 2011 - 15:53 #12
mutable objekt = objekt kan aendres
immutable objekt = objekt kan ikke aendres

String er immutable

StringBuilder er mutable
Avatar billede bildsoe Nybegynder
05. juli 2011 - 09:23 #13
Ahh ok, men så ville den fremgangsmåde med immutable ikoner jo faktisk være den bedste for mig.

Hvordan vil jeg gøre det her i praksis:

"abstrakt basis klasse med abstrakte properties med stoerrelse og konkrete klasser som arver og implementerer de properties".

Jeg kan evt. oprette et spørgsmål så du kan få point.
Avatar billede bildsoe Nybegynder
05. juli 2011 - 09:26 #14
Forresten, hvordan har heinzdmx fået kasser omkring kodeeksempler?
Avatar billede arne_v Ekspert
05. juli 2011 - 16:33 #15
noget a la:


public abstract class Icon
{
    // 101 properties og metoder som kan bruge H og W
    public abstract int H { get; }
    public abstract int W { get; }
}

public class SmallIcon : Icon
{
    public int H { get { return 50; } }
    public int W { get { return 50; } }
}

Icon foobar = new SmallIcon;
Avatar billede arne_v Ekspert
05. juli 2011 - 16:33 #16
Der mangler () efter constructor.
Avatar billede heinzdmx Nybegynder
05. juli 2011 - 16:35 #17
Se den her guide der kommer omkring de ting man kan gøre på Eksperten

http://www.eksperten.dk/guide/1325

Den lyseblå boks er en (DIV), hvor erstatter paranteser med kantede parateser altså henholdvis [ og ]
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