Quem está planejando utilizar Xamarin para o desenvolvimento de software mobile provavelmente o faz por causa do que muitos consideram o seu principal atrativo: Através desta ferramenta é possível utilizar os recursos fundamentais da plataforma .NET para codificar as principais funcionalidades do software uma única vez, para então distribuir estas funcionalidades nos sistemas operacionais mobile mais populares, como Android, iOS e Windows Phone.

O processo de ter uma biblioteca de código centralizada, que é compartilhada por projetos destinados a diferentes sistemas e plataformas trás grandes benefícios, visto que isso significa que iremos corrigir bugs e problemas apenas uma vez, adicionar funcionalidades apenas uma vez, e consequentemente diminuir trabalho e custos com manutenção e testes.

No entanto arquitetar o nosso sistema de uma maneira na qual possamos maximizar o código compartilhado requer análise e planejamento. Devemos sempre lembrar que independentemente das plataformas alvo, haverá sempre código específico de cada plataforma em nosso projeto. De acordo com dados da Xamarin, em média de 15 a 30 por cento do código em um projeto mobile Xamarin é específico de alguma plataforma.

Os principais fatores em aplicativos mobile que causam a necessidade de código específico para cada plataforma são:

  • A camada de UI (user interface), especialmente quando não se usa Xamarin.Forms;
  • Os controles de tela que ficam entre o usuário e a lógica de negócios;
  • As funcionalidades específicas de cada plataforma.

Mas que tipo de código pode ser compartilhado? Basicamente qualquer tipo de código que não dependa de uma funcionalidade ou implementação específica de uma plataforma pode ser compartilhado entre diversos projetos. Como por exemplo, lógica de negócios, manipulação de dados, e acesso a web services, dentre outros. Perceba que nenhuma destas atividades é específica de nenhuma plataforma mobile, elas são atividades comumente realizadas na .NET framework.

Um tipo de código que pode gerar dúvidas sobre como deve ser compartilhado é o código por detrás de formulários e controles de tela. No entanto esse código não deve ser compartilhado, visto que a sua implementação é diferente para cada tipo de plataforma. O que pode ser feito neste caso é compartilhar o código que realiza as operações, ou o trabalho em si, de cada controle. Dessa maneira é possível invocar este código, chamando a operação necessária em cada controle de tela sem a necessidade de escrever código repetido para Android, iOS ou Windows Phone.

Sempre que você se encontrar escrevendo código repetido em mais de uma plataforma, é hora de analisar se é hora de refatorar este código de maneira que possa ser escrito apenas uma vez e compartilhado em mais de uma plataforma.

Mas e quanto estamos escrevendo código que pertença a uma biblioteca compartilhada, que irá desempenhar o mesmo trabalho e ter a mesma funcionalidade em todas as plataformas, mas que dependendo da plataforma onde este código será executado, a sua implementação precise ser um pouco diferente? Nesse caso precisamos criar uma abstração da implementação deste código, mas antes de se dar ao trabalho é recomendável verificar se essa abstração já não existe na framework. Existem diversos lugares onde podemos verificar.

O Xamarin lhe oferece diversas bibliotecas multi-plataformas que possuem uma API unificada para acessar funcionalidades específicas de cada plataforma, iOS, Windows Phone ou Android. Essas bibliotecas são open-source e estão disponíveis no Github (github.com/xamarin) para que você possa utilizar (ou modificar) como quiser.

Existem diversos componentes que o Xamarin oferece suporte, entre eles estão:

  • Xamarin.Social: Oferece funcionalidades de redes sociais ao seu aplicativo, e lhe permite por exemplo, postar no facebook ou twitter.
  • Xamarin.Auth: É utilizado para suporte a oauth e se conectar de maneira segura a webservices.
  • Xamarin.Mobile: Provê acesso a funcionalidades de localização, câmera e fotos.

Segue um exemplo de código compartilhado que necessita de acesso a funcionalidades específicas de cada plataforma, e que o consegue com através de abstração já existente no Xamarin.Mobile:

async void OnTakePicture(object sender, EventArgs e)
{
  var picker = new MediaPicker();
  if (picker.IsCameraAvailable)
  {
    MediaFile photo = await picker.TakePhotoAsync(
      new StoreCameraMediaOptions{
        Name = 'Photo.jpg',
        DefaultCamera = CameraDevice.Rear
      }
    );
    string filePath = photo.Path;
    Stream photoStream = photo.GetStream();
    //...
    //...
    //...
  }
}

O MediaPicker no código acima fornece acesso a foto, como arquivo e como stream, para que se possa obter esse arquivo e fazer com ele o que for necessário.

Esse código poderia muito bem ter sido escrito de maneira específica para cada plataforma, mas caso os sistemas alvo da sua aplicação sejam iOS, Android e Windows Phone esse código teria que ser reescrito três vezes. Antes de começar o desenvolvimento de uma aplicação multiplataforma utilizando Xamarin no entanto, é necessário escolher o tipo de projeto que desejamos criar, Shared Projets ou Portable Class Libraries (PCL).

No próximo artigo continuaremos com shared projects.

Write A Comment

Pin It