[java] strategy keuze

Pagina: 1
Acties:

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 03-04 10:15
ik heb een simpel probleempje, stel ik heb een bestand van het type File, nu moet ik adhv het een regellengte (alle regels zijn even lang) gaan bepalen welk algortime te gebruiken.

nu lees doe ik het als volgt:

Java:
1
2
3
4
5
6
7
8
9
10
11
BufferedReader fileReader = new BufferedReader(new FileReader(file));
            String formatLine = fileReader.readLine();
            fileReader.close();
            
            CodaReader reader = null;
            if (formatLine.length() == CodaReader.LAYOUT128) {
                reader = new Coda128Reader();
            } else {
                reader = new Coda360Reader();
            }
            reader.read(file);


nu in het reader algoritme open ik terug het bestand in een in bufferedReader om telkens een lijn in te lezen, ik weet niet of er een betere manier is om te bepalen welke algoritme ik gebruik? Nu open ik dus 2 maal het bestand....

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Je kan dezelfde stream weer gebruiken (meegeven aan de constructor van Coda128Reader en Coda360Reader).
Je moet dan wel weer naar het begin van het bestand gaan:
Java:
1
2
3
4
5
fileReader.mark();
String formatLine = fileReader.readLine(); 
// ...

fileReader.reset(); // terug naar de mark, in dit geval BOF

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 03-04 10:15
ja dat is een mogelijkheid, maar ik zou nog aan de File zelf moeten kunnen (eventueel verplaatsten na het lezen, andere naam geven om een voorbeeld te geven)

als ik die BufferedReader meegeef kan ik dat niet meer...

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:03

Janoz

Moderator Devschuur®

!litemod

Kun je ook wat veranderen aan de implementatie van de reader? Je zou deze dan uit kunnen breiden met een formaat check. Je probeert het eerst met de 128 variant te lezen en mocht dat falen vanwege die test, dan probeer je het met de andere. Je opent dan alleen het bestand 2x als je de eerste keer verkeerd gegokt hebt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 03-04 10:15
Janoz schreef op donderdag 26 januari 2006 @ 16:03:
Kun je ook wat veranderen aan de implementatie van de reader? Je zou deze dan uit kunnen breiden met een formaat check. Je probeert het eerst met de 128 variant te lezen en mocht dat falen vanwege die test, dan probeer je het met de andere. Je opent dan alleen het bestand 2x als je de eerste keer verkeerd gegokt hebt.
vind ik beetje vuile oplossing, in princiepe mag het niet / of wil ik niet dat de Coda128Reader van de Coda360Reader en omgekeerd afweet...

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:03

Janoz

Moderator Devschuur®

!litemod

Dan houdt dat inderdaad op. Ik denk ook niet dat er dan een betere oplossing is dan je huidige. Het probleem is dat je enkel een file mee wilt geven ipv de stream. Wat je nog zou kunnen doen is een extra constructor maken die ook een stream accepteerd en deze stream eventueel reset (zodat hij weer op positie 0 staat).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 22:47
Dit klinkt als een Factory constructie. Dus een externe partij die wel van alle implementaties afweet en aan alle implementaties vraagt of die er iets mee kunnen. Als resultaat krijg je dan de geconstrueerde implementatie terug die de beste match heeft.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Cuball schreef op donderdag 26 januari 2006 @ 15:44:
Nu open ik dus 2 maal het bestand....
Het lijkt me niet dat er een manier bestaat om de regellengte te bepalen zonder het bestand te openen, tenzij je hele lompe dingen gaat doen.
DaCoTa schreef op donderdag 26 januari 2006 @ 17:38:
Dit klinkt als een Factory constructie. Dus een externe partij die wel van alle implementaties afweet en aan alle implementaties vraagt of die er iets mee kunnen. Als resultaat krijg je dan de geconstrueerde implementatie terug die de beste match heeft.
Om een strategie te kiezen zal je toch moeten weten welke strategieen er voor handen zijn en welke nu van toepassing is.

Wie trösten wir uns, die Mörder aller Mörder?


  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Kun je geen collectie van Strategiën maken en iedere strategie een methode laten implementeren, waarmee de strategie zelf bepaald aan de hand van de kopregel of ie toepasbaar is op het gegeven bestand? Zoiets als:
Java:
1
2
3
4
5
abstract class AbstractCodaReader {
    public boolean suitsFile(String kopregel){
        //.. check b.v. de lengte van de regel
    }
}

Zo plaats je de logica die bepaald welke strategie toepasbaar is bij de strategie zelf, wat ik wel een nette oplossing vind; dan loop je je collectie met strategien af om te bepalen welke je moet hebben.

Daarna laat de geschikte reader de rest van het bestand verwerken, waarbij de geopende stream / reader meegeeft.

[ Voor 19% gewijzigd door kasper_vk op 27-01-2006 09:14 ]

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'

Pagina: 1