[Delphi] OO design voor commando's

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Voor de GoT contest ben ik bezig met een Delphi client (bot), maar loop tegen een probleem aan. De binnen gekomen TCP data wil ik op een OO manier afhandelen. De server stuurt een commando waar vervolgens mijn client iets mee doet.

Het parsen van de binnen gekomen tekst gaat dmv van een reguliere expressie prima:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
  Command: TServerCommand;
begin
  FRegEx.Expression := '^(.+?)($| (.+?$))';
  if FRegEx.Exec(Data) then
  begin
    Command := nil;
    if FRegEx.Match[1] = 'ERROR' then
      Command := TErrorCommand.Create
    else if FRegEx.Match[1] = 'WORLDINFO' then
      Command := TWorldInfoCommand.Create
    else if FRegEx.Match[1] = 'VERSION' then
      Command := TVersionCommand.Create;

    if Assigned(Command) then
    begin
      if FRegEx.SubExprMatchCount = 3 then
        Command.ParseParameters(FRegEx.Match[3]);
      //hier uitvoeren?
    end;
  end;
end;

Opzich is dit een leuke oplossing (command design pattern). Nu kan ik Command.Execute doen, alleen wat moet ik dan doen in die Execute? Soms moet er een antwoord terug naar de server, soms moet er binnen de client iets veranderen.

Is hier een generieke oplossing voor? Hoe zorg ik ervoor dat de commando's op een gestructureerde manier worden afgehandeld. Liefst zonder veel afhankelijkheden. Iemand misschien een voorbeeldje?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

JIj moet per type commando de juiste functionaliteit in de execute methode plaatsen. Dat commando zal soms een 'verwijder alle bestanden op de c schijf' zijn en in andere gevallen 'zoek pron en stuur dat naar me door'. Maar de ontvanger van de message die interesseerd het niet welke implementatie hij krijgt, zo lang hij maar execute aan kan roepen. Dan is alles toch perfect, wat bevalt je dan niet?

//pseude code:

code:
1
2
3
4
while(true){
    Command command = commandChannel.receive();
    command.execute();
}


[edit]
Die commandchannel is leest de tcp data en bouwt op basis hiervan de juiste commando`s op. De juiste command implementatie moet dus gekozen worden op basis van de tcp data.

voorbeeld van een stream data:
.....,deletefilescommand,c,zoekpornocommand,c:\documents,alarmnummer@porn.com,.....

Op basis van deze data kan de commandchannel dan de juiste commando`s aanmaken en voorzien van de juiste parameters.

[ Voor 63% gewijzigd door Alarmnummer op 10-05-2005 20:53 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je zou een stukje code kunnen maken die afhankelijk van een string uit je tcp stream een commando er bij weet te vinden, zoals Alarmnummer voorsteld. Dit zou een statisch lijstje kunnen zijn, maar wellicht zou je een soort registratie systeem kunnen maken waarbij de command's registreren op welke string ze werken. Of je zou door alle geregistreerde command's kunnen lopen en ze zelf laten beslissen of het voor hun is.

We adore chaos because we like to restore order - M.C. Escher


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Het probleem is niet zozeer het aanmaken van de commando's, maar meer de uitvoering.

Neem nou het terug sturen van data. Als het VersionCommand binnenkomt moet het USER commando worden gestuurt naar de server. Dus in de execute van de VersionCommand klasse moet dus een string sturen via de TCP client. Dus nu moet die command klasse kennis hebben van het TCP client object. Zo zijn er andere commando's die nog meer afhankelijkheden kunnen hebben.

Is het de juiste manier om elk commando object kennis te geven over de objecten die hij nodig heeft?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Dat lijkt me geen enkel probleem. Commands hebben altijd veel referenties naar andere objecten, tenslotte voeren ze op die objecten bewerkingen uit.

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 07-05 11:11

alienfruit

the alien you never expected

Hoe d oen jullie dat eignelijk bij een website met de Command-pattern, maken commando's zoals login_check, of logout. Of bij bijvoorbeeld entrylist, entry_edit e.d. Je hebt namelijk vaak verschillende pagina's zoals "items", "pagina's". Koppelen jullie dan Commando's via bijv. registerCommand( 'items', aCommand ); aan een pagina?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

alienfruit schreef op woensdag 11 mei 2005 @ 03:12:
Hoe d oen jullie dat eignelijk bij een website met de Command-pattern, maken commando's zoals login_check, of logout.
Bij websites heb je vaak een component dat op basis van het url de juiste functies weet te vinden. Alle functies staan dan wel weer ergens geregistreerd.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
alienfruit schreef op woensdag 11 mei 2005 @ 03:12:
Hoe d oen jullie dat eignelijk bij een website met de Command-pattern, maken commando's zoals login_check, of logout. Of bij bijvoorbeeld entrylist, entry_edit e.d. Je hebt namelijk vaak verschillende pagina's zoals "items", "pagina's". Koppelen jullie dan Commando's via bijv. registerCommand( 'items', aCommand ); aan een pagina?
Ik maak gebruik van een soort combinatie van het command pattern, een page controller en het model-view-controller pattern. Ik heb een 1 script die voor alle pagina's wordt aangeroepen. Deze krijgt als parameter de naam van de actie/pagina mee, welke gebruikt wordt om een instantie van de juiste class initialiseren. Dat stelt bij mij dan de controller van het geheel voor. Alle controller bevatten een functie run() welke het geheel in werking zet. Via een singleton System object en gegeven post/get parameters kunnen dan de benodigde domein objecten worden opgehaalt, operaties daarop worden uitgevoerd en een view instatie worden aangemaakt, met als parameter enkele domein objecten, welke dan wordt gerenderd of een redirect naar een ander script. Werkt erg lekker en overzichtelijk moet ik zeggen.

[ Voor 16% gewijzigd door Michali op 11-05-2005 09:09 ]

Noushka's Magnificent Dream | Unity

Pagina: 1