O
cooky451 schrieb:
Das meinte ich eigentlich nicht.^^ Das Problem war doch, dass der Typ von "State" abhängig ist von A. Du hast dann den Zustand rausgezogen und vector<double> als "generische" Schnittstelle genommen. Meine Idee war jetzt, einfach einen State zu machen, der für alle A funktioniert. Dann hat man vielleicht ein paar Stellen drin, die nur manchmal gebraucht werden, aber man muss da nichts mehr
später aus dem Ding wieder raus popeln.
Das ist bei der Variabilität schon schwierig (wir haben im worst case eine dynamische Anzahl von matrizen, vektoren, skalaren und anderem Kleinkram...). Wäre sicherlich besser als die jetzige Version...andererseits ist alles besser als die jetzige Version. Und der Ansatz führt noch immer nicht zu Code, bei dem die Zustandsvariablen ordentliche Namen haben.
hmm...
@footrans ja, an sowas habe ich auch schon gedacht. Es gibt an der Stelle aber eine einfachere Lösung, die man eventuell verwenden könnte:
Result myFunc(A& a, B& b,Arg& some_arg){
Result fooResult = a.foo(some_arg);
Result temp = b.transform(temp);
Result res = a.bar(fooResult,temp);
return res;
}
da bar die Ableitung der Funktion foo ist und wir häufig den Fall haben, dass wir die Ableitung in der form f'(x)=g(f(x)) ausdrücken können, macht es sinn, an der Stelle den Funktionswert zu erwarten.
Muss ich aber mit meinen Leuten abklären, was die davon halten.
OT:
Ich bin noch immer unentschlossen. Der globale State, wie ich ihn vorgeschlagen habe ist zwar nett, insbesondere weil er die Implementationsdetails nicht nach außen trägt, andererseits sehe ich schon jetzt, dass das nur eine leaky-abstraction ist und ich in manchen Fällen trotz des versteckten Zustandes dafür Sorge tragen muss, dass ich nicht aus versehen wichtige Dinge überschreibe.
Genau so ginge ja auch:
struct MyModel{
private:
class State{...};
public:
virtual Result foo(some_arg, AbstractState& state)const{
State& state = state.get<State>();
state = ...;
//was auch immer sonst berechnet werden muss
}
virtual Result bar(transformedFoo, AbstractState const& state)const{
State& state = state.get<State>();
//nutze state
}
};
Arrgh Entscheidungen...