[alg] design met geparametriseerde types(generics,templates)

Pagina: 1
Acties:

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik ben voor een opdracht van school bezig met een kleine 2d/3d engine (verschil alleen maar in detail gedrag, dus waarom niet samen voegen). En ik werk natuurlijk met geparametriseerde types en ik begin me uiteindelijk toch wel redelijk in de vingers te snijden hiermee. Ik snap hoe je het bij huis tuin en keukengebruik kan toepassen en verder ben ik bekend met de theorie erachter, maar dit is niet de 1e keer dat ik tegen een te complex geparametriseerd systeem begin aan te lopen.

Wie weet waar ik wat literatuur kan vinden hoe je geparametriseerde types in het groot kan inzetten in je ontwerp?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik ken geen materiaal van het niveau wat jij verlangt. De meeste documentatie gaat over een vrij kleine schaal. Helaas kan ik je dus geen docs adviseren ... Ik ben zelf toevallig bezig met wat documentatie over generics, maar ook dit is niet op de schaal die jij verlangt.

Misschien dat je ook af en toe een beetje de complexiteit van je ontwerp in de gaten moet houden als je geparameterizeerde typen echt gaat inzetten ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
mbravenboer schreef op 26 November 2002 @ 09:45:
Ik ken geen materiaal van het niveau wat jij verlangt. De meeste documentatie gaat over een vrij kleine schaal. Helaas kan ik je dus geen docs adviseren ... Ik ben zelf toevallig bezig met wat documentatie over generics, maar ook dit is niet op de schaal die jij verlangt.
Zo`n vaag vermoeden had ik al.
Misschien dat je ook af en toe een beetje de complexiteit van je ontwerp in de gaten moet houden als je geparameterizeerde typen echt gaat inzetten ;) .
Mijn ontwerp is vrij eenvoudig. En ik kan veel geparametriseerde polymorfisme problemen ook oplossen door inclusion polymorfisme te gebruiken. Maar je hebt dan veel minder compiletime veiligheid.

En probeer ik wat meer feeling te krijgen met geparametriseerde polymorfisme. Jammer dat er niet wat guidelines/tips/technieken zijn.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Generative Programming van Krzysztof Czarnecki en Ulrich Eisenecker

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik heb even wat reviews van gebruikers bekeken op amazon, en ze zijn er erg over te spreken. Ik denk dat het geen kwaad kan om dit boek in de kast te hebben staan omdat er naast generics ook uitleg wordt gegeven over algemeen oo design.

[ Voor 33% gewijzigd door Alarmnummer op 26-11-2002 10:51 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Dat is inderdaad een veel geprezen boek, maar ik betwijfel eigenlijk of je er voor jouw probleem gelijk echt veel aan hebt. Ik heb het zelf niet (gelezen), maar het schijnt zonder twijfel een aanwinst zijn.

Een paar sites:
Generative Programming - Methods, Tools, and Applications
Generative Programming Wiki

Ik las een tijd geleden op een weblog nog een prachtige essay over generative programming, maar ik kan hem helaas niet meer vinden :( .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Het probleem zit hem op dit moment in de hoeveelheid typeparameters dat ik moet meenemen. Dat begint naarmate je hoger in de generieke object structuur begint te komen steeds meer uit de klauwen te lopen.

vb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
interface A<P extends Persoon>{
    P getPersoon();
}

interface B <F extends Fiets>{
   F getFiets();
}

interface C<P extends Persoon, F extends Fiets>{
    A<P> getA();
    B<F> getB();
}

[ Voor 18% gewijzigd door Alarmnummer op 26-11-2002 11:57 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Gevonden :) . Het gaat om dit artikel van Jon Lam:

http://www.iunknown.com/Weblog/Whenlessismore.html

Helaas werkt de pagina op dit moment niet, maar dat zal later wel weer goed komen. Het commentaar op de main site van 7 Nov is ook wel leuk.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ja, das een groot probleem. Dit wordt vooral veroorzaakt doordat je echt alle parameters moet opgeven en niet zoals in functionele talen de type inferentie vrijwel al het werk kan laten doen.

Ik denk dat je aan de declaraties van parameters niet kan ontkomen. Het enige wat ik zelf probeer is om goed te kijken of je niet een generieke methode kan gebruiken ipv een generieke klasse. Omdat de parameters daar bepaald kunnen worden uit de argumenten van de methoden heb je dan wat schonere code.

Ook maak ik altijd 'generieke constructoren'. Bij methoden kunnen de parameters bepaald worden, maar bij object creatie moet je ze altijd opgeven. Ook als ze bepaald kunnen worden door de parameters die je aan de constructors meegeeft. Met behulp van een static methode die de constructor aanroept kan je dit oplossen en het scheelt je dan weer een parameter die je moet opgeven. De declaraties van parameters worden er echter niet minder van.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Overigens ben je volgens mij al wel erg goed bezig met de 'extends'. Veel te vaak wordt een parameter keihard vastgelegd, waarna je er veel te weinig meer mee kan. Door aan te geven dat het ook subklassen kunnen zijn, voorkom je dat je ergens vast loopt in je ontwerp en moet gaan casten.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
mbravenboer schreef op 26 November 2002 @ 11:59:
Overigens ben je volgens mij al wel erg goed bezig met de 'extends'. Veel te vaak wordt een parameter keihard vastgelegd, waarna je er veel te weinig meer mee kan. Door aan te geven dat het ook subklassen kunnen zijn, voorkom je dat je ergens vast loopt in je ontwerp en moet gaan casten.
Ik zal binnenkort mijn engine wel ergens neerzetten. Ik denk dat je hem wel leuk vind. Op een hele elegante manier worden alle transformaties op objecten uitgevoerd met een visitor. Daarbij wordt natuurlijk een zeer fraaie macro optimalisatie toegevoegd (matrix vermenigvuldigingen worden zo wat beperkt).

ps:
ik kan niet meer met Nice werken. Het feit dat een parent type evenveel typeparameters moet hebben als een kind, vind ik onwerkbaar.


[edit] stiekum toch een stukje code.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public interface StructureToImage<P extends Point,M_n_n extends Matrix_n_n<M_n_n,P>>{
    public void transform(Structure s, Image i, PointToScreen<P> p);
}

class DefaultStructureToImage<
    P extends Point,
    M_n_n extends Matrix_n_n<M_n_n,P>
    > implements StructureToImage<M_n_n,P>{
    
    public void transform(Structure s, Image i,PointToScreen<P> p){
        StructureVisitorImpl<P,M_n_n> v = new StructureVisitorImpl<P,M_n_n>(p,i);
        s.accepts(v);
    }
}

class StructureVisitorImpl<
    P extends Point,
    M_n_n extends Matrix_n_n<M_n_n,P>
    > implements StructureVisitor<M_n_n>{
    
    private M_n_n _currentTrans;
    private PointToScreen<P> _pointToScreen;
    private Image _image;
    
    public StructureVisitorImpl(PointToScreen<P> pointToScreen, Image i){
        _pointToScreen = pointToScreen;
        _image = i;
    }
    
    public void visit(ModelStructure s){
        Model m = s.getModel();
        
        //je kan het model ophalen. en met behulp van de _currentTrans
        //kan je de posities van van model converteren naar posities in de ruimte.
        
        //hier kunnen alle berekende punten in komen te staan.
        List<P> finalPointList = new ArrayList<P>(m.getPointList().size());
        
        for(Iterator<P> itt=m.getPointList().iterator();itt.hasNext();){
            //mbv itt.next en _currentTrans kan je nu de nieuwe punten bepalen.
            //en plaat het resultaat in resultPointList
                        
            finalPointList.add(_currentTrans.convMultiply(itt.next()));
        }
        
        for(Iterator<Visual> itt=m.getVisuals().iterator();itt.hasNext();){
            itt.next().draw(_image,_pointToScreen,finalPointList);
        }
    }
    
    public void visit(ComposedStructure s){
        for(Iterator<Structure> itt = s.getChildren().iterator();itt.hasNext();){
            itt.next().accepts(this);
        }
    }
    
    public void visit(TransStructure<M_n_n> s){
        //sla de lagere transformatie schema op.
        M_n_n lowerTrans = _currentTrans;
        
        _currentTrans = _currentTrans.multiply(s.getTransMatrix());//concatination of lower and s his transformation matrix
        
        s.getParent().accepts(this);
        
        _currentTrans = lowerTrans;//hersteld de huidge transformatie
    }
}


Die PointToScreen zet de coordinaten van een Punt om naar coordinaten op een scherm. Je kan dan ook heel eenvoudig een maken met perspectief of een zonder. Het is maar detail gedrag, en dat geef je dus mee als strategy. En die transmatrix kan je ook heel eenvoudig nog even een camera transformatie bijop zetten dus dat is ook geen probleem :)

[ Voor 73% gewijzigd door Alarmnummer op 26-11-2002 12:40 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik heb hier een link gevonden met een artikel over generics icm design patterns. Ik heb het nog niet doorgelezen, dus ik kan niet zeggen of ik er iets aan heb. Maarja.. design pattern icm generics O+ 8) _/-\o_ B)

[ Voor 30% gewijzigd door Alarmnummer op 04-12-2002 11:36 ]

Pagina: 1