Skip to content

Konvensjoner og workflow i OW4

Tri Nguyen edited this page May 3, 2015 · 12 revisions

Browserstøtte i OW4

Kode som skrives til ow4 skal støtte IE9 eller høyere, samt versjoner av andre nettlesere med tilsvarende støtte.

Kodekonvensjoner

Vi ønsker å ha en ren kodebase som skal være mest mulig lik over hele fjøla. Derfor er det viktig at alle følger de samme konvensjonene når vi skriver kode.

JavaScript

JavaScript-koden i ow4 skal kjøres i strict mode, og skrives med tilstrekkelig bruk av JSLint/JSHint. Dette vil dog forhindre bruk av nyere syntaks, men vil bevare en definert struktur gjennom alle JavaScript-filene våre. Dette gjøres ved å definere 'use strict'; i toppen av alle JavaScript-filer.

  • semikonol skal forekomme etter alle statements
  • et innrykk skal bestå av 4 mellomrom

Funksjoner

Alle funksjoner skal være deklarert før de benyttes. Det skal alltid være et mellomrom mellom nøkkelordet function parentesen:

function () { ... }

I navngitte funksjoner skal parentesene følge etter funksjonsnavnet, uten mellomrom:

function MinFunksjon() { ... }

Alle funksjoner skal defineres som et uttrykk:

var funksjonsnavn = function () {
    // ... 
};

Ikke denne måten

function funksjonsnavn() {
    // ...
}

Variabler

Alle variabler skal starte med liten forbokstav. Vi benytter oss av camelCase i variabelnavn. Alle variabler skal defineres med nøkkelordet var for å unngå at alt går ut på global scope:

var minVariabel = '...';

"Klassenavn"

Klassenavn skal alltid starte med stor forbokstav. Vi benytter oss av CamelCase i klassenavn når vi skal sette sammen flere ord. Klassefunksjonen skal også være definert med navn:

var MinKlasse = function MinKlasse() {
    // ...
};

Funksjonsnavn

Funksjonsnavn skal alltid starte med liten forbokstav. Vi benytter oss av camelCase i funksjonsnavn når vi skal sette sammen flere ord.

JavaScript-klasser

Konstruktøren skal se slik ut

var MinKlasse = function MinKlasse() {
    // ...
};

Objektmetoder defineres på funksjonens prototype:

MinKlasse.prototype.minFunksjon = function () {
    // ...
};

Statiske metoder defineres direkte på klassen:

MinKlasse.minStatiskeFunksjon = function () {
    // ...
};

Eksempel på en JavaScript-fil (Utils.js)

var Utils = function Utils() {
    // Alltid ha med definisjonen selv om den er tom
}

Utils.makeApiRequest = function (request) {
    $.ajax({
        url: request.url,
        error: function (error) {
            request.callback(error);
        },
        success: function (data) {
            request.callback(null, data);
        }
    });
};

Benyttes på denne måten:

Utils.makeApiRequest({ ... });

Eksempel på en JavaScript-fil med objektmetoder (ArticleWidget)

var ArticleWidget = function ArticleWidget() {
    var self = this;

    Utils.makeApiRequest({
        url: '',
        callback: function (err, data) {
            self.render(err, data);
        }
    });
};

ArticleWidget.prototype.render = function (err, data) {
    if (err) {
        // håndter feil
        return;
    }

    // behandle data
}

Benyttes på denne måten:

new ArticleWidget();

Hold JavaScript-filene rene. Unngå å benytte unødvendig mange closures. Slik koden er strukturert per i dag er det best at hver klasse blir eksponert per klasse. Lokale funksjoner vil uansett være lokale til disse klassene.

Alle JavaScript-filer skal inkluderes i bunn av HTML-dokumentene (med mindre annen funksjonalitet er tiltenkt). Derfor trenger vi heller ikke benytte oss av jQuerys ready-funksjon.


CSS / LESS

OW4 benytter seg av LESS for å gjøre stilskrivingen mer oversiktlig for utvikleren. LESS introdueserer mange nyttige måter for å strukturere koden på, men da også en del fallgruver.

Nøsting av klasser/regler

Vi ønsker å unngå så mye nøsting som mulig. La nøstingen være et minimum. Vi vil ikke overdrive klassebruk, men ei ønsker vi å overdrive nøsting.

  • la 3 nivåer være en pekepin for maksimum antall nøstede regler
  • bruk beskrivende klasser fremfor nøsting
  • prefix klasser med kontekst for å unngå kræsj

Vi vil derfor ikke skrive noe slikt:

#article {
  header {
    .author {
      .name { ... }
      .mail { ... }
      .img {
        .description { ... }
      }
    }
  }
}

Dette er oversiktlig for deg som skriver kode, men vil være døden for større nettsider (da med høy trafikk og mye krevende innhold). Legg her merke til at nivå 5 vil tolkes i CSS-koden som:

#article header .author .img .description {
  ...
}

Som da vil si at den prosesseres 5 ganger før de tiltenkte elementene er valgt. Nå vil ikke ow4 generere særlig mye trafikk, og innholdet vil ikke være krevende for en nettleser. Men good practice er alltid en fin ting.

Skriv heller:

.author-img-description {
  ...
}

ev. prefix den med:

.article-author-img-description {

}

En annen ting ved dette er at det vil være mer forståelig for en bruker å se hva et element skal være når den inspiseres i nettleseren. Si du har et blått felt i transaksjonen din i nettbanken. Du ønsker å se hva den gjør. Utvikleren har skrevet koden slik:

ul#transactions {
  li {
    &.blue {
      color: blue;
    }
  }
}

Når elementet inspiseres vil du få opp

li.blue { color: blue; }

og du må gå bakover i treet for å finne ut at det er:

ul#transactions li.blue { color: blue; }

Men du blir egentlig ikke noe klokere. Hva om den ble skrevet som dette:

.not-paid {
  color: blue;
}

Når den inspiseres så ser du med en gang hva den fargen gjør. Selv om en bruker aldri skal komme dit at han/hun må inspisere kode for å finne ut hva nettsiden prøver å si, så vil du som utvikler havne i samme knipe når du senere blar opp koden og lurer på "hva søren var det den fargen skulle indikere?".

Samtidig. Aldri benytt tomme nøster (her er #gruppe helt tom):

#gruppe {
  .regel {
    font-size: 12px;
  }
}

.lag-da-heller-en-beskrivende-klasse {...}

Samt, ID-er trengs ALDRI å nøstes:

.klasse1 {
  #id1 {
    font-size: 14px;
  }
}

Pull requests

Vi skal slutte med å merge kode inn i onlinewebben selv. Målet er å bruke pull requests på Github til å gjøre dette.

Pull requests fungerer slik at andre i dotkom kan se gjennom koden du har skrevet før den havner i repoet med alt annet arbeid vi gjør. Dette lar oss fået bedre overblikk over hva slags kode som flyter gjennom git, og eventuelt rette opp f.eks. feil eller mangler i dokumentasjon før endringene merges.

Mer info om pull requests kan finnes på github sine hjelpesider for collaboration: https://help.github.com/categories/63/articles

Språk i koden

Vi koder for et stort sett norskt publikum, derfor gir det mest mening at vi holder verbositeten til norsk.

Eksempel: location = models.CharField("beliggenhet", ... )

I tillegg ønsker vi å tilby oversettelse av alt vi uttrykker på norsk gjennom kode i webben. Dette gjøres med en translate funksjon som fins i django.

Vi bruker ugettext for dette: from django.utils.translation import ugettext_lazy as _

Det blir dermed seende slik ut: location = models.CharField(_("beliggenhet"), ... )

Mer om translation i django kan man finne i dokumentasjonen. En link om lazy: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#lazy-translations

Lenker til innhold på forsiden

Forsidden er bygget opp av flere forskjellige seksjoner. Disse seksjonene inneholder deretter underseksjoner. En enkel måte for å skulle mellom seksjonene, og innholdet,samt permlinke til spesifikt innhold bygger vi opp lenkene innad i forsiden slik:

/#seksjon/subseksjon

Eks. lenke til dotKom under about/om Online: /#about/dotkom

på denne måten kan vi enkelt hente seksjon, og underseksjon, samt lenke direkte til innholdet.

Alle modeller skal ha en permalink

Når vi skal hente url til en modell, så skal vi ikke bruke {% url name_of_view kwargs %}, men <a href="{{ object.get_absolute_url }}"></a>

Basically involverer dette at modellene selv vet hvordan de skal lenkes til, og reversing av url forgår i modellen.

Dette er mer utfyllende forklart her; https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs#the-permalink-decorator