Blog
Mein Standort
Kategorien
Die doppelte Negation - Wunder oder Fluch?
gepostet in Programmierung am 04.05.2009 um 21:11
Heute hab ich wieder gesehen, dass einem die doppelte Negation bei der Entwicklung die wildesten Überraschungen beschert.Da ist z.B. der Fall eines Settings:
$bNotActive = false;
if(!$bNotActive == true) {
return false;
}An solchen Codebeispielen kann man schön lange grübeln, wenn man möchte.
Natürlich hätte man das auch so schreiben können:
$bActive = true;
if($bActive != true) {
return false;
}Das Problem sind manchmal einfach nur die Gedankengänge, die man beim Schreiben des Quellcodes hat.
Variablenname: Man möchte manchmal einfach ausdrücken, dass ein Aktivitätsflag eben negiert ist, also schreibt man im Namen Ausdrücke wie "not". Diese Namensnegierungen sorgen immer wieder für Verwirrungen, weil man häufig im Kopf umdenken muss. Solche Negationen sind also besser, wenn man sie nicht macht.
Negation der Variablen statt des Vergleichs: Mal abgesehen davon, dass das Ausrufezeichen vorne kaum zu erkennen ist, erfordert es zweimaliges Umdenken beim Lesen, sodass dort schnell Fehler entstehen können.
Schnelligkeit bei Umstellungen: Man hat etwas umgestellt, was jetzt nicht mehr prüft, ob etwas aktiv ist, sondern eher inaktiv (weil's einfacher war oder so). Dann entstehen solche Dirty Hacks, die halt einfach funktionieren. Was will man mehr?
Fazit: Es ist eher ein Fluch. Wenn solche Codeschnippsel also entstehen, weil man grad ein bisschen Code umstellen will, ist es manchmal wirklich sinnvoller, etwas mehr Code anzufassen, und es u.U. gleich richtig zu machen, falls sich die Caller solcher Methoden auf evtl. doppelte Negationen berufen und der Kollege, der die Quellen beerbt, das Zeug weiterpflegen soll.
Coding Conventions sind wichtig [Update]
gepostet in Programmierung am 23.04.2009 um 21:25
Man glaubt gar nicht, wie wichtig Coding Conventions sein können, sobald man mit mehr als sich selbst an einem Projekt arbeitet.Problem: Wir nehmen ein PHP-Projekt mit zwei Entwicklern.
Ein Entwickler ist ein sehr schneller Coder. Er schreibt viel in kurzer Zeit, darunter auch Dirty Hacks weil's laufen muss und er schafft es, ein IF, ein FOREACH, ein RETURN und vielleicht noch ein BREAK (natürlich im Source alles klein geschrieben) in eine Zeile zu pressen und das Ganze ohne eine geschweifte Klammer.
Der andere Entwickler ist er der, der alles etwas langsamer angeht, dabei aber mehr nachdenkt und dessen Ergebnis vielleicht dann sogar noch mit Unittests verifiziert wird. Allerdings schreibt er sehr luftigen Code, alles fein säuberlich einrückt, Methoden/Funktionen schön sauber dokumentiert und Klammerungen sind sein Freund. Außerdem geht er nach dem Motto vor: "Es gibt zwei Arten von IFs: Die, die ein ELSE haben und die, die eins bekommen werden" (danke @wolfspelz für diesen tollen Spruch).
Nun gibt es bei diesem Szenario ein Problem. Der schnelle Programmierer läuft vor den Linienbus und liegt für ein paar Wochen im Krankenhaus und kann keine Fragen beantworten, geschweige denn programmieren. Jetzt muss sich der Vernünftige in diesen fremden Code einarbeiten, kann aber mit dieser kompakten Art und Weise nichts anfangen. Dokumentation gibt es natürlich nicht und überhaupt ist fremder Code eh immer doof.
Letzteren Aspekt kann man nicht wegdiskutieren und ist einfach ein psychologisches Problem. Aber wenn sich beide auf einen gemeinsamen Nenner geeinigt hätten, in dem beide programmieren, wäre es kein Problem, einen Bug schnell zu finden und zu beheben, da alles eine einheitliche Struktur hat.
Wichtig sind hier folgende Aspekte:
- welche Klammerungen verwendet man?
Macht man die geschweiften Klammern hinter die Methodenparameter oder am Anfang der nächsten Zeile
z.B.public function Methode ($parameter) {
Aufrufe;
}
oder lieberpublic function Methode ($parameter)
{
Aufrufe;
} - wie sind die Einrückungen zu machen?
Entwickelt ein Entwickler auf einer Console z.B. mit dem VIM, kann es sein, dass dieser bei Tabs die Krise bekommt, weil diese auf eine Weite von 8 Spaces eingestellt sind, beim anderen Entwickler in der IDE aber auf zwei Zeichen stehen. Benutzt man also Tabs oder lieber Leerzeichen? Und wieviele eigentlich? - wie sind Variablen, Klassen und Funktionen/Methoden zu benennen?
Hier ist auf jeden Fall die Sprache festzulegen (recommended: Englisch :) ), außerdem die Syntax der Variablen, also z.B. benutzt man Unterstriche, Camel-Case (mit gehobenen oder gesenkten Kopf) oder vielleicht sogar die ungarische Notation also mit Prefix - welche Dokumentationsform wählt man?
Häufig werden z.B. private-Methoden nicht dokumentiert, weil die Klasse gefälligst selbst zu wissen hat, was sie braucht und nach aussen sieht man es eh nicht. Benutzt man Standard-Dokustile wie PHPDoc oder vielleicht doch was ganz anderes?
All diese Dinge dienen nicht nur der Lesbarkeit, sondern auch des Maintaining des Ganzen. Der oben beschriebene Fall, viele Dinge in einer Zeile zu machen, sind beim reverten im SVN von großer Wichtigkeit z.B. beim Anschauen des Diffs einer Revision. Niemand bekommt in einem Projekt einen Preis für's obfuscating von Quelltexten. Und nur weil der Source undurchsichtig geschrieben ist, wird er nicht automatisch sicherer.
Für manch einen Entwickler mag es eine große Umstellung sein, sich an Konventionen zu halten, aber es lohnt sich wirklich für alle Seiten.
Update: Natürlich sind Konventionen nicht alles. Meine Beispiele oben sind auf zwei Personen ausgelegt, was die Sache nicht komplett verdeutlicht. Man rechne dieses Szenario aber hoch auf 10 bis 30 Leute. Wen jeder von denen unterschiedlich programmiert, bekommt man Sourcen, die am Ende nahezu unleserlich sind. Man springt von Block zu Block in eine andere Syntax. Das wäre, als würde in einer Zeile PHP, in der zweiten Perl, der dritten Python, ASP oder gar Erlang stehen. Wenn der Maintainer dann mal "eben schnell" was fixen muss, ist es vorbei mit alptraumfreien Nächten.
Coding Weekend
gepostet in Programmierung am 17.03.2009 um 13:46
Sven Wiesner hat die Welt am Wochenende ueber Twitter staendig ueber sein "Coding Weekend" auf dem Laufenden gehalten. Das Produkt, was dabei rausgekommen ist, ist "Getwitter". Mir stellt sich natuerlich die Frage, ob man sowas nicht haeufiger mal aufziehen sollte?!Jeder hat doch seine kleine Idee im Kopf, die er gerne mal coden wuerde, nur alleine waere es mehr als an einem Wochenende schaffbar, aber Leute kann man sich dafuer auch nicht leisten. Also warum nicht bei einem Coding Weekend einfach mal for Fun zusammensetzen und gemeinsam programmieren?
Ablaufplan: Man setzt sich am Samstag Morgen hin, stimmt ab, was gecodet wird, welche Programmiersprache verwendet wird, vielleicht hat man noch einen Designer dabei, der das Ganze optisch aufwertet und dann geht's los und man hat bis Sonntag Abend Zeit, bis zu einem bestimmten Punkt ein fertiges Produkt auf die Beine zu stellen. Es muss ja nicht immer alles gleich fertig sein, aber zumindest fuer den Enduser benutzbar.
Das Einzige, was organisiert sein muss, ist die Location. Vielleicht stellen Firmen ihre Bueroraeume zur Verfuegung oder jemand hat einen grossen Partykeller mit Internetanschluss :o)
Verpflegung kann man ganz Coder-Like ueber Pizzabestellung o.ae. abwickeln. Ich hab fuer diesen Zweck mal ein mixxt-Netzwerk aufgesetzt unter codingweekend.com.
Ich persoenlich waere ja dafuer, das mal in Hamburg auszuprobieren. Jemand Interesse?
Adblock + Heise - empty spaces = benutzbar
gepostet in Programmierung am 09.12.2008 um 18:40
Mich hat es ehrlich gesagt total angenervt: Man blendet mit Adblock Plus die Werbung auf Heise.de aus und dann haben die Jungs den Inhalt von oben aus gesehen absolut positioniert.Deswegen hab ich heute mal einen kleinen Zwei-Zeiler fuer Greasemonkey geschrieben.
Das kleine Script kann man hier installieren/downloaden: HeiseAdsSpaceRemover
Delete all delicious bookmarks with PHP
gepostet in Programmierung am 30.11.2008 um 18:17
Today I wanted to delete all my del.icio.us bookmarks because they were outdated and I wanted to reimport them. But the delete method on the website is really lame and even the Firefox plugin is not able to delete all bookmarks without selecting them manually and delete them one-by-one...So I took the del.icio.us API and wrote a small PHP script to fetch all bookmarks and delete them.
All you need to install is a PHP CLI and the Curl-Plugin:
aptitude install php5-cli php5-curlNow copy the source and safe the script:
<?php
$Username = ''; // insert your username here
$Password = ''; // insert your password here
$Return = "";
$ch = curl_init("https://api.del.icio.us/v1/posts/all");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $Username .":". $Password);
$Return = curl_exec($ch);
curl_close($ch);
$xml = new SimpleXMLElement($Return);
$i = 0;
foreach($xml->post as $post) {
$DeleteUrl = (string) $post->attributes()->href;
$Url = "https://api.del.icio.us/v1/posts/delete?url=". urlencode($DeleteUrl);
echo "trying to delete ". $DeleteUrl ." ";
$ch = curl_init($Url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $Username .":". $Password);
$DeleteReturn = curl_exec($ch);
if(strstr($DeleteReturn, "<result code=\"done\"")) {
echo "... done\n";
} else {
echo "... failed\n";
}
curl_close($ch);
$i++;
}
echo "Deleted {$i} URLs\n";
?>You need to insert your username and password at the beginning of the script. After that you run it from the command line at your own risk:
php script.phpThat's it... The script needs a while to delete your bookmarks.
