Barbour Outlet Barbour Outlet Deutschland

Senaste inläggen RSS

Till alla nördar: Bakom kulisserna på Pusha

Av skanaar den 14 March 2009

Just nu pågår ett större underhållsprojekt av Pushas kodbas där målet är att göra koden säkrare och enklare att underhålla. Detta gör vi för att vi har många och stora planer för framtida funktioner som vi vill kunna implementera med ett minimum av besvär och utan säkerhetsproblem.

Vi utvecklare kommer i ett par inlägg försöka sammanfatta vilka tankar och riktlinjer vi jobbar efter.

Typsäkerhet

Pusha är utvecklat i PHP med en SQL-databas som grund. Alltså precis som många andra internetprojekt. Men PHP är en märklig best. Många av de tutorials och introduktionsguider till PHP som man hitter ute på nätet lär ut rent ut sagt katastrofala programmeringstekniker, och språket i sig har många märkliga konstruktioner och designdetaljer (t.ex är variabelnamn case-sensitive samtidigt som funktionsnamn är case-insensitive). Detta är till stor del p.g.a. att PHP har en lång och brokig historia. Men i.o.m. PHP5 finns det många intressanta verktyg för att förstärka säkerhet och läsbarhet. Introduktionen av fullvärdig objektorientering förde också med sig type-hinting vilket vi använder så ofta som möjligt. Det innebär att man ställer krav på att inparametrarna i en funktion ska vara av en viss typ.

   public static function updatePresentation(Username $username,String $presentation)

På detta sätt kan vi i praktiken fånga fel redan i kompileringen istället för vid körning, något som är mycket värdefullt eftersom många funktioner används mycket sällan, och därmed upptäcks betydlig fler programmeringsfel direkt.

Inkapsling

I lite mer klassisk PHP-programmering är i princip allt som skickas runt tal eller text som sen manglas och processas av olika funktioner som bara utgår ifrån att de representerar sidnummer, webbadresser eller brödtext. Extra kritiskt blir det när man ska spara ner till en databas och kan bli utsatt för så kallad SQL-injection. Vårt angreppsätt är att ha specifika klasser för URL:ar, brödtexter, användarnamn etc. Vi kan på detta sätt stoppa otillåtna tecken i användarnamn och felaktiga adresser vid en så tidig tidpunkt som möjligt. Det innebär också att vi kan kapsla in data och funktionalitet. Istället för att ha globala funktioner som flyter omkring och tar emot strängar har vi t.ex. en getDomain-metod inuti URL-klassen som till sin natur inte ens kan försöka extrahera domänen ur en icke-URL sträng, eftersom den bor inuti ett objekt som verifierade att det var en valid URL redan vid instansieringen.

   class Url{
      protected $value;
      ...
      function getDomain(){
         $parsedurl = parse_url($this->value);
         $domain = $parsedurl['host'];
         if (substr($domain,0,4)=="www."){
            $domain = substr($domain,4);
         }
         return $domain;
      }
      ...
   }

Separation av lager

För att koden ska bli så modulär och enkel att underhålla som möjligt vill man separera databasen, logiken och gränssnittet. Vi har förlagt all SQL-kod till en egen klass som implementerar ett generellt DataLayer-interface. Detta innebär att vi kan byta ut databastypen utan att förändra koden. Det nya databasobjektet behöver bara implementera DataLayer-interfacet och ser därmed precis likadant ut utifrån, trots att den faktiska implementationskoden är förändrad.

På samma sätt har vi en Context-klass som kapslar in all inläsning av sessionsvariabler. Detta medför att gränssnittskoden är helt frikopplad från övriga moduler. Till exempel ber Pushas förstasida Contexten om att få reda på vilken sida man befinner sig på. Sen ber den den abstrakta DataLayer-klassen om att få alla länkar. Sen ber den en LinkRenderer att rendera samtliga länkar.

    $renderer = PageContext::getLinkRenderer();
    $links = DataLayer::getLinks();
    foreach($links as $link){
        $renderer->render($link);
    }

Det sista är ett exempel på Tell Don’t Ask principen som innebär att man inte ska hämta ut en massa data från objekt utan be bättre anpassade klasser göra saker med sig själva och andra objekt. I detta fallet är det (till exempel) Pusha-sidan som inte ska hämta ut (Ask) användarens inloggad-status och sen avgöra om länkens Pushningsknapp ska vara klickbar eller inte. Istället ska den be Contexten (som är ensamt ansvarig för att känna till användarens status) om en LinkRenderer som levereras färdigt anpassad för att rita ut länkar på rätt sätt. In i denna LinkRenderer skickar man (Tell) in alla länkar som ska ritas ut och sen är det klart.

Hoppas någon tyckte detta var intressant och/eller lärorikt. Kommentarer, frågor eller förslag på förbättringar är varmt välkomna. Nästa vecka berättar vi om deploy-processen som är under utveckling just nu kommer att fungera.

14 Mar

Information

Om Pusha Blogg

Information om utvecklingen av sajten Pusha, en samlingsplats där du som medlem bestämmer innehållet genom att posta och rösta på länkar.

Hett på Pusha

Fler heta länkar

Knapp för bloggare

Pusha f�r bloggare

Visste du att du kan få fler besökare till din blogg med en Pusha-knapp?

Läs mer här »