Ping Ring del 4: Boo

Dette er del 4 i artikkelserien Ping Ring hvor jeg implementerer et og samme program i et utall ulike programmeringsspråk – for å se om det er noe å lære gjennom å gjøre det. Introduksjonen kan du lese her.

boo Denne gangen har jeg valgt et språk som kanskje er ukjent for en del utviklere, nemlig Boo. Boo er et objektorientert, statisk typet språk for Common Language Infrastructure (dvs. .NET). Syntaksen som er inspirert av Python er elegant og kompakt. Selv om koden er like statisk typet som C# så utleder Boo det meste av typene for deg, slik at det nesten ser ut som om Boo er dynamisk typet.

Igjen har jeg fulgt samme struktur som tidligere (del 2 og 3), og ettersom det samme rammeverket ligger i bunn her som i C#-varianten så er det ingen forskjeller i hvordan jeg for eksempel gjør sending og mottak med TCP. Den største forskjellen ligger i bruk av tråder: I Boo kan jeg kjøre hvilken som helst metode asynkront (i en ny tråd) ved å kalle BeginInvoke() på metoden (se linje 14 til 16, 35 og 48). Dette er ganske elegant – jeg trenger ikke tenke på asynkronitet når jeg implementerer basislogikken, og kan så velge om jeg vil kjøre parallelt eller ikke når jeg etterpå skal bruke den.

1 import System
2 import System.IO
3 import System.Net
4 import System.Net.Sockets
5 import System.Threading
6
7 class RingServer:
8   [Property(ThisPort)] _thisPort as int
9   [Property(OtherPort)] _otherPort as int
10   [Property(MaxDelay)] _maxDelay = TimeSpan(0, 0, 5) # default
11   _lastPingTime = DateTime.Now
12
13   def Start(sendStartupPing):
14     SendDelayedPing.BeginInvoke() if sendStartupPing
15     WatchForMissingPings.BeginInvoke()
16     ListenForPings.BeginInvoke()
17     Thread.Sleep(20) while true # Wait forever!
18
19   def SendDelayedPing():
20     try:
21       Thread.Sleep(1000)
22       using tcpClient = TcpClient(127.0.0.1, OtherPort):
23         using streamWriter = StreamWriter(tcpClient.GetStream()):
24           streamWriter.Write(PING from ${ThisPort})
25     except ex as Exception:
26       print(*** Failed sending ping: ${ex.Message})
27
28   def WatchForMissingPings():
29     while true:
30       Thread.Sleep(5000)
31       pingDelay = DateTime.Now – _lastPingTime
32       if pingDelay > MaxDelay:
33         print(*** ALERT, RING BROKEN! +
34             No ping in ${pingDelay.TotalSeconds} seconds.)
35         SendDelayedPing.BeginInvoke()
36
37   def ListenForPings():
38     tcpListener = TcpListener(IPAddress.Parse(127.0.0.1), ThisPort)
39     tcpListener.Start()
40     while true:
41       using connection = tcpListener.AcceptTcpClient():
42         using streamReader = StreamReader(connection.GetStream()):
43           ProcessIncomingPing(streamReader.ReadToEnd())
44
45   def ProcessIncomingPing(message):
46     _lastPingTime = DateTime.Now
47     print(Received ${message})
48     SendDelayedPing.BeginInvoke()
49
50 print(** Boo Ring Server (${argv[0]}))
51 srv = RingServer(
52     ThisPort: int.Parse(argv[0]),
53     OtherPort: int.Parse(argv[1]),
54     MaxDelay: TimeSpan(0, 0, int.Parse(argv[2])))
55 srv.Start(bool.Parse(argv[3]))

Hva synes du? For meg er dette ganske mye vakrere enn både C# og Ruby-versjonen, fordi all unødvendig støy er fjernet. Å definere blokker/metoder/klasser ved hjelp av innrykk er noe man må vende seg til, og det er kanskje også en smaksak om man liker det eller ikke. Jeg må si at jeg digger det, og synes det burde være mye mere utbredt.

Boo er generelt sett et veldig spennende språk. Det eneste som er synd er at det ikke er noen fullverdig støtte for språket i Visual Studio. Hadde det vært det hadde jeg byttet hovedspråk på dagen :)

Når det gjelder egnethet i forhold til oppgaven er det derimot ingen spesiell forskjell fra de andre variantene. Bruk av BeginInvoke() er interessant, men ikke nødvendigvis bedre (i dette tilfellet i alle fall). Det var dog på høy tid at jeg fikk vist litt Boo-kode på bloggen.

Jakten på det beste språket fortsetter, så følg med…

Kildekoden fra denne blogposten er tilgjengelig på Github. Der står du fritt til å forgrene løsningen og gjøre egne modifikasjoner om du ønsker det (for å illustrere et poeng eller lignende). Som alt annet på bloggen er koden lisensiert under Creative Commons.

Kategorier: Diverse prosjekter, Polyglot.
RSS feed for kommentarene. Tilbaketråkk.

2 kommentarer til “Ping Ring del 4: Boo”

  1. Morten Says:

    Heisann

    Fulgt bloggen din lenge, bra saker!

    Ad Boo og BeginInvoke, så er vel det strengt tatt likt i C#:
    using System;
    using System.Threading;

    class Program
    {
    static void Main(string[] args)
    {
    Action writeThreadID = () => Console.WriteLine(“Thread ID {0}”, Thread.CurrentThread.ManagedThreadId);
    writeThreadID();
    writeThreadID.BeginInvoke(null, null);
    Console.ReadLine();
    }
    }

  2. Torbjørn Says:

    Takk for kommentar og skryt.., det setter jeg alltid pris på!

    TIl saken: Forskjellen er at man i Boo kan gjøre BeginInvoke direkte på en metode, i stedet for å bruke lambda-uttrykk som du har gjort i eksempelet ditt. Du kan for eksempel ikke skrive følgende i C#:

      public static void WriteThreadID()
      {
        Console.WriteLine("Thread ID {0}", Thread.CurrentThread.ManagedThreadId);
      }
    
      static void Main(string[] args)
      {
        WriteThreadID();
        WriteThreadID.BeginInvoke(); // ikke mulig
      }
    

    Det er ikke en revolusjonerende forskjell akkurat, men sånne små ting som gjør livet bare bittelitt enklere har av og til større betydning enn man skulle tro.

Skriv en kommentar

Tillatte tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Einar W. Høst: Det er jo læringen som gjør det morsomt! Se også http://norvig.com/21-days...

Pagliacci: OBS! tl;wr. Det er vel akuratt det jeg sliter med med min læring innenfor pr...

Torbjørn: La oss anta to ulike definisjoner av Template Method pattern - de to ytterpunkte...

Lars-Petter: Hei igjen. Siden du inviterer til å ta diskusjonen i bloggen, og har tatt deg t...

Torbjørn: Lars-Petter: Det er én måte å se det på. Det er absolutt fortsatt Template M...

Lars-Petter: Hei. Har du ikke i prinsippet her gått over fra Template Method (arv) til Strat...

Christian Abildsø: I alle fall i C#, så føles dette som kode som blir mer fleksibel men vanskelig...

Torbjørn: Hei Henrik, og takk for tilbudet. Ble oppmerksom på Rasberry Pi for under en uk...

Henrik Sandaker Palm: Ang. større hobby prosjekt. Du er som er en slik rakker på programmering har j...

Øivind Nilsen: Slutt å bruke mobilnummeret mitt som eksempel !...

Mulig relaterte linker

 Hold deg oppdatert

Søk i bloggen

Ferske innlegg

  • En historie om programmering
  • Template Method del 4: Multippel arv
  • Template Method Intermesso
  • Template Method del 3: Bare funksjoner
  • Kategorier

  • .net ninja (37)
  • Bøker (17)
  • Diverse prosjekter (35)
  • DSL (10)
  • Erlang (10)
  • F# (5)
  • Hardware (1)
  • Jobb (77)
  • Julekalender (51)
  • kjempekjekt.com (23)
  • LISP/Clojure (33)
  • NNUG / community (60)
  • O/RM & databaser (10)
  • Off topic (116)
  • OO-design/clean code (30)
  • Podcasts (14)
  • Polyglot (77)
  • Ruby (27)
  • Silverlight / RIA (3)
  • Software/verktøy (20)
  • Softwareutvikling (21)
  • Testing / TDD (30)
  • the contiki strip (13)
  • User experience (3)
  • WCF (3)
  • Webutvikling (32)
  • WPF (9)
  • WTF (12)
  • Last ned Wallpaper

    Programmeringsbloggens tøffe skrivebordsbakgrunn med snippets fra ulike språk laster du ned her!

    Abonner via epost

    Om du vil kan du få alle nye blogposter tilsendt til din epost. Abonner nå, det er kjempeenkelt!

    Meta