# timOhjeet

TIMin ohjelmointikielet ja olennaisimmat kirjastot

Sisältö

  • Python
    • versio 3, ei 2!
    • muuttujat
    • funktiot
    • perustietotyypit ja -rakenteet
    • kontrollirakenteet
    • luokat ja metodit
    • moduulit
    • tyypittäminen
    • Flask-kirjasto
  • TypeScript
    • muuttujat
    • funktiot
    • perustietotyypit
    • rajapinnat
    • kontrollirakenteet
    • luokat ja metodit
    • moduulit
    • Angular ja AngularJS

1. Python

1.1 Yleistä

  • TIMissä käytössä Python 3 (tarkemmin 3.8)
  • Python 2 vanha ja epäyhteensopiva Python 3:n kanssa
  • Jos luet Python-dokumentaatiota, varmista, että valittuna on versio 3.8

1.2 Muuttujat

luku = 6
jono = 'terve!'
jono2 = "heippa"
luku = 3
print(luku)  # tulostaa 3

1.3 Funktiot

def plussaa(a, b=4):
    return a + b

print(plussaa(1, 2))  # tulostaa 3
print(plussaa(1))     # tulostaa 5
print(plussaa(a=1, b=2))  # tulostaa 3

1.4 Perustietotyypit ja -rakenteet

luku = 6             # int   - kokonaisluku
liuku = 6.2          # float - liukuluku
jono = 'terve!'      # str   - merkkijono
jono2 = "heippa"     # str   - merkkijono
jono2 = """heippa""" # str   - merkkijono
eimitaan = None      # None  - tyhjä / "null"

numerot = {'yksi': 1, 'kaksi': 2}  # dict - sanakirja
print(numerot['yksi'])             # tulostaa 1
print(numerot.get('kaksi'))        # tulostaa 2
print(numerot.get('kolme'))        # tulostaa None
print(numerot['kolme'])            # heittää poikkeuksen KeyError
joukko = {2, 3, 5, 7, 11}          # set - joukko
print(2 in joukko)                 # tulostaa True
print(4 in joukko)                 # tulostaa False

tiedot = (12, 'kissa', joukko)  # tuple
print(tiedot[0])                # tulostaa 12
eka, toka, kolmas = tiedot
print(toka)                     # tulostaa kissa

lista = ['yksi', 'kaksi', 'kolme']  # list
print(lista[2])                     # tulostaa kolme
lista.append('neljä')
print(len(lista))                   # tulostaa 4
lista[1] = 'kaa'
print(lista[1])                     # tulostaa kaa

1.5 Kontrollirakenteet

if luku > 5:
    print(f'luku on > 5 ja se on {luku}')
elif luku > 3:
    print(f'luku on > 3 mutta <= 5')

if lista:  # huom. ei tarvitse: "if len(lista) > 0:"
    print('lista on epätyhjä')
else:
    print('lista on tyhjä')
for luku in lista:
    print(luku)

for i, luku in enumerate(lista)
    print(f'paikassa {i} on luku {luku}')
while 3 < luku < 10:
    luku += 1
    if luku == 8:
        break
try:
    x = numerot['kolme']
except KeyError:
    x = 0

1.6 Luokat ja metodit

class Document:
    def __init__(self, name, content):
        self.name = name
        self.content = content
    
    def get_name(self):
        return self.name
        
d = Document(name='test', content='hello')

Perintä:

class ColorDocument(Document):
    def __init__(self, name, content, color):
        super().__init__(self, name, content)
        self.color = color

1.7 Moduulit

  • .py-päätteinen tiedosto = moduuli
  • voi sisältää funktioita, muuttujia, luokkia yms., joita voi importata toisiin moduuleihin
# tiedosto document.py
class Document:
    ...
# tiedosto colordocument.py
from document import Document
class ColorDocument(Document):
    ...

1.8 Tyypittäminen

  • sitä hyödyllisempää, mitä isompi projekti
    • kehitysympäristö havaitsee tyyppivirheet
    • dokumentointi
  • tyypitys vähintään parametreihin ja paluuarvoihin, joskus lokaaliin muuttujiin
luku: int = 6
def plussaa(a: int, b: int = 4) -> int:
    return a + b
class Document:
    def __init__(self, name: str, content: str):
        self.name = name
        self.content = content
    
    def get_name(self) -> str:
        return self.name

1.9 Flask-kirjasto

1.10 attrs-kirjasto

  • vähentää luokkien "boilerplatea", esim. muodostajaa ei tarvitse itse kirjoittaa

2. TypeScript

  • TypeScript = moderni JavaScript + tyypit

2.1 Muuttujat

  • lokaalit muuttujat esitellään joko let tai const
  • esittelyssä var vanhentunut tapa ja ei suositeltu
  • käytä const aina kun mahdollista
let luku: number = 6; // tyypiksi ilmoitetaan number, mutta tarpeeton tässä tapauksessa
let jono = "terve"; // tyypiksi päätellään string
jono = 3; // virhe: numeroa ei voi sijoittaa merkkijonotyyppiin
luku = 3;
const vakio = {yksi: 1, kaksi: 2};
vakio = {}; // virhe: vakio on const; ei saa sijoittaa uudelleen
var x = 0; // sallittu, mutta ei suositeltu

2.2 Funktiot

function plussaa(a: number, b: number = 4): number {
    return a + b;
}
  • paluutyyppi useimmiten päätellään, eli esittelyriviltä : number voisi jättää pois

2.3 Perustietotyypit

const a = false; // boolean
const luku = 5; // number
const c = 5.6; // number
const d = "moi"; // string
const e = {id: 1, name: "joku"}; // object, mutta TypeScriptissä {id: number, name: string}
e.x = 4; // virhe: objektissa 'e' ei ole ominaisuutta 'x'
const f = null; // null
const g = undefined; // undefined

const lista = [1, 2, 3]; // Array, TypeScriptissä number[]
const uusi = {...e, color: "red"}; // {id: number, name: string, color: string}

Huom: JavaScriptissä (ja siten TypeScriptissä) ei ole erikseen kokonaisluku- ja liukulukutyyppejä, vaan vain number.

2.4 Rajapinnat

  • voivat sisältää sekä dataa (number, string, ...) että metodeja
  • tapana aloittaa nimet I-kirjaimella
interface IDocument {
    name: string;
    content: string;
    getName: () => string; // tai: getName(): string;
}

2.5 Tyypeistä tarkemmin

  • TypeScriptissä on rakenteellinen tyypitys: oliomuuttujat x ja y ovat yhteensopivia, jos niillä on samannimiset ja samantyyppiset ominaisuudet (likimain sanottuna)

2.6 Kontrollirakenteet

if (luku > 5) {
    console.log(`luku on > 5 ja se on ${luku}`); // huom. template string
} else if (luku > 3) {
    console.log("luku on > 3 mutta <= 5");
} else {
    console.log("luku on <= 3");
}

for (const luku of lista) {
    console.log(luku);
}

while (3 < luku && luku < 10) {
    luku++;
    if (luku == 8) {
        break;
    }
}

2.6.1 Async/await

  • hyvin hyödyllinen esim. haettaessa palvelimelta dataa
  • await "odottaa" jonkin operaation valmistumista (usein esim. HTTP-pyyntö) ennen kuin suoritusta jatketaan seuraavalta riviltä
  • awaitin käyttö vaatii async-määreen
async function fetchUser(id: number) {
    const response = await $http.get<IUser>(`/users/${id}`);
    return response.data;
}

2.7 Luokat ja metodit

class Document {
    private name: string;

    // 2 tapaa esitellä attribuutti
    constructor(name: string, private content: string) {
        this.name = name;
    }

    public getName(): string {
        return this.name;
    }
}

Perintä:

class ColorDocument extends Document {
    private color: string;

    constructor(name: string, content: string, color: string) {
        super(name, content);
        this.color = color;
    }
}

2.8 Moduulit

  • moduuli on .ts-päätteinen tiedosto, jossa on vähintään yksi export tai import
  • voi sisältää funktioita, muuttujia, luokkia yms., joita voi importata toisiin moduuleihin, kunhan ne on exportattu
// tiedosto document.ts
export class Document {
    // ...
}
// tiedosto colordocument.ts
import {Document} from "./document";

class ColorDocument extends Document {
    // ...
}

2.9 Strict mode -huomioita

TypeScriptissä on päällä strict mode: tyyppien arvoalueisiin ei kuulu automaattisesti null eikä undefined.

let a = "hei";
a = null; // virhe
a = undefined; // virhe
let b: string | undefined = "hei";
b = undefined; // ok
b = null; // virhe

2.10 Angular ja AngularJS

  • Angular ja AngularJS ovat eri kirjastoja. AngularJS näistä vanhempi, "legacy"
  • TIMissä käytössä on sekä Angular että AngularJS. Uudet komponentit kirjoitettava Angularilla.

AngularJS-huomioita:

  • laajentaa HTML:n syntaksia
  • oleellisin käsite: komponentti (component)
    • bindings: komponentin "parametrit"
    • template/templateUrl: komponentin ulkoasu/HTML
    • controller: komponentin ohjain
    • require: komponentin mahdollisesti tarvitsemat isäntäkomponentit
  • esimerkki: timCopyFolder
  • Koska TIM käyttää TypeScriptiä, monet netistä löytyvät AngularJS-vinkit eivät ole kopioitavissa suoraan, vaan ne täytyy muuntaa TypeScriptiksi. Erityisesti vanhassa netissä esiintyvässä koodissa $scopea käytetään paljon.

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.