Zitat von KingCrunch
Ankündigung
Einklappen
Keine Ankündigung bisher.
Arbeitszeitrechner
Einklappen
Neue Werbung 2019
Einklappen
X
-
So, hab Montag das letzte mal drauf geguckt und heute nochmal schnell und kurz ne neue Funktionalität eingeführt, dazu aber gleich noch was Der Link dazu ist der selbe geblieben: Datahandler/Csv.php
Ich würde es ja auch gerne selbst testen (vorallen da ich dann Fehler schnell selber beheben kann), aber mir fehlt ja nu weiterhin ne Project- und ne Work-Klasse, mit der ich was experimentieren kann, und da nen dummy selbst zu schreiben, bin ich zu faul Wär cool, wenn mir da jemand was zukommen lassen kann.
So, hab ja nu noch schnell was Neues eingebaut. Und zwar find ich es (entgegen bei Datenbanken) bei Csv-Dateien im Speziellen und Datenspeicherung in Dateien im Allgemeinen nicht sooo gelungen, wenn man nach 1 Jahr Dauerbetrieb 6 oder 7stellige IDs hat. Deshalb wird nun mit 1% Wahrscheinlichkeit (einstellbar zwischen 0.00 (nie) und 1.00 (immer)) die IDs der projekts und der works neu vergeben, wobei aber die Zuordnung der works zu den projects erhalten bleibt (solange alles funktioniert ). Die Wahrscheinlichkeit tritt erst dann ein, wenn sowieso auf die Dateien geschrieben wird (also wenn sich entweder die works oder die projects geändert haben). Ich hab diese Methode public gemacht, weiß aber noch nicht, ob das eine gute Idee war ^^
So, dann is erstmal für mich PauseNicht jeder Fehler ist ein Bug.
Kommentar
-
So. Das ganze klappt soweit leider nicht. Es sind zuviele Fehler in der Csv.php. Das liegt einfach an der Tatsache, dass du die Datei nicht getestet hast. Außerdem haben wir ein paar Schnittstellen-Probleme.
Zunächst hast du die write()-Methode hinzugefügt, die so nicht im Interface festgelegt war. Ich bin davon ausgegangen, dass beim Aufrufen einer set*() Funktion, das jeweilige Objekt sofort gespeichert wird. Wenn du nachträglich die Schnittstelle erweiterst musst du den Rest der Mannschaft davon informieren.
Weiterhin gab es noch erwähnte 2 Notices und file_put_content, hier fehlte ein s
Außerdem hat sich ein Fehler eingeschlichen, den wir nicht bedacht hatten (oder hast du es?) Und zwar darf sich die ID eines Elements niemals ändern. Außerdem ist bei setProject() die ID möglicherweise noch garnicht gesetzt (wenn ich nämlich ein neues Projekt anlege). Deine Klasse muss dem Element dann seine ID zuweisen.
Optimal wäre es, wenn wir noch 2 Erweiterungen einführen könnten:
set*() Methoden haben als Rückgabewert nicht BOOL, sondern ihr gespeichertes Objekt. Also nicht das übergebene Objekt, sondern die set*() Methode muss dann nach dem Speichern mit der get*() Methode das Objekt abrufen. Somit kann das Anwender-Skript gleich sehen, ob die Speicherung auch erfolgreich war (und die erfolgreich abgespeicherten Daten zB gleich wieder ins Formular eintragen - somit bekommt auch der Anwender mit, ob die Speicherung erfolgreich war).
Außerdem habe ich deinen Konstruktor bearbeitet. Es macht keinen Sinn einen Dateinamen zu übergeben, wenn die Speicherung auf mehreren Dateien vorgenommen wird. Somit wird nun ein Pfad als Wert erwartet/übergeben.
Somit ergibt sich folgende Schnittstelle (falls du noch Lust hast KingCrunch )
PHP-Code:<?php
interface iDataHandler
{
/**
* select your storage parameters
* @param mixed $mCustomParams storage parameters
*/
public function __construct($mCustomParams = null);
/**
* sets a new or updated work
* @param object $oWork work object
* @return bool success
*/
public function setWork($oWork);
/**
* removes a work by its id
* @param integer $iWorkId work id
* @return bool success
*/
public function removeWork($iWorkId);
/**
* retrievs a work by its id
* @param integer $iWorkId work id
* @return object work object
*/
public function getWork($iWorkId);
/**
* retrieves a work between a give time frame
* @param array $aProjectIds list of project ids (or array(0) for all)
* @param string $sStartTime start
* @param string $sEndTime end
* @return array array of work objects
*/
public function getWorks($aProjectIds, $sStartTime, $sEndTime);
/**
* sets a new or updated work
* @param object $oProject project object
* @return bool success
*/
public function setProject($oProject);
/**
* retrieves a project by its id
* @param integer $iProjectId project id
* @return object project object
*/
public function getProject($iProjectId);
/**
* removes a project by its id
* @param integer project id
* @return bool success
*/
public function removeProject($iProjectId);
/**
* retrieves all projects
* @return array array of project objects
*/
public function getProjects();
}
?>
write() sollte demnach weg, wenns geht
Kommentar
-
Öhm ... write() war doch protected und nur vom destructor aufgerufen. Insofern beinträchtigt es die Schnittstelle doch nicht ^^ Und da zur Laufzeit die Daten nicht aus der Datei, sondern aus dem ... ah, ich glaub, ich seh das Problem ^^ Wenn man zwei Objekte in der Art hat gleichzeitig hat so von wegen Synchronität Hätte eigentlich gerne die write-Methode behalten und Lese-/Schreibzugriffe zu minimieren, vielleicht denk ich mir da was mit Options aus (Dann default eben off ) Das beudetet dummerweise aber auch, dass ich bei jeden Lese-Zugriff auch immer die Datei lesen muss, weil ein anderes Objekt sie ja geändert haben muss -.- Nagut, bin jetzt (mutwillig) davon ausgegangen, dass zeitgleich immer nur ein Objekt der Art existiert ^^
Ah, ne, hab write public gemacht, falls mal jemand so nebenbei speichern will ^^ Also nicht als Interface-Erweiterung, sondern als interne Funktion mit "feature", dass man sie auch von aussen (gefahrlos ^^) ausführen kann. Wirdse einfach protected gemacht und bei jedem Set aufgerufen, das sollte klappen.
Das mit set sinngemäß so, oder?
PHP-Code:public function setProject ($oProject) {
// blabla id einsammel
return $this->getProject ($id);
}
Das mit der ID hab ich auch lange überlegt, andererseits habe ich mir gedacht: Die ID kann sich erst im Destructor ändern, was bedeutet, dass es kein X-Objekt mit der id mehr geben sollte. Also macht es sich erst (intern) beim nächsten Aufruf bemerkbar, wobei dann alle gleichartigen Objekte wiederum die selbe ID besitzen. Und solang die Bezüge bestehen bleiben ... Andererseits gehn mir auch die Gegenargumente durch den Kopf ^^ Nicht drüber nachdenken Fürn Workaround kann man das "id-reset" erstmal auf 0.00 stellen, solange bis es wieder raus kommt. Wobei ich dieses "feature" auch hier angekündigt habe
Sind aber ehrlich gesagt auch net sooo die umfangreicheren Änderungen ^^ (Will, dass mir PDT wieder die Notices markiert -.-) Ich gucks mir ma an.
PS: remove*() geben aber weiterhin bool aus?Nicht jeder Fehler ist ein Bug.
Kommentar
-
Ich hätte auch noch sowas anzubieten
PHP-Code:public function setProject ($oProject) {
// blabla id einsammel
return ($this->getProject ($id) == $oProject);
}
Nicht jeder Fehler ist ein Bug.
Kommentar
-
Eigentlich interessiert uns ja nicht nur ob die Speicherung geklappt hat, sondern was ihr Ergebnis ist. Es könnte ja sein, dass die Speicherung teilweise geklappt hat, zum Beispiel alles abgespeichert wurde, nur der Name zuviel Zeichen hatte und deshalb abgeschnitten wurde. Wäre das dann ein TRUE oder FALSE?
Das sollte die Anwendung im Einzelfall entscheiden.
(wenn ich an allem was rumzunörgeln hab, dann heißt das nicht dass das Sinn macht, ich denke nur laut und kritisieren ist besser als alles gut finden - also sagt ruhig eure Meinung dazu)
Kommentar
Kommentar