<?xml version="1.0" encoding="UTF-8"?>
<rss version='2.0' xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>TriadWorks</title>
    <description>Cursos na linguagem e plataforma Java</description>
    <link>https://blog.triadworks.com.br/feed</link>
    <atom:link href="https://blog.triadworks.com.br/feed" rel="self" type="application/rss+xml"/>
    <category domain="blog.triadworks.com.br">Content Management/Blog</category>
    <language>en-us</language>
      <pubDate>Wed, 10 Jan 2018 19:40:10 -0200</pubDate>
    <managingEditor>rponte@gmail.com (TriadWorks)</managingEditor>
      <item>
        <guid>http://blog.triadworks.com.br/uma-breve-introducao-a-kotlin#35812</guid>
          <pubDate>Wed, 10 Jan 2018 19:40:10 -0200</pubDate>
        <link>http://blog.triadworks.com.br/uma-breve-introducao-a-kotlin</link>
        <title>Uma breve introdução a Kotlin</title>
        <description>Vamos aprender o básico da mais nova linguagem oficial do Android?</description>
        <content:encoded><![CDATA[<p>&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var peso = 75 <br>
print(peso)<br>
<br>
Legal! Sempre podemos nos lembrar de Javascript na hora de declarar nossas vari&aacute;veis.<br>
Perceba que n&atilde;o informamos o&nbsp;tipo da vari&aacute;vel, o que sempre precisamos fazer em Java. Em Kotlin, podemos deixar esse trabalho para o compilador, de modo que o tipo &eacute;&nbsp;inferido a partir do valor que atribu&iacute;mos. Mas tamb&eacute;m podemos fazer o seguinte:&nbsp;<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var peso: Int<br>
peso = 3<br>
<br>
Podemos inicializar nossas vari&aacute;veis em um ponto posterior no nosso c&oacute;digo, informando seu tipo, mas para utiliz&aacute;-las o compilador precisa ser capaz de provar que estas j&aacute; foram inicializadas. Ou seja:&nbsp;<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var peso: Int</p>

<p>if (algumaCondicionalObscura) {<br>
    peso = 70<br>
} else {<br>
    peso = 60<br>
}</p>

<p>print(peso) // Agora sim!<br>
<br>
Kotlin tamb&eacute;m traz o conceito de vari&aacute;veis&nbsp;assign-once&nbsp;ou&nbsp;read-only. Nos basta trocar a&nbsp;keyword da declara&ccedil;&atilde;o:<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
val peso: Int<br>
peso = 40&nbsp;<br>
<br>
E ao tentarmos atribuir um novo valor:<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
peso = 50 // Error: Val cannot be reassigned<br>
<br>
&nbsp;<br>
Os tipos b&aacute;sicos de Kotlin s&atilde;o:&nbsp;<br>
<br>
Double<br>
Float<br>
Long<br>
Int<br>
Short<br>
Byte<br>
Char<br>
Boolean<br>
Array<br>
String<br>
<br>
Caso queira ler mais sobre estes, basta ir na respectiva se&ccedil;&atilde;o da documenta&ccedil;&atilde;o.<br>
&nbsp;<br>
Controle de fluxo<br>
Kotlin possui os controles com os quais j&aacute; estamos acostumados, com algumas features a mais para nos ajudar.&nbsp;<br>
If<br>
Em Kotlin, o&nbsp;if se parece bastante com o que j&aacute; conhecemos:<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
if (altura &gt; 1,9) {<br>
    print(&quot;Gigante!&quot;)<br>
} else {<br>
    print(&quot;Normal.&quot;)<br>
}<br>
<br>
Ou...<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
if (altura &gt; 1,9) print(&quot;Gigante!&quot;) else print(&quot;Normal.&quot;)<br>
<br>
Vamos criar um caso? Vamos escrever um programa para nos dizer qual Jedi tem a maior altura:<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
val alturaYoda = 0.66<br>
val alturaAnakin = 1.88</p>

<p>val maiorAltura: Double</p>

<p>if (alturaYoda &gt; alturaAnakin) maiorAltura = alturaYoda else maiorAltura = alturaAnakin<br>
<br>
Ficou meio estranho, n&eacute;?! Pois estou prestes a lhes mostrar o&nbsp;pulo do gato&nbsp;que a linguagem nos oferece.&nbsp;<br>
Em Kotlin,&nbsp;if &eacute; uma express&atilde;o, ou seja, retorna um valor. Sendo assim, podemos reescrever nosso c&oacute;digo da seguinte forma:&nbsp;&nbsp;<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
val alturaYoda = 0.66<br>
val alturaAnakin = 1.88<br>
val maiorAltura = <br>
    if (alturaYoda &gt; alturaAnakin) alturaYoda else alturaAnakin // aqui if &eacute; usado como uma express&atilde;o<br>
<br>
Tamb&eacute;m podemos envolver os statements com chaves, utilizando a sintaxe padr&atilde;o:<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
val maiorAltura = <br>
    if (alturaYoda &gt; alturaAnakin) { <br>
        alturaYoda <br>
    } else {<br>
        alturaAnakin<br>
    }<br>
<br>
<br>
&nbsp;<br>
When<br>
Em Kotlin, a&nbsp;keyword when prov&ecirc; uma &quot;vers&atilde;o avan&ccedil;ada&quot; do&nbsp;switch&nbsp;que conhecemos no Java. Vamos ver como funciona?&nbsp;<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
val i = 2</p>

<p>when (i) {<br>
    1 -&gt; print(&quot;&Eacute; pouco!&quot;)<br>
    2 -&gt; print(&quot;&Eacute; muito!&quot;) <br>
    3, 4 -&gt; print(&quot;&Eacute; demais!&quot;)  // Duas condi&ccedil;&otilde;es combinadas<br>
    else -&gt; {<br>
        print(&quot;N&atilde;o se aplica :/&quot;)    // Aten&ccedil;&atilde;o ao bloco de c&oacute;digo<br>
    }<br>
}<br>
<br>
A menos que o compilador consiga provar que todos os casos poss&iacute;veis j&aacute; foram tratados, a cl&aacute;usula&nbsp;else ser&aacute; necess&aacute;ria: se n&atilde;o declar&aacute;-la, receber&aacute; um erro de compila&ccedil;&atilde;o.<br>
Mas aqui temos um&nbsp;pulo do sapo. N&atilde;o somos obrigados a passar um valor para o comando, pois podemos utilizar valores dos escopos superiores para criar&nbsp;Booleans&nbsp;nas cl&aacute;usulas:&nbsp; &nbsp;<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
// Em cent&iacute;metros \/<br>
when {<br>
    altura in 120..150 -&gt; print(&quot;Um an&atilde;o minerador, barbudo e parrudo!&quot;) <br>
    // Acima temos um intervalo. &#39;in&#39; verifica se o valor est&aacute; dentro do intervalo de 120 a 150.<br>
    altura &lt; 120 -&gt; print(&quot;Um hobbit do Condado... Brandebuque?&quot;)<br>
    altura &gt; 150 -&gt; print(&quot;Provavelmente um humano...&quot;)<br>
}<br>
<br>
Aqui utilizamos when de maneira parecida com uma cadeia de&nbsp;if-else if, mas de maneira um tanto mais elegante (opini&atilde;o pr&oacute;pria).&nbsp;Note que acima n&atilde;o precisamos inserir uma cl&aacute;usula&nbsp;else, pois para qualquer poss&iacute;vel valor de&nbsp;altura,&nbsp;existe uma cl&aacute;usula que o cobre.<br>
Legal, j&aacute; vimos que&nbsp;when&nbsp;&eacute; bastante poderoso, mas estou prestes a lhes mostrar o&nbsp;pulo do gato&nbsp;parte II! Como&nbsp;o&nbsp;if,&nbsp;when tamb&eacute;m pode ser tratado como uma express&atilde;o:<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
val altura = 170</p>

<p>val ra&ccedil;a = when {<br>
    altura in 120..150 -&gt; &quot;An&atilde;o&quot;<br>
    altura &lt; 120 -&gt; &quot;Hobbit&quot;<br>
    altura &gt; 150 -&gt; &quot;Humano (provavelmente)&quot;<br>
    else -&gt; throw IllegalArgumentException(&quot;Altura n&atilde;o &eacute; v&aacute;lida&quot;)<br>
}</p>

<p>print(ra&ccedil;a) // Output: Humano (provavelmente)<br>
<br>
Note que acima tivemos de declarar a cl&aacute;usula&nbsp;else, apesar de n&atilde;o precisarmos: quando utilizamos&nbsp;when como uma&nbsp;express&atilde;o, precisamos imprescindivelmente declarar uma cl&aacute;usula&nbsp;else.<br>
For<br>
O&nbsp;for de Kotlin percorre qualquer coisa que provenha um&nbsp;iterator. Sem entrar em detalhes, cole&ccedil;&otilde;es e intervalos s&atilde;o os consumos mais comuns do&nbsp;for. Eis a sintaxe b&aacute;sica:&nbsp;&nbsp;<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
for (item: Tipo in cole&ccedil;&atilde;o) {<br>
    // whatever pleasures you<br>
}<br>
<br>
Tamb&eacute;m podemos percorrer com o valor do &iacute;ndice!&nbsp;<br>
&lt;!-- HTML generated using hilite.me --&gt;&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
for ((indice, valor) in cole&ccedil;&atilde;o.withIndex()) {<br>
    // whatever pleasures you with index<br>
}<br>
<br>
<br>
&nbsp;<br>
While<br>
No while, n&atilde;o temos nada de novo, pois o&nbsp;while e o&nbsp;do..while funcionam como no Java, mas vale demonstrar:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var x = 10</p>

<p>while (x &gt; 0) {<br>
    x--<br>
}</p>

<p>do {<br>
    x++<br>
} while (x &lt; 10)<br>
<br>
<br>
&nbsp;<br>
Ranges<br>
Outra coisa bacana de Kotlin, que n&atilde;o &eacute; exatamente uma novidade, mas vem sendo implementado na maioria das linguagens modernas, &eacute; a funcionalidade dos&nbsp;ranges, traduzidos literalmente para&nbsp;intervalos. Podemos facilmente criar um intervalo com o operador .. e percorrer o mesmo com um&nbsp;for:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
for (i in 1..5) print(i)<br>
// Imprime 12345<br>
<br>
Tamb&eacute;m temos muitas&nbsp;infix functions&nbsp;para a cria&ccedil;&atilde;o de intervalos:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
for (i in 5 downTo 1) print(i) // 54321<br>
// Cria um intervalo decrescente</p>

<p>for (i in 1..10 step 2) print(i) // 13579<br>
// Cria um intervalo que incrementa 2 em vez de 1</p>

<p>for (i in 1 until 10) print(i) // 123456789<br>
// Cria um intervalo que n&atilde;o inclui o 10<br>
<br>
<br>
Como vimos acima, temos uma maneira de verificar se um valor est&aacute; inclu&iacute;do num intervalo:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
if (altura in 150..200) print(&quot;Um humano, talvez um elfo?&quot;)<br>
<br>
Null safety&nbsp;<br>
Ah, quem nunca levou um NullPointerException que atire a primeira pedra! A refer&ecirc;ncia nula, conhecida como &quot;The billion dollars mistake&quot;, pode nos causar muita dor de cabe&ccedil;a. N&atilde;o &agrave; toa, seu criador, Tony Hoare, pediu desculpas em p&uacute;blico em 2009. Pois bem, pessoalmente acho essa&nbsp;feature a mais fant&aacute;stica, em Kotlin.<br>
O sistema de tipos de Kotlin visa eliminar o perigo de refer&ecirc;ncias nulas no c&oacute;digo, abrindo espa&ccedil;o para o que &eacute; chamado na computa&ccedil;&atilde;o de&nbsp;null safety.<br>
Kotlin distingue refer&ecirc;ncias que podem receber&nbsp;null (Nullable) das que n&atilde;o podem. Uma vari&aacute;vel como as que est&aacute;vamos declarando anteriormente n&atilde;o pode receber&nbsp;null:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var string: String<br>
string = null // Erro de compila&ccedil;&atilde;o!<br>
<br>
<br>
&nbsp;Para declarar uma vari&aacute;vel&nbsp;nullable, nos basta adicionar &#39;?&#39; no tipo:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var stringNullable: String?<br>
string = null // Ok<br>
<br>
<br>
&nbsp;<br>
Ent&atilde;o aqui fica divertido: o compilador nos impede de acessar diretamente qualquer propriedade de uma refer&ecirc;ncia&nbsp;nullable:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var tamanhoDaString: Int = stringNullable.length // error: variable &#39;stringNullable&#39; can be null<br>
<br>
<br>
Isso acontece porque n&atilde;o seria seguro acess&aacute;-la, uma vez que ela pode conter&nbsp;null, que nos jogaria um NPE. Ou seja, somos&nbsp;obrigados a tratar a possibilidade da refer&ecirc;ncia conter&nbsp;null: essa &eacute; a ess&ecirc;ncia de&nbsp;null safety.<br>
Mas precisamos acessar aquela propriedade, ent&atilde;o dispomos de algumas maneiras de fazer isso.<br>
Primeiro, podemos checar explicitamente se ela carrega null&nbsp;em uma condicional:&nbsp;<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var tamanhoDaString: Int = if (stringNullable != null) stringNullable.length else -1<br>
<br>
<br>
&nbsp;Ou podemos usar o operador de&nbsp;safe call (&#39;?&#39;), que faz a express&atilde;o inteira retornar null caso a refer&ecirc;ncia em quest&atilde;o seja nula:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var tamanhoDaString: Int = stringNullable?.length // Erro<br>
// Type mismatch: inferred type is Int? but Int was expected<br>
<br>
<br>
&nbsp;Ops! O tipo de nossa vari&aacute;vel&nbsp;tamanhoDaString era Int, mas a express&atilde;o retornou o tipo Int?. Faz sentido! Se a nossa express&atilde;o pode retornar&nbsp;null, temos de atribu&iacute;-la a uma refer&ecirc;ncia&nbsp;nullable:<br>
&lt;!-- HTML generated using hilite.me --&gt;<br>
<br>
var tamanhoDaString: Int? = stringNullable?.length // Ok<br>
<br>
<br>
&nbsp;<br>
Conclus&atilde;o<br>
Que linguagem legal, n&atilde;o?! O mais legal ainda &eacute; que o que eu mostrei aqui &eacute; muito pouco: Kotlin tem muito a se explorar e &eacute; dif&iacute;cil dominar todas suas&nbsp;features e &quot;pulos do gato&quot;. Contudo, a curva de aprendizagem &eacute; relativamente baixa. &Eacute; um &oacute;timo investimento do seu tempo, principalmente se pretendes ser ou j&aacute; &eacute; um desenvolvedor Android. Al&eacute;m de tudo, convenhamos: quem n&atilde;o fica empolgado aprendendo uma nova linguagem? Pessoalmente, eu AMO aprender novas linguagens, tecnologias, conceitos, etc.&nbsp;<br>
Se quiser continuar a estudar Kotlin, recomendo a documenta&ccedil;&atilde;o da linguagem: &eacute; boa, simples, sucinta e explicativa.<br>
Obrigado por ler &amp; happy coding!</p>
]]></content:encoded>
      </item>
      <item>
        <guid>http://blog.triadworks.com.br/por-que-investir-tempo-mantendo-seu-codigo-limpo#35430</guid>
          <pubDate>Wed, 13 Dec 2017 16:48:20 -0200</pubDate>
        <link>http://blog.triadworks.com.br/por-que-investir-tempo-mantendo-seu-codigo-limpo</link>
        <title>Por que investir tempo mantendo seu código limpo?</title>
        <description>Seria justificável negligenciar a qualidade de seu código quando os prazos estão apertados?</description>
        <content:encoded><![CDATA[]]></content:encoded>
      </item>
      <item>
        <guid>http://blog.triadworks.com.br/oportunidade-de-estagio-2017-triadworks#34465</guid>
          <pubDate>Tue, 19 Sep 2017 13:22:00 -0300</pubDate>
        <link>http://blog.triadworks.com.br/oportunidade-de-estagio-2017-triadworks</link>
        <title>Oportunidade de Estágio 2017 - TriadWorks</title>
        <description>Quer ser o próximo JEDI? </description>
        <content:encoded><![CDATA[<p><img alt="Estagio triadworks " src="https://silvrback.s3.amazonaws.com/uploads/2a0ec814-610e-44f1-b38c-dccb6f891f4e/estagioTriadNovo.jpg" /></p>

<p>O nosso querido, hoje desenvolvedor <a href="https://www.youtube.com/watch?v=PLfw8YfQZHc">Kewerson Hugo</a>, depois de passar por todo o nosso treinamento está seguindo para um novo desafio em sua carreira, carreira esta que ficamos muito felizes <a href="https://www.youtube.com/watch?v=PLfw8YfQZHc">em ter contribuído</a>. Agora precisamos de um novo Padawan.</p>

<p>Precisamos treinar e capacitar mais um futuro Jedi!</p>

<p>Se você tem interesse em metodologias e tecnologias de desenvolvimento (TDD, Testes, Ruby , BDD, Java, Design de Software etc), gosta de participar dos eventos das comunidades, tem sede de conhecimento, já teve alguma vez vontade de escrever um artigo e não tem medo de encarar desafios, você está apto a participar desta seleção.</p>

<h2 id="pr-requisitos-b-sicos-para-a-vaga-al-m-dos-passados-acima">Pré-requisitos básicos para a vaga, além dos passados acima:</h2>

<ul>
<li>Autodidata;</li>
<li>Sede de conhecimento;</li>
<li>Noções de Orientação a Objeto;</li>
<li>Lógica de programação;</li>
<li>Inglês técnico (Plus !);</li>
<li>Já ter programado em qualquer linguagem (Plus !);</li>
<li>Sim, queremos um NERD (Plus !);</li>
</ul>

<h2 id="envie-seu-curr-culo-para-recrutamento-triadworks-com-br-seguindo-o-formato-abaixo">Envie seu currículo para <a href="mailto:recrutamento@triadworks.com.br">recrutamento@triadworks.com.br</a> seguindo o formato abaixo:</h2>

<p>Assunto: <strong>Vaga Estágio – Fulano de tal</strong><br>
<strong>Arquivo em PDF com o SEU NOME.</strong></p>

<p>Que a força esteja com você!</p>

<p>Para conhecer mais sobre a empresa acesse o site: <a href="http://www.triadworks.com.br">www.triadworks.com.br</a> ou visite nosso canal do <a href="https://www.youtube.com/channel/UCYt1xAAYU4ysf5wJuR7dvyQ">Youtube</a> e <a href="https://www.facebook.com/TriadWorks/">Facebook</a>.</p>
]]></content:encoded>
      </item>
  </channel>
</rss>