Toon posts:

[C#]Builder probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey, ik ben bezig met een applicatie. Deze wordt dynamisch opgebouwt aan de hand van de een xmlfile. IK heb nu een xmlfile gemaakt van een standaard object en in werkt:
XML:
1
2
3
4
5
6
7
8
9
  [app]
    [button]
        [x]100[/x]
        [text]blaaa[/text]
    [/button]
    [image]
       [x]200[/x]
    [/image]
  [/app]


Nu lees ik dit xml-bestand in op het begin dat de applicatie start(onLoad). En in principe zijn image(PictureBox) en button allebij Controls. Maar mij probleem is het volgende:
C#:
1
2
3
4
5
6
7
8
     private const string button = "button";

       private Control getType( string type )
       {
          switch(type){
                case button: return new Button();
          }
       }

Dus ik lees eerst het xml in en met XPath lees ik bijvoorbeeld alle buttons in. Bij de methode getType() wordt er een nieuw object aangemaakt aan de hand van het type(uitgelezen uit xml).
Dan heeft elke object minimaal 4 waardes, namelijk :"x, y, width, height). En deze kunnen uit het xml opgehaald worden.
C#:
1
2
3
4
5
6
          private void attatchValue( Control control, string att, int value )
          {
             switch(att){
                  case x: control.X = value;
             }
          }

Op zich vind ik dit best een goede oplossing, alleen is het probleem dat ik 4 verschillende controls kan ophalen uit mn xml:"knop, plaatje, label, pulldown". De algemene values zijn gelijk, zoals:"x, y, width, height". Alleen bij bijvoorbeeld een button komen de values text en url erbij.
Ik zat te denken om een controlObject in de attatchValue methode te gooien, zodat de x,y,etc worden geset.
Omdat ik heb gehoord van D.R.Y.("Don't Repeat Yourself"), lijkt het me geen goed plan om een aparte methode te maken voor elk object. Ik dacht eerder dat elk object eerst geinstantieerd moet worden aan de hand van de xml. En dan gooi je deze in de attachValue. Bij de attachValue worden de vier hoofdValue's toegewezen. En in de default: is er weer een switch, waardoor de objecten aan de hand van hun type door hun eigen methode extra waardes krijgen. Bijv:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
          private void attatchValue( Control control, string type, string att, int value )
          {
             switch(att){
                  case x: control.X = value;
                  default:  switch(type)
                               {
                                   case button: attactchValueToButton(Control control, string att, int value )
                               }  
             }
          }

         
          private void attatchValueToButton( Control control, string att, int value )
          {
             switch(att){
                  case text: control.Text = value;                  
             }
          }


Wat denken julie van deze oplossing??

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
je functie
code:
1
private Control getType( string type )
lijkt verdacht veel op een factory method. Als je wilt kan je daar op googlen en er meer over lezen.

Het probleem is dat je niet weet welk control er uit je getType method komt. De oplossing is volgens mij dat je dat niet wilt weten. :-)
Wat ik zou doen is een geinitialiseerd object teruggeven. Dus de
code:
1
case button: return new Button();
wat uitbreiden. Op die plek weet je namelijk nog wel welk type het is.
Op die manier scherm je ook alle initializatielogica en xml-file-coupling af van de rest van je app.

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
ohja,

ik zou je method ook geen getType noemen, want dat krijg je namelijk niet terug. Je krijgt een object terug.
Beter is dus: getObject.

nog beter: getControl, omdat je al weet dat het een control is.

als je nou maakt dat ie al is geinitializeerd, dan zou ik de method nog iets anders noemen..
bijv:
getConfiguredControl of getInitializedControl

peace

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ik hoop dat je weet dat elk stuk code/xml van je stikt van de fouten :/ xml gebruikt <> tags, en in die switch kun je beter "button" enz gebruiken, maar ok das naast de kwestie.

kun je niet dmv reflection je object gaan setten? dan kun je later zelfs ALLES in je xml steken
XML:
1
2
3
4
5
6
<app>
  <System.Windows.Forms.Button>
     <x>50</x>
     <caption>knopje</caption>
  </System.Windows.Forms.Button>
</app>


C#:
1
2
3
4
5
6
7
8
9
10
// lees xml
Type controltype = System.Type.GetType(xmlcontrol);
ConstructorInfo info = controltype.GetContructor( Type.EmptyTypes );
Control c = (Control)info.Invoke(null);
foreach (XmlNode propnode in controlnode)
{
  PropertyInfo propinfo = controltype.GetProperty(propnode.Name);
  propinfo.SetValue(c,propnode.InnerText, null);
}
return c;

ASSUME makes an ASS out of U and ME