# Guideline de programação C# Unity - Baziyo Level Maker
## Softwares Utilizados
- <img src="https://i.imgur.com/WQDm8RZ.png" alt="drawing" width="25"/> Rider 2021.1.2
- <img src="https://i.imgur.com/BXHlVDj.png" alt="drawing" width="25"/> Unity 2019.4.2f1
## Pacotes utilizados
No projeto tivemos a adição do package `2D Tilemap Extras` trazendo a Rule Tile para o projeto, essencial para a construção da fase.
## Guidelines
Para o projeto utilizamos a “C# Coding Conventions” disponibilizada pela própria Microsoft, as guidelines da própria Unity e o guia da raywenderlich que resume os dois em uma guideline que visa um código conciso, limpo e fácil de ler.
## Nomenclaturas
### Pascal Case
No código utilizamos PascalCase para Namespaces, Classe e Métodos, múltiplas palavras concatenadas conjuntamente, sem hífen ou underline, tendo como exceção a regra acrônimos como GUI ou HUD que podem ser em caixa alta.
###### `example`
``` C#
public struct ValueCoordinate { }
public record PhysicalAddress(
string Street,
string City,
string StateOrProvince,
string ZipCode);
public class DataService
```
Interfaces também utilizam a Pascal Case, mas devem ser acompanhadas do prefixo I para indifcar que é uma interface (ex : public interface IWorkerQueue ).
### Camel Case
A CamelCase é utilizada em todos os parâmetros e campos não estáticos de classes (o que inclui os campos públicos por convenção da Unity).
###### `example`
``` C#
public class MyClass
{
public int publicField;
int packagePrivate;
private int myPrivate;
protected int myProtected;
}
```
> -> Campos estáticos são a exceção e devem ser escritos em PascalCase
> ``` public static int ThatStaticVar; ```
## Declarações
### Campos e Variáveis
Ao declarar variáveis, declarações devem ser feitas linha a linha e não compactadas em uma linha só:
Evitar :
```C#
string username, twitterHandle;
```
Usar :
```C#
string username;
string twitterHandle;
```
### Classes
É recomendado que haja apenas uma classe em cada script, salvas excessões.
Interfaces
Todas as interfaces devem ser prefixidas com I :
```C#
(RadialSlider -> IRadialSlider)
```
## Espaçamento
### Identação
Utilizamos o tab (equivalente a 4 espaços) para identar o código.
### Quebra de linha
Identações de quebras de linha devem utilizar apenas um tab e não dois.
###### `example`
```C#
Evitar :
CoolUiWidget widget =
someIncrediblyLongExpression(that, reallyWouldNotFit, on, aSingle, line);
Utilizar :
CoolUiWidget widget =
someIncrediblyLongExpression(that, reallyWouldNotFit, on, aSingle, line);
```
### Linhas
Linhas não devem ter mais de 100 caracteres
### Espaçamento vertical
Métodos e funcionalidades diferentes dentro do mesmo método devem ser separados por 1 linha em branco. (Se um metódo tiver muitas funcionalidades diferentes, geralmente isso indica que novos métodos devem ser criados).
## Colchete
Seguindo a convenção das guidelines de C# cada colchete deve ter sua própria linha como no exemplo abaixo:
###### `example:`
```C#
void DoSomething()
{
if (someTest)
{
// ...
}
}
```
Mesmo argumentos condicionais que só utilizam uma devem utilizar colchetes para melhorar a sua visibilidade e seu entendimento
###### `example:`
```C#
if (bool) ChangeSomething( );
if (bool)
{
ChangeSomething( );
}
```
## Switch
Por padrão o switch deve acompanhar um default case, mas caso ele não seja atingido ou não seja necessário ele deve ser removido.
## Idioma
O código deve ser escrito e comentado em Inglês americano.