Come pratica, sto progettando di implementare una libreria di calcolatori multivariabile. L'idea è che puoi definire una funzione, come f(x, y) = sin(x)^2 + 3*y^3
, e quindi puoi valutarla con valori di variabile specifici (ad esempio f(4, 3)
) o prendere la derivata rispetto a una certa variabile e ottenere un'altra funzione. L'idea è che potrebbe essere utilizzato da un programma di fisica o un'app calcolatrice che esponga più direttamente la funzionalità.
Non sono sicuro di come costruire la migliore interfaccia. Usando lo stile che mi è più familiare, potrei definire la funzione sopra con Function f = new Sum(new Exponent(new Sin(new Variable("x")), 2), new Product(new Constant(3), new Exponent(new Variable("y"), 3)
, ma è molto lunga rispetto alla tipica stenografia matematica. Ecco alcuni modi in cui posso immaginare che l'API funzioni:
-
Function f = new Sum(new Exponent(new Sin(new Variable("x")), 2), new Product(new Constant(3), new Exponent(new Variable("y"), 3)
(come prima) -
Function f = Sum.create(Exponent.create(Sin.create(Variable.create("x")), Constant.create(2)), ...
(come prima ma con metodi di build statici) -
Function f = sum(power(sin(getVariable("x")), getConstant(2)), product(getConstant(3), power(getVariable("y"), constant(3)))
(più breve, ma richiede un bel po 'di importazioni statiche) -
Function f = FunctionGenerator.parse("sin(x)^2 + 3*y^3")
Mi piacciono 4 perché è molto più breve, ma sono diffidente perché raramente lo vedo usato; i due esempi che ho visto che mi vengono in mente sono Regex e MySQL, e sono entrambi fondamentalmente il porting di linguaggi testuali più vecchi. In particolare, Regex sembra avere senso per un'API testuale perché è utilizzata per l'elaborazione del testo.
In breve, mi piace il # 4 ma sto attraversando un periodo difficile per giustificare questa partenza dalla convention.
(Nota: so che l'opzione # 4 richiede un parser.Ho già usato ANTLR, quindi questo non dovrebbe essere un problema.)