Aanleiding
Nadat ik enkele hoofdstukken Haskell had doorgebladerd, begon ik me toch af te vragen of dit makkelijke opbouwen van wiskundige expressies niet ongeveer gelijk ingeplementeerd kon worden in Java of any OO taal.
Wat wil ik nu
Ik wil een wiskundige functie kunnen voorstellen zo mooi als dat ook in functionele programmeer talen kan. Hiervoor is misschien wat uitleg nodig
Stel ik heb de volgende wiskundige expressie:
Deze expressie is opgebouwt uit een willekeurig aantal expressies. Om dit goed voor je te zien heb ik de expressie daarom opgebouwt dmv een boom zoals ik hem zie
Deze stuctuur wil ik ook makkelijk kunnen weergeven in Java en dan zo flexibel dat ik elk moment op elke willekeurige plek expressies kan vervangen / verwijderen / toevoegen
Wat heb ik nu
Ik heb mijn verse GoF boek er maar eens op nageslagen en kwam tot de conclusie dat 'Composite' het beste de structuur weergaf die ik wou gaan toepassen. Daarna ben ik aan het designen gegaan en daar kwam het volgende uit:

Hierin is MathExpression de algemene interface waarmee ik de expressie wil samenvoegen,
AbstractMathExpression een abstracte klasse die het standaard gedrag voor het patroon implementeert ( administratie van de childs ). Hieronder even snel wat code
Sin, Cos en Polynomial zijn classes die expressies kunnen bevaten en de waarde die uit de expressie komt bewerkeren met hun eigen functie. Hieronder wat snelle code:
Het verkrijgen van de waarde van de expressie is gewoon te bereiken door op elk child de methode calculate( ) aan te roepen. Kortom je kan via deze stuctuur expressies makkelijk nesten en wijzigen.
Maar wat is het probleem
Hier komen de problemen. Ik zie enkele punten die me duidelijk moeten zijn voordat ik dit kan implementeren.
• Sommige expressies kunnen maar 1 expressie bevatten ( bijv Sinus ) en andere moeten er meer dan 1 bevatten ( Substract bijvoorbeeld ). Natuurlijk zijn daar trucs voor (bijv optellen + 0, vermenigvuldigen met 1). Zou het duidelijk zijn als ik deze trucs toevoeg of moet ik gewoon een Exception op gaan werpen
• Ga ik niet ontzettend in de knoei raken met prioriteiten van de operatoren (plus,min,machtsverheffen)
• Is het instellen van meerdere variabele die nodig zijn (zoals voor een machtsverheffing of een Sommatie reeks ) via de constructor een goed idee ?
• Iemand verder nog opmerkingen over mijn ideeën, mijn ontwerp of anderzijds iets op te merken?
Opbouwende kritiek en opmerkingen vind ik altijd prettig om te horen, ik sta er voor open en barst maar los wat dat betreft. Ook voorbeelden over hoe het mooier kan geschreven in andere talen zijn welkom. Alvast dank voor het lezen van het verhaal en het investeren in van de tijd
Nadat ik enkele hoofdstukken Haskell had doorgebladerd, begon ik me toch af te vragen of dit makkelijke opbouwen van wiskundige expressies niet ongeveer gelijk ingeplementeerd kon worden in Java of any OO taal.
Wat wil ik nu
Ik wil een wiskundige functie kunnen voorstellen zo mooi als dat ook in functionele programmeer talen kan. Hiervoor is misschien wat uitleg nodig
Stel ik heb de volgende wiskundige expressie:
code:
1
| sin( x^2 + 7x + cos( 30x ) ) |
Deze expressie is opgebouwt uit een willekeurig aantal expressies. Om dit goed voor je te zien heb ik de expressie daarom opgebouwt dmv een boom zoals ik hem zie
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| sin
|
| === +
|
| === +
| |
| | === x^2
| |
| | === 7x
|
|
| === cos
|
| === 30x |
Deze stuctuur wil ik ook makkelijk kunnen weergeven in Java en dan zo flexibel dat ik elk moment op elke willekeurige plek expressies kan vervangen / verwijderen / toevoegen
Wat heb ik nu
Ik heb mijn verse GoF boek er maar eens op nageslagen en kwam tot de conclusie dat 'Composite' het beste de structuur weergaf die ik wou gaan toepassen. Daarna ben ik aan het designen gegaan en daar kwam het volgende uit:

Hierin is MathExpression de algemene interface waarmee ik de expressie wil samenvoegen,
Java:
1
2
3
4
5
6
7
8
9
10
11
12
| public interface MathExpression { /** * Needed for implementation of the 'Composite' * design pattern. */ public void add( MathExpression expression ); public void remove( MathExpression expression ); public Iterator getChildren( ); public double calculate( double variable ); } |
AbstractMathExpression een abstracte klasse die het standaard gedrag voor het patroon implementeert ( administratie van de childs ). Hieronder even snel wat 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
| public abstract class AbstractMathExpression { /** * Needed for implementation of the 'Composite' * design pattern. */ public void add( MathExpression expression ) { getExpressions( ).add( expression ); } public void remove( MathExpression expression ) { // removal of the expression from _expressions // } public Iterator getChildren( ) { return getExpressions( ).iterator( ); } public abstract double calculate( double variable ); /** * getters and setters */ private ArrayList getExpressions( ) { return _expressions; } private void setExpressions( ArrayList expressions ) { //Imagine nullcheck here // _expressions = expressions; } private ArrayList _expressions; } |
Sin, Cos en Polynomial zijn classes die expressies kunnen bevaten en de waarde die uit de expressie komt bewerkeren met hun eigen functie. Hieronder wat snelle 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
| public class Sin extends AbstractMathExpression { public abstract double calculate( double variable ) { // The check for the 0ne expression should be added in // the add method. So I really don't have to concern me // with it now // Iterator iter = getChilds( ); double expressionValue = 0; while( iter.hasNext ) { MathExpression theExpression = (MathExpression) iter.next( ); expressionValue = theExpression.calculate( variable ); } return expressionValue; } } |
Het verkrijgen van de waarde van de expressie is gewoon te bereiken door op elk child de methode calculate( ) aan te roepen. Kortom je kan via deze stuctuur expressies makkelijk nesten en wijzigen.
Maar wat is het probleem
Hier komen de problemen. Ik zie enkele punten die me duidelijk moeten zijn voordat ik dit kan implementeren.
• Sommige expressies kunnen maar 1 expressie bevatten ( bijv Sinus ) en andere moeten er meer dan 1 bevatten ( Substract bijvoorbeeld ). Natuurlijk zijn daar trucs voor (bijv optellen + 0, vermenigvuldigen met 1). Zou het duidelijk zijn als ik deze trucs toevoeg of moet ik gewoon een Exception op gaan werpen
• Ga ik niet ontzettend in de knoei raken met prioriteiten van de operatoren (plus,min,machtsverheffen)
• Is het instellen van meerdere variabele die nodig zijn (zoals voor een machtsverheffing of een Sommatie reeks ) via de constructor een goed idee ?
• Iemand verder nog opmerkingen over mijn ideeën, mijn ontwerp of anderzijds iets op te merken?
Opbouwende kritiek en opmerkingen vind ik altijd prettig om te horen, ik sta er voor open en barst maar los wat dat betreft. Ook voorbeelden over hoe het mooier kan geschreven in andere talen zijn welkom. Alvast dank voor het lezen van het verhaal en het investeren in van de tijd

