:: 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
- Roundup: Scala for Java Refugees. Consiste numa série de artigos da autoria do Daniel Spiewak.
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!" ) } |
Na linha de comandos:
scalac hello_world_1.scala scala HelloWorld
Com o esperado output:
Hello, World!
HelloWorld2
| 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
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.