Programmstruktur und technische Details

Die in diesem Dokument zusammengestellten Informationen sollen technisch interessierten Nutzern die Möglichkeit geben, tiefer in AbiCalc vorzudringen. Grundlegende Kenntnisse von PHP sind daher empfehlenswert.

# class AbiCalc (Hauptprogramm)

Informationen zur Hauptklasse AbiCalc findest Du demnächst an dieser Stelle.

# class AbiCalcFach (Fächer)

Ein AbiCalcFach, im Fogenden nur noch "Fach" genannt, bündelt mehrere AbiCalcFelder und kann selber in AbiCalcGroups gebündelt sein. Fächer ermöglichen es, Operationen auf mehrere Felder anzuwenden und bestimmte Suchabfragen zu erledigen.

Methoden zum Arbeiten mit Flags

void toggleMemberFlags($feldid,$flagold,$flagnew)
Ändert eine Flag eines ABiCalcFeldes das Teil dieses Faches ist. Wird bspw. genutzt, wenn ein Fach aufgrund einer Besonderen Lernleistung vom Abifach zum Grundkurs wird.

array getUsedFlags()
Erzeugt ein Array mit allen von diesem Fach und seinen Feldern genutzen Flags.

array getFelderByFlag($flag,$negative=false)
Gibt die Felder des Faches mit einer bestimmten Flag oder mehreren Flags zurück. Ist $negative gesetzt, werden die Felder zurückgegeben, die die Flags nicht haben.

array hasFlag($flag,$strict=false)
Prüft, ob das Fach über eine oder mehrere Flags verfügt. Ist $strict gesetzt, müssen alle Flags gefunden werden, sonst reicht schon eine.

Methoden für die Ausgabe

int getGesamtPunkte()
Gibt die Gesamtpunkte des Faches zurück, mit korrektem Multiplikator.

int getVornote()
Gibt die Vornote des Faches zurück, wichtig für Abweichungen.

# class AbiCalcFeld (Felder)

Ein AbiCalcFeld, im Folgenden nur noch "Feld" genannt, ist quasi die kleinste Datenstruktur in AbiCalc. Mehrere Felder bilden ein Fach, mehrere Fächer eine Gruppe. Das Feld stellt einige Methoden und ein paar Datenfelder zur Verfügung:

Objektvariablen
<?php
private $id 0;
private 
$count false;     # Geht ein?
private $nocount false;   # Niemals eingehen?
private $multi 1;         # Multiplikator
private $punkte null;     # Note
private $flags null;      # Flag-Array
private $message null;    # Tooltip-Text
public $mother null;      # Mutter-AbiCalcFach
public $label null;       # Label des Feldes
?>
Die wichtigsten Methoden

boolean isFlagSet($flag)
Gibt true zurück, falls die Flag $flag gesetzt ist. Diese Methode wird hauptsächlich von AbiCalcFach-Objekten benutzt.

boolean setCount($force=false)
Sorgt dafür, dass das Feld gezählt wird - wenn $force gesetzt ist wird das Fach sogar gezählt, falls $nocount gesetzt ist.

boolean isCount()
Gibt zurück, ob $count für das Feld gesetzt ist.

int getPunkteMulti()
Gibt die Punkte dieses Feldes zurück - direkt mit dem richtigen Multiplikator.

Zusätzlich noch get- und set-Methoden für alle Datenfelder.

# class AbiCalcGroup (Gruppen)

AbiCalcGroups, oder "Gruppen", sind das mächtigste Werkzeug in AbiCalc. Über Gruppen können beliebige Fächerbedingungen umgesetzt werden, zum Beispiel Pflichtbelegungen und Mindestkurse. Dem Rechner werden je nach Bundesland Bedingungen vorgegeben, die in etwa die folgende Form haben:

<?php
$groups
['GeschichteSowiZusatz'] = array(
    
'id'=>'gGeschichteSowiZusatz',
    
'param'=>array(
        
'name'=>'GeschichteSowiZusatz',
        
'numFaecher'=> 2,
        
'filterby' => array('K','13'),
        
'min' => 4,
        
'flags'=>array('geschichte','sowi'),
        
'errors'=>array(
            
'check' => 'Du musst Geschichte...',
            
'min'=>'Es müssen 2 Kurse Ges...',
            
'count' => 'Deine Zusatzkurse Gesc...'),
    ),
);
?>

Aus einem solchen Array baut sich der Rechner eine AbiCalcGroup, indem er Fächer mit den entsprechenden Flags sucht und dabei die Bedingungen prüft - hier bspw. mindestens zwei verschiedene Fächer und 4 Kurse aus der 13. Gleichzeigt werden über solche Arrays auch Fehler- und Statusmeldungen für das jeweilige Feld gespeichert (hier gekürzt), die dann bspw. bei erfolgloser Prüfung angezeigt werden oder als Tooltip, falls ein Fach aufgrund dieser Gruppe eingehen muss.

AbiCalcGroup stellt eine breite Menge an Funktionen zur Verfügung, die den Umgang mit Bedingungen und Vorgaben wie Flags etc. erleichtern. Einen kleinen Auszug findest Du hier.

Einige Funktionen aus AbiCalcGroup

void cleanForMaximum()
Falls nur $max Kurse eingehen dürfen (Sport bspw.), werden die restlichen auf $nocount gesetzt.

void cleanForMinimum()
Die $min besten Kurse der Gruppe (sortiert nach Fächern) werden auf $count gesetzt.

void cupple()
Eine der kompliziertesten Funktionen - berechnet die günstigste Möglichkeit, zwei aufeinanderfolgende Kurse eines Faches eingehen zu lassen.

# Die Länderklassen AbiCalc[Land]

Für jedes Land gelten andere Bestimmungen. Daher gibt es auch für jedes Land eine eigene Klasse, die AbiCalc mit den nötigen Funktionen erweitert, also bspw. für NRW die Klasse AbiCalcNRW.

Die Struktur dieser Klassen ist denkbar einfach: sie überschreiben, falls nötig, einige Methoden in AbiCalc um auf besondere Regelungen des jeweiligen Bundeslandes reagieren zu können. In Hessen ist es zum Beispiel nötig gewesen, die Standartfunktion für besondere Lernleistungen zu überschreiben - das sieht dann so aus:

<?php
protected function besLL() {
$this->faecher['f05']->deleteMember('f05k5');
$this->faecher['f05']->toggleMemberFlags('f05k1','ABIF',null);
$this->faecher['f05']->toggleMemberFlags('f05k2','ABIF',null);
$this->faecher['f05']->toggleMemberFlags('f05k3','ABIF',null);
$this->faecher['f05']->toggleMemberFlags('f05k4','ABIF',null);
$this->faecher['f05']->toggleMemberFlags('f05k4','ABI',null);
}
?>

Hier wird ein Fach aus der Berechnung herausgenommen und bei einigen anderen Feldern wird die Flag ABIF entfernt.

# Methodensammlung AbiCalcStatic

An verschiedenen Stellen auf dieser Homepage wird auf die Methodensammlung in AbiCalcStatic zurückgegriffen. Über diese Sammlung werden bspw. die Länderauswahllisten generiert oder auch die Statistiken des Rechners. Auch die Fächerlisten (ohne länderspezifische Extras) und einige andere häufig verwendete Arrays sind dort abgelegt.

Programmstruktur und technische Details StartseiteProjekteAbicalc ↪ Programmstruktur und technische Details