Kultainen koodi

.NET-osaajan ajatuksia paremmasta koodailusta

Archive for the category “kieli ja rajapinnat”

SOLID-periatteet

OLYMPUS DIGITAL CAMERAOhjelmiston suunnittelemiseen löytyy useita arkkitehtuuriperiaatteita. Esittelen tässä lyhyesti SOLID-periaatteet. Ne vastaavat olio-ohjelmoinnin haasteisiin.

Ohjelmointiperiaatteet tulevat ajankohtaisiksi, kun samaan sovellukseen kirjoittaa vähän enemmän koodia tai koodia kirjoittaa useampi henkilö. Ymmärrettävyyden ja perusvirheiden välttämiseksi apuun kiiruhtavat arkkitehtuuriperiaatteet. Sehän on hassu sanahirviö.

SOLID-periaatteet tulevat usein vastaan luokkia kirjoittaessa. Avaan lyhyesti nuo viisi periaatetta. Wikipediasta voi lukea ensihätään kattavamman selostuksen ja sieltä löytyvät alkuperäiset lähteet, jos haluat uppoutua syvemmälle.

  • S, Single responsibility principle, muistuttaa yhden luokan vastaavan vain yhdestä asiasta. Esimerkiksi yksi luokka vastaa tiedon järjestämisestä oikeaan järjestykseen. Jos siihen livahtaa toinen vastuu, kuten erilaisen tiedon vertailu tai tiedon lähettäminen rajapinnan läpi, niin jokaista vastuualuetta varten kirjoitetaan erillinen luokka.
  • O, Open/closed principle, avoimen / suljetun luokan periaate. Luokan pitää olla avoin toimintojen ja ominaisuuksien laajentamiselle. Riippuen periaatteen tulkitsemisesta, periaate on aikanaan tarkoittanut abstrakin perusluokan perimistä toteuttavalle luokalle. Peritty luokka voi aina lisätä metodeja ja propertyjä ja siten olla vanhempana toimiva luokka on avoin laajentamiselle. Toisaalta vanhempana toimiva luokka on suljettu, koska sitä ei voi muuttaa.Myöhemmin samaa periaate haluttiin rajata toimimaan rajapintojen, eikä perinnän kautta. Hyvin määritellyt rajapinnat ovat suljettuja, mutta luokan toimintaa voi laajentaa uusilla toiminnoilla tai lisäämällä siihen toisen rajapinnan.
  • L, Liskov substitution principle (LSP), Liskovin korvattavuuden periaate määrittelee, että samaa alatyyppiä olevat oliot voivat korvata toisensa toteuttavassa koodissa. Perintähierarkiaa ajatellen tämä on nykyään itsestään selvää. Jos tytöt ja pojat ovat molemmat lapsia, niin lapsi-olioita sisältävät lista voi sisältää kumman molemman tyyppisiä olioita. Siis poika-olion voi korvata tyttö-oliolla, kun halutaan käyttää oliota lapsi-luokan kautta.
  • I, Interface segregation principle, rajapintojen hajoittamisperiaate kertoo, että yhden yleisen rajapinnan sijaan kannattaa luoda useita hyvin määriteltyjä rajapintoja. Näin ollen luokka tulee sisältämään vain metodeja, joita se käyttää, kun se voi toteuttaa hyvin määritellyn rajapinnan. Yleiset rajapinnat sisältävät turhia metodeja.
  • D, Dependency inversion principle, riippuvuuden kääntämisen periaate kutkuttelee olioiden perimistä. Vanhempana toimivan luokan ei pitäisi riippua lapsiluokkien toteutuksesta, vaan rajapinnoista. Abstraktioiden ei pitäisi riippua yksityiskohdista. Yksityiskohtien pitäisi riippua abstraktioista.Käytännössä suoran perimisen sijaan luokka sisältää propertyjä, joiden tyyppi on rajapinta. Esimerkiksi lapset-lista on kokoelma olioista, jotka toteuttavat ILapsi-rajapinnan. Tyttö ja Poika -oliot eivät peri suoraan lapsi-luokkaa, vaan ne toteuttavat ILapsi-rajapinnan.

Ihania periaatteita.

Miksi? Luettavan, ylläpidettävän ja testattavan koodin kirjoittamiseksi. Koodi on luettavampaa, kun koodin rakenne tulee samojen periaatteiden kautta. Ylläpidettävyys helpottuu, kun luokkien keskenäinen riippuvuus vähenee. Rajapinnat taas auttavat testattavan koodin kirjoittamista.

Riippumatta siitä, haluatko kirjoittaa testejä tai et, niin SOLID helpottaa kehittäjän elämää. Ennen kaikkea muiden kehittäjien elämää. Koodi kirjoitetaan muita kehittäjiä varten, kääntäjä osaa pyöräyttää siitä ohjelman koodin ulkoasusta riippumatta.

Mainokset

Keskitä vertikaalisesti kolmella koodirivillä

Työkaveri vihjasi törkeän mainion sivun, jossa kerrotaan miten UI-elementin voi keskittää vertikaalisesti kolmella koodirivillä. Taikasana on CSS.

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

Saman voi kirjoittaa myös mixininä.

/* Mixin */
@mixin vertical-align($position: relative) {
  position: $position;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}

.element p {
  @include vertical-align();
}

Elementti voi sijoittua pikseleiden väliin, jolloin elementin reunat voivat näyttää sumuisilta tai pehmeiltä. Määrittelemällä keskittämisen parin lisämääreen avulla ongelma ratkeaa.

.parent-element {
  -webkit-transform-style: preserve-3d;
  -moz-transform-style: preserve-3d;
  transform-style: preserve-3d;
}

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

Korjauksen voi tehdä myös perspectiven avulla (ratkaisua ehdotti alkuperäisessä postissa roydukkey):

.element {
  position: relative;
  top: 50%;
  transform: perspective(1px) translateY(-50%);
}

Nauti keskittämisestä!

Code Wars, mahdollisuus oppia

Tutustuin codewarsiin työkaverini suosituksesta yhtenä syksyisenä päivänä. Hän löysi koodiharjoitussivuston, jossa editoria ja testejä voi ajaa selaimen kautta. Toisin kuin exersim.io tai vastaavissa palveluissa, codewarsilla harjoitteleminen onnistuu ilman kehitysympäristöä.

Harjoitusten tekeminen codewarsissa käy helposti. Harjoitusta kutsutaan nimellä kata.

codewars_kata

Kata eli harjoitus codewars.com:ssa.

 

Harjoituksen tehtävänanto selviää ruudun vasemmalta puolelta. Koodi kirjoitetaan oikeassa yläkulmassa näkyvään koodinäkymään. Kirjoitettu koodi ajetaan ”paikallisia” testejä vastaan Run Examples -painikkeella. Ne löytyvät Example Tests -otsikon alta. Näitä testejä voi myös muokata omien mieltymysten mukaan.

Lopullinen testi ratkaisulle tehdään ajamalla koodi Attempt-painikkeella. Ratkaisun toimivuus testataan yksikkötesteillä, joita ei näytetä käyttäjälle. Vain testien tulos näytetään. Toisinaan testien nimestä voi päätellä mikä testi epäonnistui. Järjestelmä sallii myös satunnaistettujen testien ajamisen, jolloin tehtävän luojan ei tarvitse kirjoittaa kaikkia testitapauksia käsin.

Ratkaistuasi tehtävän, saat vaikeusasteen mukaan tietyn määrän pisteitä. Helpoimmat testit saa ratkaistua muutamassa minuutissa, vaikeampien ratkaiseminen kestää tunteja.

Ratkaistuasi tehtävän, näet muiden vastaukset ja näistä oppii. Vastauksista voi merkata omasta mielestä parhaan ja nokkelan vastauksen. Vastauksista näkee kuinka paljon ohjelmoijien ongelmanratkaisukyky ja API-tuntemus vaihtelee.

codewars_stats

Stats-sivu kertoo mistä olet saanut pisteitä.

 

Olen kerännyt suurimman osan pisteistäni tekemällä harjoituksia. Pisteiden hankkimiseen käytetyt kielet näkyvät oikeasta laidasta ja prosenttiosuus kertoo kuinka paljon pisteitä on kerätty ennen seuraavaa tasoa.

Pisteet päivittyvät muutaman tunnin välein, kun palvelin ajaa ajastetusti pisteiden päivistyskriptit. Itsekin ihmettelin aluksi miksi pisteet päivittyvät viiveellä.

Jos teet vain harjoituksia, pisteillä ei ole merkitystä. Halutessasi voit kirjoittaa harjoituksia muiden ratkaistavaksi tai kääntää niitä kieleltä toiselle. Tällöin korkeampi pistemäärä sallii kevyemmän validointiprosessin ennen kuin kirjoittamasi harjoitus julkaistaan.

Yhteisöllisyyttä yritetään lisätä klaanien avulla. Käyttäjän tiedoissa voi antaa itselleen klaanin. Se on vain merkkijono. Kaikki jotka kirjoittavat saman merkkijonon, tulevat samaan klaaniin.

codewars_klaanit

Klaanit

 

Klaanijärjestelmä ei ehkä ole täydellinen, koska vaihdettuani klaanin, näen edelleen kaikki vanhan klaanini jäsenet.

Codewars on ehdottomasti paras palvelu ohjelmointiharjoitusten tekemiseen. Sen avulla voi ylläpitää kielen osaamista tai opetella uutta kieltä. Toki harjoitusten avulla oppii erityisesti kielen käyttöä, ei niihin liittyvien frameworkkien käyttöä.

Suosittelen kokeilemaan codewarsia, sen avulla voit löytää palon vanhaan rakkaaseen kieleen tai kehittää osaamistasi nykyisen kielen kanssa.

 

 

 

Clojuren opiskeluun vaihtoehtoja

Clojuren ja ClojureScriptin opiskeluun löytyy useita työkaluja, jotka toimivat hyvin. Alkuun voi ottaa maistiaiset kokeilemalla jotain selaimessa pyörivää REPLiä. Sen avulla voi suorittaa suoraan clojurekoodia.

Koodaajan iloksi clojurelle löytyy useita eri kehitysympäristöjä:

Counterclockwise on ilmainen Eclipsen päälle tehty ympäristö.

JetBrains kehitti IntelliJ:n päälle kokonaan oman tuotteen clojurelle. Sen nimi on Cursive. Se näkyi ClojuTRE:n demoissa suosituimpana työkaluna.

Emacsiin saa clojuren pyörimään mainiosti. Käytän sitä itse töissä, koska kokeneemmat kehittäjät osaavat näyttää sillä miten hommat tehdään.

Visual Studioon löytyy vsClojure-lisäosa, jolla pääsee vauhtiin.

Jos haluat opiskella clojurea, voit joko lukea siitä kirjasta, suosittelen Clojure for the brave and true -opusta. Se on kirjoitettu kieli poskessa ja se sisältää hyviä linkkejä lisäopiskelua varten. Aloitin itse sitä kautta.2016-07-19-11-57-22

Ehkä matalin kynnys tulee kuitenkin pyöräyttämällä läpi yksinkertainen hands-on harjoite. Sellainen löytyy try clojuresta. Sen päristely kestää vain 5 minuuttia. Suosittelen lämpimästi. Siinä kerrotaan suoraan mitä pitää kirjoittaa, joten se onnistuu helposti. Toisaalta siinä ei sukelleta kovinkaan syvälle clojuren mahdollisuuksiin.

Omaa osaamista voi vahvistaa ratkomalla koodisokeriongelmia 4Clojuren sivuilla. Kannattaa luoda käyttäjätunnus, niin edistyminen tallentuu. Ratkaisujen löytäminen vaatii rajapintojen tuntemista, tuskastuttavaa ja lopulta palkitsevaa. Apuna voi tietenkin käyttää Cheatsheet-sivua tai vaikka lueskella aiemmin mainittua kirjaa. Hyviä esimerkkejä löytyy myös clojuredocsista, siellä on rajapinnan lisäksi näppäriä esimerkkejä. Stackoverflowsta ei vielä löydy vastauksia, joten kannattaa panetua muuhun materiaaliin.

Exercism.io & clojure on suosikkini itseopiskelua varten. Se tosin vaatii oman koneen ja ympäristön, jossa ratkaista tehtäviä. Exercism antaa kuitenkin vapaat kädet ongelmien ratkaisuun. Ongelman voi ratkaista kauniilla koodilla tai kirjoittamalla apufunktioita ja karmean pitkän hässäkän, kuten itse teen ensimmäisellä iteraatiolla. Löydettyäni ratkaisun yritän jalostaa mörkömöhkäleestäni kaunista koodia.

Valitse oma polkusi clojureen! Opiskele niin paljon kuin on tarpeen tai syöksy kielen syvyyksiin oivaltamaan. Nauti.

ClojuTRE 2016 aloittelijan silmin

Kävin kuuntelemassa upeita luentoja ClojuTRE:ssa, siellä kerrottiin uusimmista tuulista ja erilaisista kielen sovelluksista.

Huomasin hypänneeni clojuren kelkkaan juuri oikeaan aikaan, koska kielen debuggaukseen, ajonopeuteen ym. liittyvät ongelmat on selätetty aivan hiljattain.

Palataan alkuun.

ClojuTRE tarjosi tietoa kolmella rintamalla: clojuren yhteys muihin kieliin ja clojuren historia, erilaisia sovelluksia miten clojurea voi käyttää oikeissa projekteissa ja kielen kehittymiseen liittyvät projektit tai laajennukset.

Tietämykseni laajeni kerralla aivan uusiin sfääreihin seurattuani esityksiä.

Klipse tarjoaa REPL:n eli reaaliaikaisen ohjelmointiympäristön mille tahansa web-sivulle, joka voi pyörittää komponentteja tai JavaScriptiä. Sen avulla uuden kielen oppiminen muuttuu paljon helpommaksi, kun opiskelijan ei tarvitse erikseen pystyttää kehitysympäristöä. Ideoita voi kokeilla heti.

Native mobile apps ja clojure of things järisyttivät maailmaani. Siis näin voi tehdä alustariippumattomia sovelluksia clojurella tai ohjata IoT-laitetta (RaspberryPi). Aivan fantastista kamaa. Juuri tämän kaltaiset esimerkit elävästä elämästä saavat uskomaan tämän kielen mahdollisuuksiin. Huimaa.

The Story of Owl Lisp avasi lispien maailmaa tavalla, jota en uskonut mahdolliseksi. Kaiken lisäksi Aki Helin sai yleisön nauramaan upealla esityksellään. Kaiken takana on yksinkertainen lambda-matematiikka eli funktiot. Yksinkertaisuudessaan ja yksinkertaisuudesta kasvaessaan monimutkaisuudessaan kaunista.

ClojureScriptin viisi viimeisintä vuotta ja viisi seuraavaa puuhkäisivät pöydän puhtaaksi. David Nolen tiivisti erinomaisesti, yhteistö sai tämän kaiken aikaan. Liity yhteisöön ja anna vähän. Nappaa helppoja juttuja, joilla parannetaan clojure (scriptiä). Oikein voimaannuttava puhe mieheltä, joka on auttanut clojurescriptin syntymisessä. Hän rakastaa LISPiä.

Päähäni jäi paljon innostusta. Sain suuren määrän tietoa, josta osaa pystyn käyttämään edukseni paremmin kuin toista. Löysin paikkoja, joista voi aloittaa, kun tahtoo saada asioita tapahtumaan. Siemeniä, alkuja minulle. Muille projekteja, jotka luovat uskoa clojureen.

C#-kielen kehitys

Pidän rajapinnoista ja tehokkaasta ohjelmoinnista. Ensimmäinen pysäyttävä kokemukseni syntyi siirtymä C# 2.0 ja 3.0:n välillä, kun pääsi kirjoittamaan autoproperty-tyyppisiä get ja set metodeja. Näitä tuttuja:

public int Foo { get; set; }

C# 6 tarjoaa vihdoin pelkän getterin sisältämät propertyt.

public class Point
{
public int X { get; }
public int Y { get; }

public int ReadWrite { get; set; }
}

C# 5 tarjosi async ja await -toimintoja, jotka olivat Taskin kanssa tuttuja C# 4:n puolelta.

Evoluutio 5-versioon asti löytyy evoluutiomatriisista.

C# 6 näyttää olevan muutoinkin ohjelmoijan kannalta se kieliversio, joka vähentää koodin kirjoittamista. Olen aivan täpinöissäni, koska lyhyen parametrisoidun stringin voi luoda luettavammassa muodossa. Vanha toteutus

return String.Format("({0}, {1})", X, Y);

muuttuu muotoon

return "(\{X}, \{Y})";

Kuutosen mukana näyttää tulevan paljon muitakin herkkuja matkaan. Lambda-lauseella saa tehtyä uusia laajennuksia uudella =>-nuolioperaattorilla. Jalka väpättää innostuksesta uutta kieliversiota käyttäviä projekteja odotellessa.

Vielä C# 6 ei asennu automaattisesti vielä Visual Studio 2013 mukana, mutta ehkä tulevaisuudessa sen saa päivitettyä yhdeksi mahdolliseksi kieliversioksi. Tähän mennessä VS ja eri kieliversiot ovat pyörähtäneet aika mukavasti käyntiin. Varsinkin kun VS2012 mukana voi kehittää useammalla eri versiolla eli kieliversio ei ole naimisissa IDE-version kanssa.

Post Navigation