Usar das melhores práticas não é necessariamente obrigatório, mas sem dúvidas é extremamente importante.
Pois, ajudam tanto na organização do seu projeto quanto na melhora do fluxo de trabalho em equipe.
Por isso, é importante que pelo menos conheçamos quais são as melhores práticas, caso algum dia precise.
Convenções na Unity
Existem algumas práticas que podem ser adotadas na Unity que ajudam demais em seus projetos.
Pois, facilitam na organização de um código mais legível e até para encontrar possíveis bugs no game.
E mesmo para quem trabalha só, é importante sempre utilizar das melhores práticas até por questão de costume.
E ao lançarmos um jogo, corremos o risco de ele fazer muito sucesso, e assim necessitar de futuras atualizações.
Então com a necessidade de novos programadores, ter um projeto que utiliza das Convenções da Unity, será muito mais prático.
E caso tenha interesse em aprender mais sobre a Unity e a sua linguagem C#, essa é a sua chance.
Pois, temos um curso sensacional que te mostra a base da programação na Unity.
E de quebra você ainda vai desenvolver um jogo top down com sistema de diálogo, crafts, inimigo e muito mais.
Basta clicar na imagem ao lado para saber tudo sobre esse curso incrível!
PascalCase
Ao declararmos nossas variáveis, métodos, classe, etc, podemos utilizar o PascalCase ou o camelCase.
Então aqui falaremos a respeito do uso de PascalCase, para um melhor entendimento.
E no PascalCase declaramos palavras ou frases compostas com as iniciais maiúsculas, como o próprio nome indica.
Ou seja, uma classe que controle a movimentação do Player, seria declarada como PlayerMoviment, com iniciais maiúsculas.
E abaixo deixaremos os exemplos de quando devemos declarar com o uso de PascalCase:
Namespaces:
Classes & Métodos:
Campos estáticos:
Propriedades:
camelCase
Já o uso de camelCase se dá seguindo o exemplo que o próprio nome, já nos indica.
Pois, começamos declarando a primeira letra do nome composto sendo minuscula, e as demais todas em maiúsculas.
Perceba que tanto no uso de PascalCase e camelCase, a leitura das variáveis e funções se torna muito mais fácil.
E logo abaixo deixaremos os exemplos de melhores usos para o camelCase.
Parâmetros:
Campos e variáveis comuns:
Delegates e Eventos na Unity
Ao trabalharmos com Delegates, é necessário adicionarmos o sufixo “Callback”, junto ao nome do Delegate.
Pois, assim, distinguiremos facilmente um Delegate de um Singleton ou outra função pública, por exemplo.
Porém, no caso do uso de Events, é necessário adicionar o prefixo “On” ao nome do criado, pelo mesmo motivo.
E assim teremos um código mais intuitivo na diferenciação de métodos, segue abaixo os exemplos citados.
Melhores práticas nas Declarações
Na Unity temos a possibilidade de não declarar o modificador de acesso, assim o compilador assumirá como sendo privado.
Mas essa não é a prática mais recomendada, é preferível que sempre indique se é public, private, protected.
Outra prática ruim, é declarar diversas variáveis na mesma linha, o que pode trazer uma péssima legibilidade ao código.
Pois, o ideal é ter uma declaração única por linha, ajudando a trazer um padrão para a estrutura de declaração.
Com exceções de classes internas, busque sempre declarar uma classe por script, facilitando na divisão de responsabilidade entre eles.
E ao trabalhar com interfaces, é uma excelente prática adicionar a letra “i” maiúscula na frente para fácil identificação.
Espaçamento no código
Ao utilizarmos o Visual Studio Community, por padrão já vem definido um excelente espaçamento para seu código.
Então seguir e manter esse padrão já é bom o suficiente, contudo, iremos indicar alguns detalhes.
E começando pelos espaços entre os métodos, é necessário que seja de pelo menos uma linha.
Pois, assim teremos uma leitura mais agradável, inclusive dentro da própria função, pular uma linha ajudará.
E caso existam muitas partes lógicas dentro de uma só função, vale a pena distribui-la em mais funções.
Outro ponto é o uso das chaves, segundo a recomendação é bom deixarmos uma linha a parte para cada chave.
E mesmo tendo a opção de executar normalmente uma linha de código seguinte sem o uso das chaves.
É, por exemplo, melhor prática colocar sempre dentro das chaves, as linhas de comandos abaixo.
O uso de propriedades
Seguindo a Programação Orienta a Objetos, é uma péssima prática o uso de variáveis públicas em seus projetos.
E para tal, seria mais indicado usar variáveis privadas e fazer o uso de propriedades, encapsulando essas variáveis privadas.
E assim permitindo a você ter um maior controle sobre o acesso dessas variáveis declaradas.
Permitindo, por exemplo, até mesmo limitar o get ou o set, dessas variáveis com o uso de propriedades.
E caso precise ver essa variável no inspector, é preferível o uso de SerializeField, que mostrará uma variável privada.
Mas, como já dito, seguir essas recomendações, não é obrigatório caso trabalhe sozinho, porém, ajuda no costume.
Pois, caso venha a ter a necessidade de trabalhar com outras pessoas, você já estará adaptado com as melhores práticas.
Recomendações gerais para a codificação
Namespaces:
Agrupar blocos dos teus códigos em Namespaces é uma excelente prática, principalmente ao trabalhar em equipes.
Pois, evitará que ocorra conflitos entre as funções caso criem funções de mesmo nome, o que é bastante comum.
E então procure criar Namespaces cores (núcleos), e subdividir em Namespaces filhos para melhorar a organização.
Strings:
Evitar sempre que possível usar Strings nos teus códigos para buscar objetos na cena, funções no código, comparações, etc.
Pois, tem um custo alto no processamento, e ao buscar funções, por exemplo, seu código fica mais propenso a bugs.
Porque uma melhor opção no lugar de Invokes, seria o uso de Corrotinas para se inicializar funções com determinado tempo.
E também comandos como GameObject.Find + String, tem um custo altíssimo de processamento.
Pois, ele basicamente usa uma String e varre toda a hierarquia de objetos comparando os nomes até encontrar.
Debugs :
Um outro cuidado é necessário com relação a Debugs, pois, precisam ser utilizados apenas para fins de testes.
Porque em seu projeto final, esquecer um Debug rodando no seu código, pode trazer custos no processamento.
Por isso é importante sempre lembrar de retirar ou pelo menos comentar todos os Debugs de testes.
GetComponets:
Com relação ao uso de GetComponents, mesmo quando adicionados na função Start ou Awake, podem pesar.
E trazendo uma breve travada ao inicializar o jogo, a depender muito da quantidade de componentes que serão referenciados.
Mas é preciso evitar o máximo possível de usar em funções como Update, ou até mesmo, em grande quantidade.
Uma solução seria referenciar manualmente no inspector da Unity os componentes, otimizando ainda mais seu código.
Já que assim eles não serão inicializados ao começar o jogo, e durante a gameplay, utiliza-los em raras ocasiões.
Instantiates:
Instanciar objetos novos na cena durante a gameplay também é um comando que pesa no processamento.
E que quando usado em excesso, pode trazer sim uma perca de performance para seu jogo.
Por isso, o mais recomendado é usar a técnica de Object Pooling, que substitui perfeitamente o Instantiate.
Ou seja, fazendo o reaproveitamento de objetos no jogo, desta forma você não precisa nem criar e nem destrui-los.
E apenas reutilizar quando necessário, por exemplo, balas podem ser reaproveitadas após saírem da tela.
Singletons:
Evite o uso excessivo de Singletons em seu código, pois ele se torna muito mais inconsistente.
E apesar da facilidade que um Singleton nos dá, deixe para usos específicos como em Controladores, por exemplo.
Então busque sempre garantir que as classes Singletons sejam iniciadas primeiro, principalmente usando do Awake.
E adicionar variáveis e métodos staticos em Singletons, pode ajudar na fácil distribuição dos dados entre outras clases.
Em resumo, trouxemos neste artigo um compilado das melhores práticas e dicas a serem usadas em nossos códigos.
Vale a pena lembrar, que você não é obrigado a utilizar elas, mas sem dúvidas melhorarão em muito seus códigos.
E sem contar que para trabalhar em equipes e grandes empresas, sem dúvidas você fará uso destas práticas.
E com certeza vale muito a pena se aprofundar no estudo da programação Orientada a Objetos e Design Patterns.
Seja o primeiro a comentar.