Inhaltsverzeichnis
CLI: Sim und Fit in Unterfunktionen
- Idee
- Auslagerung der Bereiche für „sim“ und „fit“ in Unterfunktionen.
- Vorteile
- Sorgt für übersichtlicheren Code
- Vereinfacht ggf. die Übergabe von Datensätzen, je nachdem, woher man kommt und was man will.1)
- Implementierung
- Geht mit der Umwandlung in eine Funktion einher
Umsetzung
Der Schlüssel ist eine sinnvolle und brauchbare Schnittstelle der Funktionen.
Nachfolgend deshalb die Vorschläge für die beiden Funktionsköpfe. Die Funktionsnamen (trEPRTSim_cli_sim
und trEPRTSim_cli_fit
) sind vorläufig und sollen keine Vorentscheidung darstellen.
Schnittstelle
function varargout = trEPRTSim_cli_sim(varargin) % TREPRTSIM_CLI_SIM Subfunction of the trEPRTSim CLI handling the simulation part. % % Usage % trEPRTsim_cli_sim % trEPRTSim_cli_sim(dataset) % dataset = trEPRTSim_cli_sim % dataset = trEPRTSim_cli_sim(dataset) % [dataset,<command>] = trEPRTSim_cli_sim(dataset,<command>) % % dataset - struct % Full trEPR toolbox dataset including TSim structure % % command - string % Additional information what to do (bypassing certain loops)
Ideen zur Schnittstelle:
- In der einfachsten Form wird einfach nur die Routine aufgerufen und definiert sich ihren Datensatz selbst (wie bisher).
- Soll ein Datensatz übergeben werden, z.B. um basierend auf einem Fit Simulationen anzustellen, wird dieser übergeben.
command
erlaubt die Übertragung zusätzlicher Informationen zum Ablauf in beide Richtungen.- Gerade beim verschachtelten Aufruf kann das noch wichtig werden, um die Funktion zu beenden.
- Sollen bestimmte Teile der Schleife übersprungen werden, kann das ebenfalls über das Kommando mitgeteilt werden.
- Die Ausgestaltung der Kommandos müßte noch aus der Praxis heraus überlegt werden.
Aufruf
Der Aufruf in der Hauptschleife, die zwischen Fit und Simulation unterscheidet, sieht vermutlich wie folgt aus:
% ... % Chose wether it shall be simulated or fitted answer = cliMenu({'f','Fit';'s','Simulate';'q','Quit'},'default','f','title',... 'Do you wish to simulate or to fit?'); switch answer case 'f' trEPRTSim_cli_fit(); case 's' trEPRTSim_cli_sim(); case 'q' disp('Goodbye!'); return; otherwise % Shall never happen action = ''; end
Alternativ (vielleicht sinnvoller) könnte das auch innerhalb der outerloop
stattfinden:
outerloop = true; while outerloop switch lower(action) case {'fit','f'} [dataset,command] = trEPRTSim_cli_fit(); if strcmpi(command,'exit') outerloop = false; end case {'sim','s'} [dataset,command] = trEPRTSim_cli_sim(); if strcmpi(command,'exit') outerloop = false; end end end
Wenn die Funktionen sich untereinander selbst aufrufen, eben gerade um vom Fit zur Simulation und zurück zu wechseln, ist es wichtig, sie mit den Rückgabeparametern aufzurufen:
[dataset,command] = trEPRTSim_cli_sim();
bzw.
[dataset,command] = trEPRTSim_cli_sim(dataset);
Da es jetzt vermutlich aufgrund der Schachtelung nicht mehr einfach möglich ist, die Funktion zu beenden – return
wird vermutlich nur bis zur aufrufenden Funktion zurückgehen –, müßte im Falle, daß man enden möchte, als Rückgabewert für „command“ sowas wie „exit“ übergeben werden. Das könnte dann wie folgt abgefragt werden:
[dataset,command] = trEPRTSim_cli_sim(); if strcmpi(command,'exit') return; end
Erzeugung eines Datensatzes
Bislang erzeugen sowohl die Fit- als auch die Simulationsschleife jeweils einen leeren Datensatz. Im Fit wird dieser dann weitestgehend mit den Daten aus dem geladenen experimentellen Datensatz gefüllt.
Wenn man den zu schreibenden eigenen Funktionen jeweils optional einen Datensatz übergeben kann, muß das natürlich abgefragt werden. Das könnte ungefähr so aussehen:
if nargin % If we have input arguments if isstruct(varargin{1}) dataset = varargin{1}; end else % Create (empty) dataset % TODO: Handle missing parameters, such as field range, ... dataset = trEPRTSim_dataset(); % Initialize minimal simulation parameters dataset = trEPRTSim_simini(dataset); end