Abaixo estão os desafios que cumpri.
Parabéns, você recebeu de herança uma fazenda! 🚜🐄🐖
Entretanto, você não tem controle sobre os animais da fazenda, e depois de um mês tentando administrar tudo, percebe que está uma absoluta desordem!
Com isso, você decide usar seus conhecimentos em C# para organizar os diferentes tipos de animal em classes, para que assim consiga se organizar melhor.
Primeiramente, vamos ao gado!
A classe Cow
deve possuir uma propriedade pública Id
do tipo Guid
com o valor padrão de Guid.NewGuid();
Todos os animais da propriedade deverão possuir identificadores únicos. Por esse motivo vamos usar o tipo Guid
para declarar a propriedade que conterá esses Ids.
Se quiser saber mais sobre a estrutura
Guid
, nativa do C#, consulte a documentação.
A classe Cow
deve possuir uma propriedade pública Weight
do tipo int
Você também precisa saber o peso de cada uma das vacas, então atribua um peso com int
.
A classe Cow
deve possuir uma propriedade pública Breed
do tipo string
Você também precisa saber qual a raça de cada uma das vacas para depois poder organizar o pasto. Atribua o nome da raça em uma string
.
A classe Cow
deve possuir um construtor público que receba todos os valores das propriedades como parâmetros, exceto o Id
Os valores dos parâmetros devem ter a mesma ordem das propriedades elencadas nesse requisito.
O construtor da classe Cow
deve validar e atribuir os valores das propriedades
A atribuição deve ocorrer no corpo do construtor para que ocorra no momento da inicialização dos objetos.
Caso seja passado um Weight
menor ou igual a zero ou uma Breed
que seja uma string
nula ou vazia, o construtor deve lançar uma ArgumentException
.
Pronto, os bovinos já estão devidamente organizados. 🐮
Agora é a vez dos porcos!
A classe Pig
deve possuir uma propriedade pública Id
do tipo Guid
com o valor padrão de Guid.NewGuid();
Assim como com as vacas, deve ser possível atribuir um Id
único para cada porco.
Se quiser saber mais sobre a estrutura
Guid
, nativa do C#, consulte a documentação.
A classe Pig
deve possuir uma propriedade pública Age
do tipo int
Temos muitos porcos jovens e idosos na fazenda. Atribuindo uma idade podemos organizá-los melhor.
A classe Pig
deve possuir um construtor público que receba a idade do porco como parâmetro
A idade deve ser atribuída ao parâmetro correto.
O construtor da classe Pig
deve validar e atribuir os valores das propriedades
A atribuição deve ocorrer no corpo do construtor para que ocorra no momento da inicialização dos objetos.
Caso seja passado um Age
menor que zero, o construtor deve lançar uma ArgumentException
.
Agora já organizamos os bovinos e suínos. 🐮🐷
Agora é a vez das galinhas!
A classe Chicken
deve possuir uma propriedade pública Id
do tipo Guid
com o valor padrão de Guid.NewGuid();
Assim como com as vacas e porcos, deve ser possível atribuir um Id
único para cada galinha.
Se quiser saber mais sobre a estrutura
Guid
, nativa do C#, consulte a documentação.
A classe Chicken
deve possuir uma propriedade pública EggsPerWeek
do tipo int
Precisamos saber quais galinhas são mais produtivas e quantas podem estar com algum problema de saúde. Uma boa métrica para isso é a quantidade de ovos por semana.
A classe Chicken
deve possuir uma propriedade pública Mother
do tipo Chicken?
Você achou que seria uma boa ideia traçar a genealogia materna das galinhas. Por isso, cada galinha poderá ter uma mãe atribuída, caso a mãe também seja parte da sua granja.
Caso contrário, o valor da mãe pode permanecer como null
. Inclusive é por isso que usamos a interrogação após o tipo Chicken
: ela permite atribuir o valor null
a tipos de referência que normalmente não poderiam ser nulos.
A classe Chicken
deve possuir um construtor público que receba todos os valores das propriedades como parâmetros, exceto o Id
Os valores dos parâmetros devem ter a mesma ordem das propriedades elencadas nesse requisito. Além disso, o parâmetro mother não precisa ser anulável, podendo ter o tipo Chicken
sem a interrogação.
A classe Chicken
deve possuir, em paralelo, outro construtor público que receba o EggsPerWeek
como parâmetro, mas que não receba nem o Mother
nem o Id
Nesse caso, não será necessário atribuir um valor à propriedade Mother, que deverá permanecer nula.
Ambos os construtores da classe Chicken
devem validar e atribuir os valores da propriedade EggsPerWeek
A atribuição deve ocorrer no corpo do construtor para que ocorra no momento da inicialização dos objetos.
Caso seja passado um EggsPerWeek
menor que zero, o construtor deve lançar uma ArgumentException
.
Parabéns, você separou classes para todos os animais da fazenda. 🐮🐷🐔
Mas o trabalho ainda não acabou!
Agora precisamos ter certeza de que tudo ocorreu bem, então vamos aos Testes usando xUnit
e FluentAssertions
!
Os testes devem ser criados na pasta farm-classes.Test
, nos arquivos já criado para esse fim
Os arquivos dos testes são ChickenTest.cs
, CowTest.cs
e PigTest.cs
.
O CowTest
deve testar se a classe Cow
possui um construtor válido que atribui corretamente as propriedades Weight
e Breed
O teste deve verificar:
- se o valor das propriedades é igual ao passado no construtor,
- se é lançada uma
ArgumentException
quando a classe recebe umWeight
menor ou igual a zero - se é lançada uma
ArgumentException
quando a classe recebe umaBreed
nula ou vazia
O PigTest
deve testar se a classe Pig
possui um construtor válido que atribui corretamente a propriedade Age
O teste deve verificar:
- se o valor da
Age
é igual ao passado no construtor, - se é lançada uma
ArgumentException
quando a classe recebe umaAge
negativa
O ChickenTest
deve testar se a classe Chicken
possui um construtor válido que atribui corretamente as propriedades EggsPerWeek
e, quando for o caso, Mother
O teste deve verificar:
- se o valor das propriedades é igual ao passado no construtor,
- se é possível instanciar a classe com e sem uma
Mother
- se é lançada uma
ArgumentException
quando a classe recebe umEggsPerWeek
negativo
Agora sim, pode respirar fundo! Sua fazenda está muito mais gerenciável e as coisas estão começando a se encaixar!