Um eine Methode leicht verständlich zu machen, gibt es viele Möglichkeiten. Man kann die Parameter benennen oder den Methodennamen selbst dazu nutzen. Hat man zwei Methoden, die fast das Selbe machen, dabei aber unterschiedlich Parameter erwarten, kann man dies anhand des Namens deutlich machen:
class Date
{
public function setTimestamp($value)
{
// ...
}
public function setAtomFormattedDate($value)
{
// ...
}
public function setRssFormattedDate($value)
{
// ...
}
// ...
}
Was aber macht man, wenn man den Wert schon im Konstruktor übergeben will? Continue Reading »
Im Moment absolviere ich an der Uni ein Softwarepraktikum, bei dem man in einer Gruppe von 7-8 Studenten innerhalb von 6 Wochen zwei Java-Projekte umsetzten muss. Ganz interessant zu beobachten ist dabei, dass viele der Studenten — die meist zum ersten mal praktische Erfahrungen in OOP machen — die gleichen Anfängerfehler machen, die ich auch in meinen Anfängen gemacht habe.
Continue Reading »
Nachdem die meisten Klausuren vorbei sind, habe ich endlich mal wieder Zeit, einen Artikel zu schreiben. Heute soll es mal um das Testen der eigenen Webseite gehen. Während das Testen von objektorientierten Anwendungen mittels PHPUnit immer mehr zum Standard geworden ist, gab es für die übrigen Anwendungen lange Zeit kein geeignetes Testwerkzeug. Mit LiveTest gibt es nun ein Testwerkzeug, das diese Lücke schließt. Und was mir besonders gefällt: Es kann schon von Anfängern in der Programmierung genutzt werden, ist aber auch für Profis noch von Nutzen.
Continue Reading »
Heute soll es mal nicht um PHP gehen, sondern um LESS, einen Präprozessor für CSS. Während sich die PHP-Programmierung in den letzten Jahren stark verändert hat, hat sich am Arbeiten mit CSS wenig geändert. Klar, es gibt einige neue Eigenschaften, aber die Art, wie man CSS schreibt, ist immer noch die selbe geblieben. Und hier setzt nun LESS an.
Continue Reading »
Arrays gehören wohl mit zu den Gründen, wegen denen PHP als anfängerfreundlich gilt. Als mir in der Schule mit Java das erste Mal eine andere Programmiersprache als PHP begegnet ist, war ich erstaunt über die wenigen Möglichkeiten, die mir die Arrays dort boten. Aber es soll hier nicht um einen Vergleich der Programmiersprachen gehen, sondern um die Probleme, die dieser Luxus bereiten kann.
Continue Reading »
Vor einigen Tagen habe ich in einem Artikel beschrieben, wie man mit vielen Parametern in Methoden umgehen kann. Beim Konstruktor handelt es sich allerdings um einen Sonderfall, denn im Gegensatz zu normalen Methoden haben die einzelnen Parameter oft nicht viel miteinander zu tun und lassen sich deswegen nicht zu Parameterobjekten zusammenfassen. Um den Code dennoch lesbar zu halten, benötigen wir andere Mittel.
Continue Reading »
Im Netz gibt es zahlreiche Vergleiche zwischen single- und double quotes. Die Meisten basieren auf verschiedenen Benchmarks und stellen die Performance-Unteschiede zwischen den beiden Möglichkeiten dar. Da ich die minimalen Performance-Unterschiede für nicht relevant halte, möchte ich heute einen etwas anderen Vergleich vorstellen.
Continue Reading »
Durch Objektorientierte Programmierung versucht man unter anderem, die einzelnen Komponenten einer Software möglichst lose zu koppeln und Abhängigkeiten zu vermeiden. Ein erster Schritt in diese Richtung ist es, die Eigenschaften eines Objektes als private oder protected zu kennzeichnen. Der Zugriff auf diese Eigenschaften erfolgt ausschließlich über entsprechende set- und get-Methoden. Dadurch haben wir z.B. die Möglichkeit, den Namen der Eigenschaft zu verändern ohne die Änderung an allen Stellen durchführen zu müssen, die die Eigenschaft des Objektes verwenden.
Das hier beschriebene Prinzip nennt sich Kapselung. Schauen wir uns das bei folgendem (sinnfreien) Beispiel an.
class Car
{
private $_name;
public function __construct($name)
{
$this->_name = $name;
}
public function getName()
{
return $this->_name;
}
}
class Person
{
private $_name;
private $_car;
public function __construct($name, Car $car)
{
$this->_name = $name;
$this->_car = $car;
}
public function getName()
{
return $this->_name;
}
public function getCar()
{
return $this->_car;
}
}
class Logger
{
public function log(Person $value)
{
printf(
'%s fährt einen %s',
$value->getName(),
$value->getCar()->getName()
);
}
}
$car = new Car('VW Golf');
$person = new Person('John', $car);
$logger = new Logger();
$logger->log($person);
Soweit so gut, unsere Daten sind alle ordentlich gekapselt. Was aber, wenn wir nun aus der getName-Methode eine getShortName-Methode machen wollen? Nun stehen wir vor dem gleichen Problem, das wir schon bei der Kapselung hatten. Wir müssen unsere Änderungen unter Umständen an vielen Stellen durchführen. Auch wenn die IDE heutzutage viel Arbeit abnimmt, wir haben eine Menge Abhängigkeiten geschaffen und genau das wollten wir ja eigentlich vermeiden.
Continue Reading »
Oft entwirft man Methoden, die viele Parameter benötigen. Nachdem noch 1-2 Features zu der Klasse hinzugefügt wurden, stellt man dann fest, dass es eindeutig zu viele Parameter geworden sind. Folgende Methode dient uns als Beispiel:
public function send(
$fromStreet, $fromPostalCode, $fromCity, $fromCountry,
$toStreet, $toPostalCode, $toCity, $toCountry
) {
//..
}
Das mag bei der Definition noch einigermaßen übersichtlich sein, doch spätestens bei der Nutzung der Methode geht die Übersicht verloren (und das obwohl die Reihenfolge der Parameter sich hier einfach ableiten lässt):
$obj->send('Musterstraße 74', '22041', 'Hamburg', 'Deutschland', 'Musterweg 42', '8471', 'Leibnitz', 'Österreich');
Continue Reading »
Oft brauche ich eine Funktion, die mir einen von verschiedenen Faktoren abhängigen Wert zurück liefert. Das folgende Beispiel stammt aus der Berechnung von Bonuspunkten für einen Onlineshop.
public function getCreditPoints()
{
$points = $this->_getBasisPoints();
if ($this->_isPayedWithCreditCard()) {
$points *= 1.1;
} else if ($this->_isPayedWithPrepayment()) {
$points *= 1.25;
}
return $points;
}
Der Code ist soweit okay, lässt sich aber in einer Hinsicht noch optimieren. Jeder, der sich die Methode anschaut, muss sich sowohl beim if-Block als auch beim elseif-Block merken, was bisher passiert ist. Denn zu dem Zeitpunkt weiß der Leser ja noch nicht, dass mit $points nichts mehr gemacht wird.
Continue Reading »