Die Entwicklung eines Entwicklers

Viele (Web-)Entwickler werden auf ihre Vergangenheit mit einem sehr gespaltenem Gefühl zurück blicken. Die ersten Zeilen HTML die geschrieben wurden, geschrieben? Nein. Man hat sich die Seite fröhlich in Frontpage zusammengeklickt. Die erste PHP Funktion, die man sich aus einem anderen Programm abgeschaut hat. Die Hauptsache war, es hat funktioniert und das hat es auch! Aber selbst dafür hat man Stunden über Stunden gebraucht, war oft demotiviert und wusste auch nicht, wie man nun weiter machen sollte. Damals gab es zwar schon Foren, aber Informationen waren eher spärlich gesät, vor allem nützliche Informationen, vor 10 Jahren war eben alles noch anders. Heute hingegen gibt es zu wohl allem was man umsetzen möchte ein passendes Tutorial.

Ich werde oft gefragt, was meine Motivation war, die Webentwicklung weiter zu verfolgen. Und ich antworte ganz ehrlich: Es gab keine Programmierer für lau und ich hatte ein Projekt, welches ich weiter bringen wollte. Die Lösung war, do it yourself. Aber um zu beschreiben, welche Entwicklung ich durchgemacht habe: Vor etwa 5 Jahren, habe ich einen Post gelesen, der in etwa so lautete: “Wir haben ein Tab System gebraucht, ich habe es meinem Chef-Programmierer vorgelegt und in etwa 30 Minuten hatten wir ein funktionierendes System. Damals dachte ich mir etwas im Sinne von “wow”… Heute denke ich mir: “In dieser Basisausführung hätte ichs in 2 Minuten gebastelt… Doch fairerweise muss man dazu sagen, damals hatten sie noch kein JQuery, aber ein einfaches hide / show ist selbst in Javascript keine Kunst. Natürlich, man muss sich auch immer aktuell halten, neue Techniken lernen und evtl. auch erkennen, ob eine Umorientierung am Markt stattfindet. Ich kenne zu viele Programmierer, die ihre Sprache erlernt haben und dann nur noch meinen: “Würdest du einem Schachmeister raten auf Volksmusik umzusteigen?”, meine Antwort ist dann immer: “Nein, aber evtl. auf Pop-Musiker, damit lässt sich Geld verdienen und man erreicht mehr Leute.”. Es ist natürlich nur die halbe Wahrheit. Selbstverständlich ist jemand, der sich ausschließlich auf PHP spezialisiert hat weder überflüssig, noch unbrauchbar. Im Gegenteil, in großen Firmen in denen jeder seinen Aufgabenbereich hat, sind diese Menschen unersetzlich. Doch selbst hier muss man darüber nachdenken, ob es wirklich so sinnlos ist sich zumindest über die neuen Möglichkeiten zu informieren, Stichwort JSON Implementation in PHP.

Nehmen wir mal ein Beispiel. Ein Community CMS, für eine Seite die etwa 10000 Mitglieder zählt. Die Zielgruppe ist in etwa 14-22 Jahre und dem Programmierer steht ein Team von 4 Experten zur Verfügung. Der Kunde wünscht Javascript Effekte, um die Seite ein wenig moderner zu gestalten. Das Expertenteam, hat jedoch keine Ahnung von aktuellen Techniken. Sie quälen sich durch verschiedene Tutorials. Das Ergebnis ist: Animationen die nicht gestopt werden, Funktionen die eigentlich für mehrere Aktionen möglich wären, werden in einzelne Funktionen gepackt, anstatt dass man sie vernünftig schreibt und das Design erinnert an eine Webseite, wie sie vor 10 Jahren modern war.

Was ich mit diesem Post eigentlich ausdrücken möchte:

Liebe Mitentwickler, selbst wenn Ihr das Rad nicht neu erfinden müsst. Solltet Ihr euch ab und an informieren, wie man es inzwischen dreht. Denn die Trabis sind inzwischen Porsches und wenn man das Gaspedal nicht findet, bringen die 300 zusätzlichen PS auch nichts.

Ich danke euch für eure Aufmerksamkeit.

404 und 403 Error in einer .NET MVC Anwendung vorbeugen

Eine Webseite entwickelt sich im laufe der Zeit immer weiter und der Inhalt ändert sich kontinuierlich.

Was passiert aber nun wenn wir eine Unterseite unserer Webanwendung nicht mehr für die Öffentlichkeit erreichbar machen wollen? Die simpelste Möglichkeit ist diese zu löschen. Damit kommen aber neue Probleme auf. Webseiten die auf diese Unterseite verlinkt haben und nicht darüber informiert werden verweisen auf eine nicht mehr existente Adresse. Dies kann man zwar mit einer verschönerten 404 Meldung etwas mildern aber die User mögen dies trotzdem nicht.

Nun könnten wir natürlich im Controller einfach das ActionResult auf eine neue Adresse verweisen, die Logik in der Methode auskommentieren und ggf. noch einen Kommentar reinschreiben wie man diese Methode wieder in Betrieb nehmen kann. Ziemlich umständlich oder?

Warum nicht einfach ein Attribut wie zum Beispiel [Closed] welches direkt über der Controllerklasse oder Methode gesetzt werden kann und auf eine vordefinierte URL weiterleitet? Nichts leichter als das!

using System;
using System.Web.Mvc;

namespace Testproject.Attributes
{

    [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
    public class ClosedAttribute : AuthorizeAttribute, IAuthorizationFilter
    {
        public ClosedAttribute()
        {
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.Result = new RedirectResult("~/Home");
        }
    }
}

Um dieses Attribut nur auf Klassen anwendbar zu machen setzt man AttributeTargets.All auf AttributeTargets.Class . Dies funktioniert natürlich auch für Methoden. Momentan ist diese Lösung noch recht unflexibel. Es leitet einfach jede mit dem Attribut [Closed] getaggte Methode/Klasse auf die URL /Home um.

Jetzt möchten wir aber manche Unterseiten schließen und auf andere URLs weiterleiten. Das Attribut bekommt jetzt einen Parameter mit der gewünschten URL zur Weiterleitung wie zum Beispiel [Closed("/Forum")].

Um dies zu realisieren legen wir in der Attributsklasse eine Variable als String an, füllen diese im Konstruktoraufruf und nutzen diese dann im RedirectResult.

using System;
using System.Web.Mvc;

namespace Testproject.Attributes
{

    [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
    public class ClosedAttribute : AuthorizeAttribute, IAuthorizationFilter
    {
        private string redirectURL;

        public ClosedAttribute(string path)
        {
            redirectURL = path;
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.Result = new RedirectResult(redirectURL);
        }
    }
}

Inspiriert durch eine Testanwendung aus den tiefen Weiten des Internets, in der eine ähnliche Attributklasse mit selben Effekt ca 200 Zeilen Code fett war.

Hello World

//warum einfach wenns auch kompliziert geht?
class hello_world()
{
  public function hello_now()
  {
    $yeah = 'hello world';
    echo $yeah;
  }
};
$yes = new hello_world();
$yes->hello_now();