Skip to main content
Build the future with Agentforce at TDX in San Francisco or on Salesforce+ on March 5–6. Register now.

Mapear conceitos do .NET para a plataforma do Lightning

Objetivos de aprendizagem

Após concluir esta unidade, você estará apto a:

  • Compreender quais são os principais recursos que compõem a plataforma do Lightning e a linguagem de programação Apex
  • Identificar semelhanças e diferenças entre o .NET e a plataforma do Lightning
  • Usar o Console do desenvolvedor para criar sua primeira classe do Apex
  • Usar o Apex anônimo para invocar um método de uma classe do Apex
Nota

Observação

Deseja aprender em português (Brasil)? Comece o desafio em um Trailhead Playground de português (Brasil) e copie e cole os valores de português (Brasil). Se você não passar no desafio em sua organização de português (Brasil), recomendamos que (1) mude o local para os Estados Unidos, (2) mude o idioma para inglês, seguindo as instruções aqui, e (3) clique novamente no botão “Validar o desafio”.

Consulte o emblema Trailhead no seu idioma para saber mais sobre como aproveitar a experiência de Trailhead em outros idiomas.

Acompanhar com o Trail Together

Deseja acompanhar um especialista enquanto trabalha nesta etapa? Veja este vídeo que faz parte da série Trail Together.

Apresentação da plataforma do Lightning

Agora falando sério, depois que conhecer melhor a plataforma do Lightning, você gostará dela tanto quanto nós. Neste módulo, veremos como os conceitos .NET que você já conhece se relacionam à plataforma do Lightning.

Noções básicas da plataforma

Primeiro, vamos apresentar um resumo do que compõe, exatamente, a plataforma do Lightning. Uma das coisas que diferencia a plataforma dos outros produtos de software como serviço (SaaS, software-as-a-service) é que ela se baseia numa arquitetura orientada por metadados. Tudo, incluindo o código, a configuração e os aplicativos, é especificado como metadados.

Como desenvolvedor .NET, provavelmente você já conhece os aplicativos em nuvem executados no Microsoft Azure. Bem, a plataforma do Lightning funciona de outro jeito. A plataforma do Lightning está fortemente integrada ao banco de dados. Você encontrará todo tipo de item integrado à plataforma – por exemplo, interface de usuário, segurança e relatórios. Essa integração é o que permite que você crie aplicativos super-rápido.

Mas você, como desenvolvedor, precisa ceder um pouco do controle para ter tamanha produtividade (e talvez isso seja um pouco estranho no começo). Na plataforma do Lightning, não é preciso se preocupar com a configuração de nós ou tarefas de gerenciamento. Você não precisa se preocupar com qualquer atualização, ajuste ou dimensionamento. Para falar a verdade, é provável que você nem sinta falta de toda essa complexidade e responsabilidade agregadas, porque você pode simplesmente se concentrar em criar aplicativos excelentes com rapidez.

Essa foi só uma apresentação mais superficial do que a plataforma oferece. Se quiser mergulhar fundo na arquitetura, confira o módulo Noções básicas da plataforma.

Noções básicas do Apex

Como a plataforma do Lightning está fortemente integrada e se baseia em uma arquitetura de metadados, você pode fazer muita coisa usando o desenvolvimento declarativo, conhecido como criação de aplicativos “apontar e clicar”. Se você estiver chegando agora na plataforma do Lightning, é extremamente recomendável conferir o artigo sobre a criação “apontar e clicar” em Recursos.

Como desenvolvedor .NET, sabemos que você gosta de codificar, mas é preciso perceber que, na plataforma do Lightning, a codificação nem sempre é necessária. No entanto, é importante entender quando a codificação é necessária e quando ela não é. Para saber mais sobre essa diferenciação, leia este artigo, que explica quando clicar e quando escrever um código.

Mas chega desse assunto. Sabemos que você quer aprender como programar na plataforma, e é aí que o Apex entra.

O que é parecido?

A linguagem de programação Apex é parecida com outra que você provavelmente já conhece e adora, o C#. O Apex é salvo, compilado e executado diretamente na plataforma do Lightning. Assim como o C#, ele é orientado a objetos. Nesta seção, falaremos disso e do que mais torna o Apex parecido com as linguagens .NET.

Design orientado a objetos

Como imaginamos que você já conheça o conceito do design orientado a objetos, não vamos perder tempo ensinando o padre a rezar a missa. Basta saber que o Apex é compatível com vários dos princípios orientados a objetos que você provavelmente já conhece, como encapsulamento, abstração, herança e até mesmo polimorfismo. Para falar a verdade, a linguagem Apex contém muitas construções de linguagem que você já conhece, incluindo classes, interfaces, propriedades e coleções.

Por exemplo, a classe do Apex HelloWorld tem esta aparência.

public with sharing class HelloWorld {
    public void printMessage() {
        String msg = 'Hello World';
        System.debug(msg);
    }
}

Essa classe simples HelloWorld contém um método chamado printMessage que é usado para produzir a mensagem “Hello World” no registro de depuração do sistema. É claro que esse exemplo é bem simples, mas queremos que você veja o quanto o Apex é parecido com C#.

A sintaxe básica para definir classes é:

private | public | global
[virtual | abstract][with sharing | without sharing | inherited sharing]
class ClassName [implements InterfaceNameList] [extends ClassName]
{
    // The body of the class
}

Quando tiver um tempo, confira Understanding Classes para entender melhor como as classes, os objetos e as interfaces funcionam.

Tipos de dados

O Apex é compatível com os tipos de dados que já seriam esperados. Há tipos primitivos, como números inteiros, duplos, longos, data, data/hora, sequência de caracteres e booleano. Também há um tipo de dados ID, que é usado com qualquer identificador de registros válido da plataforma do Lightning com 18 caracteres, que tenha sido atribuído pelo sistema.

Os tipos de valor e referência funcionam do mesmo jeito, mas, no Apex, todas as variáveis são inicializadas como nulas por padrão. É importante notar que, embora as sequências de caracteres .NET se comportem como tipos de valor, na verdade elas são referências, pois são imutáveis. No Apex, porém, as sequências de caracteres são sempre tratadas como tipo de valor primitivo.

Além dos primitivos, também há compatibilidade com os tipos de dados sObjects, sejam genéricos, sejam específicos, como uma conta ou um contato. Lembre-se: um sObject é, simplesmente, um objeto do Salesforce. Pode pensar nele como uma tabela em um banco de dados. Ele pode ser tanto um sObject padrão, que vem integrado ao Salesforce, quanto um personalizado definido por você.

Além disso, um tipo de dados pode ser uma lista tipificada de valores, também conhecida como enum. Mas preste atenção, porque esses enums não são aqueles com os quais você já trabalha no .NET. No Apex, é possível usar enums com números, mas não é possível definir quais são esses valores numéricos. Além disso, a atribuição ordinal começa em zero. Por exemplo, se você tivesse um enum como o seguinte.

public enum myEnums {
            Enum1,
            Enum2,
            Enum3
 }

Caso você tentasse acessar o valor ordinal do terceiro enum, o valor da variável enumOrd seria 2.

Integer enumOrd = myEnums.Enum3.ordinal();

Trabalhando com coleções

O .NET trabalha com uma biblioteca de grandes coleções, com vários tipos e métodos de extensão. E temos boas notícias. O Apex só tem as três coleções a seguir. Bem simples, não é mesmo?

Lista

Uma lista é uma coleção ordenada de elementos que funciona quase do mesmo jeito que uma matriz tradicional. No entanto, o Apex não oferece suporte a matrizes como coleções, apenas a listas. Você pode entretanto usar o que é conhecido como “notação de matriz” para fazer referência a itens específicos em uma lista usando colchetes, []. Por exemplo, a seguir, há uma forma de declarar uma variável como lista de sequências de caracteres:

List<String> myStrings =  new List<String>();

Como alternativa, você pode declarar a variável de lista myStrings usando colchetes, como no exemplo a seguir:

String[] myStrings = new List<String>();

Outra possibilidade é declarar a lista e inicializar os valores dela, tudo numa etapa só, como mostramos a seguir.

List<String> myStrings =  new List<String> {'String1', 'String2', 'String3' };

Também é possível adicionar valores à lista depois que ela for criada, por exemplo, assim:

List<String> myStrings = new List<String>();
myStrings.add('String1');
myStrings.add('String2');
myStrings.add('String3');

Provavelmente você criará muitas variáveis de lista no desenvolvimento com Apex, porque o resultado de qualquer consulta SOQL é uma lista. Por exemplo, você pode criar uma lista de contas usando um código, dessa forma:

List<Account> myAccounts = [SELECT Id, Name FROM Account];

Observe que o índice da lista sempre começa em zero. Acessar o nome da primeira conta da lista seria parecido com isso:

String firstAccount = myAccounts.get(0).Name;

Como alternativa, isto funcionará da mesma maneira:

String firstAccount = myAccounts[0].Name;		// Uses Array Notation []

Conjunto

Um conjunto é uma coleção desordenada de elementos que não contém dados duplicados. Um conjunto geralmente é usado para armazenar valores de ID, porque esses valores são sempre únicos. Então, você poderia usar o conjunto como parte de uma cláusula WHERE de uma consulta SOQL. Por exemplo, aqui criamos um conjunto que contém duas IDs únicas referentes a contas. Depois, usamos o conjunto na consulta SOQL para retornar apenas as contas para essas IDs.

Set<ID> accountIds = new Set<ID>{'001d000000BOaHSAA1','001d000000BOaHTAA1'};
List<Account> accounts = [SELECT Name FROM Account WHERE Id IN :accountIds];

Mapa

Um mapa é uma coleção de pares de valor-chave. Cada chave se relaciona a um único valor. Um mapa é útil quando é necessário encontrar algo rapidamente pela chave. Os valores das chaves têm de ser únicos; então, você pode ter um mapa que contenha valores de ID para a chave e os relacione a um sObject. Por exemplo, é possível usar o código a seguir para declarar uma variável de mapa chamada accountMap, que contém todas as contas relacionadas às suas IDs.

Map<Id, Account> accountMap = new Map<Id, Account>([SELECT Id, Name FROM Account]);

Depois disso, você pode acessar um registro de conta específico usando o método get e uma codificação parecida com a seguinte.

Id accId = '001d000000BOaHSAA1';
Account acc = accountMap.get(accId);

Confira os documentos oficiais para saber mais sobre os tipos de dados compatíveis com o Apex.

De ASP.NET para Visualforce

Se você for desenvolvedor de formulários da web em ASP.NET, provavelmente se sentirá em casa com o Visualforce. Ambos têm muitas semelhanças, sendo que a mais notável delas é a separação clara entre marcação e código. Além disso, são usados campos de formulário para relacionar o código às propriedades definidas no controlador.

A má notícia é que o viewstate do Visualforce é tão incômodo quanto o do ASP.NET, porque o HTTP não tem estado. A boa notícia é que existem formas de contornar as limitações de viewstate. Saiba mais no link em Resources.

O Visualforce é uma estrutura para renderizar páginas HTML usando um paradigma MVC. Mas antes de se empolgar e começar a pensar “Que legal, o Visualforce é como o ASP.NET MVC. Adoro MVC!”, pense que comparar ambos é como comparar uma maçã a uma abóbora. Pode-se usar qualquer um deles para renderizar páginas da web, e os dois separam a lógica de aplicação da marcação e do modelo de banco de dados, mas cada um faz isso de uma forma diferente.

Para saber tudo sobre o Visualforce, confira o módulo Noções básicas do Visualforce. Por enquanto, só queremos dar uma noção de como ele funciona usando um exemplo. A marcação abaixo pode ser usada para renderizar uma página simples usada para inserir dados de contato.

<apex:page standardController="Contact">
  <apex:form>
    <apex:pageBlock title="Edit Contact" mode="Edit">
       <apex:pageBlockButtons >
         <apex:commandButton action="{!edit}" id="editButton" value="Edit"/>
         <apex:commandButton action="{!save}" id="saveButton" value="Save"/>
         <apex:commandButton action="{!cancel}" id="cancelButton" value="Cancel"/>
       </apex:pageBlockButtons>
       <apex:pageBlockSection >
          <apex:inputField value="{!contact.lastname}" />
          <apex:inputField value="{!contact.accountId}"/>
          <apex:inputField value="{!contact.phone}"/>
       </apex:pageBlockSection>
    </apex:pageBlock>
  </apex:form>
</apex:page>

O exemplo usa algo que é chamado de controlador padrão, que faz parte da plataforma do Lightning. Ele é, em essência, um código gerado pelo sistema que permite incorporar rapidamente as funcionalidades CRUD básicas nas suas páginas do Visualforce. Porém, antes de começar a se preocupar, saiba que é possível criar controladores personalizados por você para acrescentar funcionalidades mais complexas. Para saber tudo sobre o funcionamento dos controladores padrão e personalizados, confira o módulo Noções básicas do Visualforce. A aparência da versão renderizada dessa página é assim:

Captura de tela de uma página personalizada do Visualforce usada para editar informações de contato

Observação

Talvez você saiba um pouco sobre os componentes do Lightning e esteja se perguntando: “O Lightning é como o ASP.NET MVC?” A resposta mais curta é: não. O Lightning é um modo mais leve de desenvolver aplicativos da Web super rápidos e responsivos, mas ele é uma estrutura baseada em componentes. Para saber tudo sobre isso, acesse o módulo Noções básicas dos componentes Web do Lightning.

O que é diferente?

Agora que você já sabe um pouco sobre as semelhanças entre Apex e .NET, vamos mostrar algumas diferenças. Para quem está começando agora, ao contrário do C#, o Apex não diferencia maiúsculas de minúsculas.

O Apex e o banco de dados estão intimamente ligados

O código do Apex e o banco de dados da plataforma do Lightning estão intimamente ligados, a ponto de algumas vezes serem indistinguíveis. Cada objeto padrão ou personalizado no banco de dados tem uma representação “mística” através de uma classe do Apex que oferece todo tipo de funcionalidade para facilitar a interação com o banco de dados. A classe e seu objeto subjacente são, em essência, reflexos um do outro que estão constantemente em sincronia. Por exemplo, sempre que você cria um novo campo em um objeto, um membro de classe vem automaticamente à tona para fazer referência aos valores no banco de dados. Além disso, é impossível adicionar ao código do Apex uma referência a algum campo que não exista; nesse caso, o compilador retornará um erro e não salvará o código. A plataforma trabalha com afinco para garantir essas dependências e não deixará que o esquema do banco de dados e o seu código fiquem dessincronizados. Por isso, se você tentar excluir um objeto personalizado ou um campo que seja mencionado pelo código do Apex, a plataforma gerará um erro e não autorizará a ação.

Padrões de design diferentes

Como desenvolvedor .NET, provavelmente você já conhece os padrões de design. No entanto, a maioria desses padrões não funciona na plataforma do Lightning. Você aprenderá mais sobre isso nas próximas unidades, quando falarmos de contexto de execução e design de acionadores, mas pode ser interessante conferir os links em Resources que tratam de padrões de design do Apex.

É importante entender que, se você tentar aplicar à plataforma do Lightning as mesmas estratégias de design que usa em .NET, provavelmente terá problemas quando for testar e implantar as soluções. Recomendamos dedicar algum tempo para aprender quais padrões de design funcionam melhor no universo da plataforma do Lightning antes de começar a produzir o código.

Testes de unidade são obrigatórios

Sabemos que você já está acostumado a escrever testes de unidade para seus aplicativos .NET e provavelmente compreende os benefícios de usá-los. A diferença é que, na plataforma do Lightning, você precisa ter uma cobertura de teste de 75% para implantar seu código do Apex em uma organização de produção.

Os testes de unidade não só promovem o desenvolvimento de códigos robustos e sem erros como também são essenciais para a estabilidade da plataforma, pois todos os testes são executados antes de cada lançamento importante. Para saber mais sobre testes de unidade, consulte An Introduction to Apex Code Test Methods.

Não existem arquivos de solução, projeto ou configuração

A plataforma do Lightning não trabalha com arquivos de solução ou projeto. É possível criar um aplicativo, mas não é a mesma coisa que criar um aplicativo ou assembly .NET.

Na plataforma do Lightning, um aplicativo é só uma coleção solta de componentes, como guias, relatórios, painéis e páginas. Vários deles vêm integrados à sua organização do Salesforce e, em alguns segundos, é possível criar os seus acompanhando o assistente “apontar e clicar”. Você pode até mesmo comprar aplicativos criados por terceiros no AppExchange.

Todo o seu código reside e é executado na nuvem. No universo da plataforma do Lightning, também não existem arquivos de configuração. Como o banco de dados é diretamente concebido, não é preciso usar sequências de caracteres de conexão. E, ao contrário do ASP.NET MVC, não é necessário configurar rotas. Você pode criar configurações personalizadas no Salesforce, mas elas são adicionadas e gerenciadas de modo declarativo.

Biblioteca de classes bem menor

A biblioteca de classes do Apex é consideravelmente menor do que a biblioteca de classes do .NET Framework; então, fica mais fácil e rápido acompanhar o Apex. Porém, para falar a verdade, pode ser um pouco frustrante procurar o equivalente a certa funcionalidade e descobrir que ele não existe no Apex.

Lembre-se de que a plataforma do Lightning foi concebida a partir da ideia de oferecer um desenvolvimento de aplicativos rápido. Além disso, ela é diferente da plataforma .NET e, por isso, pode ser que você acabe procurando funcionalidades com as quais está acostumado a trabalhar, mas que não existem na plataforma do Lightning. No entanto, caso você queira criar aplicativos com códigos personalizados, perfeitos nos mínimos detalhes, nossa plataforma Heroku Enterprise oferece a potência e os recursos necessários.

Ferramentas de desenvolvimento

É muito provável que você já tenha se inscrito em uma organização gratuita do Developer Edition (DE). Talvez você também tenha aberto e usado o aplicativo online do Console do desenvolvedor.

É possível usar o Console do desenvolvedor para editar o código-fonte e navegar por ele, além de depurar e solucionar problemas. Falaremos mais disso numa das próximas unidades, fique ligado. Caso você já tenha cursado o primeiro módulo sobre noções básicas de banco de dados, já sabe que também pode usar o Console do desenvolvedor para executar consultas SOQL e SOSL, além de visualizar planos de consulta. Se você ainda não usou o Console do desenvolvedor, não se preocupe, pois faremos isso em breve quando criarmos uma classe do Apex.

Como desenvolvedor .NET, você provavelmente está familiarizado com o Visual Studio Code. Você ficará feliz de saber que temos Extensões Salesforce para VS Code que permitem desenvolvimento personalizado em seu computador local. A extensão está vinculada ao Salesforce DX, que oferece uma experiência de desenvolvimento moderna voltada para a fonte. Saiba mais sobre o Salesforce DX na trilha Introdução ao Salesforce DX.

E, por último, talvez você queira ficar sabendo da interface de linha de comando avançada vinculada à plataforma do Lightning. Se você for um daqueles desenvolvedores que ama linhas de comando, a CLI do Salesforce é perfeita.

Para se manter atualizado com a evolução do Salesforce e com o suporte incorporado para DevOps, não deixe de dar uma olhada em Code Builder e DevOps Center.

Lidando com a segurança

A boa notícia é que, na plataforma do Lightning, não é preciso se preocupar com a autenticação ou com o armazenamento de senhas e sequências de caracteres para conexão com o banco de dados. A plataforma lida com a identidade. É possível controlar o acesso aos dados em muitos níveis, como o nível de objeto, registro ou campo. A segurança também é controlada de modo declarativo. Em muitos casos, a segurança é definida e configurada por um administrador do Salesforce. Como desenvolvedor, é importante saber como isso funciona. Saiba mais no módulo Segurança de dados.

E a integração?

É possível se integrar à plataforma de diversas formas, mas você provavelmente usará mais SOAP e REST. Eles podem ser usados em qualquer direção.

Você pode criar e expor serviços da web usando a linguagem de programação do Apex, além de invocar serviços da web externos a partir do Apex. Também é possível reagir a mensagens de email recebidas e configurar mensagens de saída automáticas, caso determinados eventos aconteçam.

Se você realmente quiser colocar as mãos na massa, o Salesforce oferece APIs SOAP e REST que proporcionam acesso direto aos dados da sua organização. Estão disponíveis kits de ferramentas que englobam as APIs; assim, você pode usar a linguagem que quiser: .NET, Java, PHP, Objective C, Ruby e JavaScript.

Também há vários aplicativos de integração com terceiros disponíveis no AppExchange. De fato, é possível fazer quase tudo. Para saber mais sobre todos os pontos de integração, curse o módulo Apex Integration.

Criar uma classe do Apex

Agora que você entende melhor como a plataforma do Lightning se relaciona à plataforma .NET, vamos mergulhar fundo e criar uma classe do Apex usando o Developer Console. A classe que vamos criar irá conter o método público sendMail. Ela contém um método auxiliar privado chamado inspectResults que inspeciona os resultados da chamada de envio de email.

  1. Na seção Configuração da sua organização de desenvolvedor, selecione Seu nome > Developer Console para abrir o Developer Console.
  2. No Developer Console, selecione File (Arquivo) > New (Nova) > Apex Class (Classe do Apex).
  3. Digite EmailManager como nome da classe e clique em OK.
  4. Exclua o código existente e insira o seguinte trecho:
    public with sharing class EmailManager {
        // Public method
        public static void sendMail(String address, String subject, String body) {
            // Create an email message object
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            String[] toAddresses = new String[] {address};
            mail.setToAddresses(toAddresses);
            mail.setSubject(subject);
            mail.setPlainTextBody(body);
            // Pass this email message to the built-in sendEmail method
            // of the Messaging class
            Messaging.SendEmailResult[] results = Messaging.sendEmail(
                new Messaging.SingleEmailMessage[] { mail });
            // Call a helper method to inspect the returned results.
            inspectResults(results);
        }
        // Helper method
        private static Boolean inspectResults(Messaging.SendEmailResult[] results) {
            Boolean sendResult = true;
            // sendEmail returns an array of result objects.
            // Iterate through the list to inspect results.
            // In this class, the methods send only one email,
            // so we should have only one result.
            for (Messaging.SendEmailResult res : results) {
                if (res.isSuccess()) {
                    System.debug('Email sent successfully');
                } else {
                    sendResult = false;
                    System.debug('The following errors occurred: ' + res.getErrors());
                }
            }
            return sendResult;
        }
    }
  5. Pressione Ctrl+S para salvar sua classe.
Observação

Esse é um exemplo simples que não implementa a segurança necessária no nível de objeto ou campo. Confira este trecho se quiser começar logo.

Invocar um método

Como declaramos que o método público sendMail é estático, podemos acessá-lo sem ter de criar uma instância da classe. É fácil fazer isso usando o Apex anônimo no Developer Console.

  1. Em Configuração, selecione Seu nome > Developer Console para abrir o Developer Console.
  2. Selecione Debug (Depurar) > Open Execute Anonymous Window (Abrir janela Executar no modo anônimo).
  3. Exclua o código existente e insira o seguinte trecho, substituindo o primeiro parâmetro seu próprio endereço de email:
    EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
  4. Verifique se a opção Open Log está selecionada e clique em Execute. Uma nova guia mostra o registro de execução.
  5. Selecione a opção Debug Only para ver apenas os demonstrativos de depuração mostrados no registro. Deve surgir uma mensagem informando que o email foi enviado com êxito. Você também deve receber um email, caso tenha inserido um endereço de email válido.

Imagine tentar fazer essa mesma tarefa no .NET. Criar um aplicativo .NET que enviasse emails teria sido tão fácil assim? Vamos lá, seja sincero.

Recursos

Compartilhe seu feedback do Trailhead usando a Ajuda do Salesforce.

Queremos saber sobre sua experiência com o Trailhead. Agora você pode acessar o novo formulário de feedback, a qualquer momento, no site Ajuda do Salesforce.

Saiba mais Continue compartilhando feedback