:: Topo :: doCoding :: Linguagens de Programação :: Scala ::

Scala for Java Refugees

Objectivo

Esta WikiPage tem como objectivo registar a minha aprendizagem da linguagem de programação Scala, enquanto um “refugiado” Java. Ou seja, após ter sentido diversas coding pains ao programar em Java, preciso de aprender a programar de uma forma mais orientada a objectos com uma linguagem que seja como que uma Java++.

Esta linguagem deverá ser puramente orientada a objectos, sem tipos primitivos e casts, permitir a composição de novas classes através de um mecanismo Mix-In (superior ao mecanismo em Java de Interface) e ser ainda estaticamente tipificada, à semelhança de Java e de C++. Por esta última razão, principalmente, é que optei por aprender Scala quando já sei Ruby ou ao invés de aprender Groovy. Uma outra razão, que por enquanto considero secundária, é que o código nesta nova linguagem deve ser compilado para código bytecode sobre a JVM. Esta razão não invalida Groovy mas invalida por exemplo programar em JRuby.

Referências

Daniel Spiewak is a software developer based out of Wisconsin, USA. Over the years, he has worked with Java, Ruby, Scala, SQL, C and C++, ML, and half-a-dozen experimental languages. His current Open Source endeavor is the ActiveObjects ORM, which seeks to be a more intuitive and lightweight database access layer than existing Java solutions.

Progresso

Parte 1

Começa por um breve resumo do meu suposto background: um developer (craftsman) habituado a Java que está a par do conceito PolyglotProgramming e que segue com atenção o “sinal Ruby”. Ciente de que devo usar Java em aplicações empresariais, com o intuito de manter o risco num patamar baixo, também comecei a seguir o “sinal Scala”. Mas habituado a Java e ao paradigma OOP é com dificuldade com sigo os exemplos segundo o paradigma FP, com o qual tenho pouca ou nenhuma experiência.

Segue-se então a introdução, dada nesta 1ª parte do tutorial. E o artigo acerta no alvo, bem ao centro: aprender Scala como se fosse uma melhor Java.

HelloWorld1

hello_world_1.scala

object HelloWorld extends Application {
  println( "Hello, World!" )
}

HelloWorld1.java

public class HelloWorld1 {
 
  public static void main( String[] args ) {
    System.out.println( "Hello, World!" );
  }
 
}

Na linha de comandos:

scalac hello_world_1.scala
scala HelloWorld

Com o esperado output:

Hello, World!

HelloWorld2

hello_world_2.scala

object HelloWorld {
 
  def main( args:Array[ String ] ) = {
    var greeting = ""
    for ( i <- 0 until args.length ) {
      greeting += ( args( i ) + " " )
    }
    if ( args.length > 0 ) greeting = greeting.substring( 0, greeting.length - 1 )
 
    println( greeting )
  }
 
}

HelloWorld2.java

public class HelloWorld2 {
 
  public static void main( String[] args ) {
    String greeting = "";
    for ( Integer i = 0; i < args.length; i++ ) {
      greeting += ( args[ i ] + " " );
    }
    if ( args.length > 0 ) greeting = greeting.substring( 0, greeting.length() - 1 );
 
    System.out.println( greeting );
  }
 
}

Na linha de comandos:

scalac hello_world_2.scala
scala HelloWorld Hello José!

Com o esperado output:

Hello José!

HelloWorld3

hello_world_3.scala

object HelloWorld {
 
  def main( args:Array[ String ] ) : Unit = {
    var greeting : String = ""
    val range = 0.until( args.length )
    for ( i <- range ) {
      greeting += ( args( i ) + " " )
    }
    if ( args.length > 0 ) greeting = greeting.substring( 0, greeting.length - 1 )
 
    println( greeting )
  }
 
}

HelloWorld4

hello_world_4.scala

object HelloWorld {
 
  def main( args:Array[ String ] ) = {
    var greeting = ""
    args.foreach { arg =>
      greeting += ( arg + " " )
    }
    if ( args.length > 0 ) greeting = greeting.substring( 0, greeting.length - 1 )
 
    println( greeting )
  }
 
}

HelloWorld4.java

public class HelloWorld3 {
 
  public static void main( String[] args ) {
    String greeting = "";
    for ( String arg : args ) {
      greeting += ( arg + " " );
    }
    if ( args.length > 0 ) greeting = greeting.substring( 0, greeting.length() - 1 );
 
    System.out.println( greeting );
  }
 
}

Parte 2

Trabalho de Curso

Considerações

Para me auxiliar na codificação decidi recorrer ao simples e leve IDE Geany. Os packages da versão 0.17 podem ser obtidos a partir de:

No entanto, sem suporte Scala, acabei por recorrer a um Terminal (Console).

Pontos Altos

  • Não existe mais a obrigação de terminar uma linha de código com ”;”.
  • Não existe mais a restrição do nome da classe principal corresponder ao nome do ficheiro.
  • Um package é apenas um nome, não obriga a uma estrutura equivalente de pastas e sub-pastas.
  • Todos os métodos são implicitamente ”public”.
  • Em substituição a classes static existe a classe Singleton Object.
  • Tem um mecanismo que possibilita type inference.
  • Existe uma classe Unit que combina as funcionalidades da classe Object em Java e o tipo void.

Pontos Baixos

  • Disponibiliza a keyword abstract para declarar classes abstractas.
  • O suporte Scala é relativamente baixo. Não tenho SyntaxHighlight nem no DokuWiki nem no Geany e o Geany não fornece suporte à compilação e execução do código em Scala.
 
docoding/languages/scala/scalaforjavarefugees.txt · Modificado em: 2009/07/16 00:43 por straider     Voltar ao topo