Implementação e testes
Implemente Rectangle, Circle e Triangle; adicione verificações básicas de entrada; escreva pequenos testes improvisados sem um framework.
Implementação e testes é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.
Plano de implementação
Objetivo: Implemente formas geométricas e verifique-as.
- Implemente Rectangle, Circle, Triangle
- Impeça entradas inválidas
- Adicione um pequeno auxiliar Assert
- Execute verificações rápidas em Main
Rectangle e Circle
Add verificações simples nos construtores para que as dimensões sejam positivas. Mantenha as fórmulas pequenas e claras.
using System;
public interface IShape
{
double Area();
double Perimeter();
}
public sealed class Rectangle : IShape
{
private readonly double _w, _h;
public Rectangle(double w, double h)
{
if (w <= 0 || h <= 0) throw new ArgumentOutOfRangeException("w/h must be > 0");
_w = w; _h = h;
}
public double Area() { return _w * _h; }
public double Perimeter() { return 2 * (_w + _h); }
}
public sealed class Circle : IShape
{
private readonly double _r;
public Circle(double r)
{
if (r <= 0) throw new ArgumentOutOfRangeException("r must be > 0");
_r = r;
}
public double Area() { return 3.14159 * _r * _r; }
public double Perimeter() { return 2 * 3.14159 * _r; }
}
public class Program
{
public static void Main(string[] args)
{
IShape a = new Rectangle(3, 4);
IShape b = new Circle(2);
Console.WriteLine("Rect A=" + a.Area() + " P=" + a.Perimeter());
Console.WriteLine("Circ A=" + b.Area() + " P=" + b.Perimeter());
}
}
Triangle com verificações
Valide os lados (desigualdade triangular). Use uma fórmula conhecida e mantenha os números legíveis.
using System;
public interface IShape
{
double Area();
double Perimeter();
}
public sealed class Triangle : IShape
{
private readonly double _a, _b, _c;
public Triangle(double a, double b, double c)
{
if (a <= 0 || b <= 0 || c <= 0) throw new ArgumentOutOfRangeException("sides must be > 0");
// triangle inequality: each side < sum of other two
if (a >= b + c || b >= a + c || c >= a + b) throw new ArgumentException("invalid triangle");
_a = a; _b = b; _c = c;
}
public double Perimeter() { return _a + _b + _c; }
// Herons formula for area
public double Area()
{
double s = (_a + _b + _c) / 2.0;
double value = s * (s - _a) * (s - _b) * (s - _c);
return Math.Sqrt(value);
}
}
public class Program
{
public static void Main(string[] args)
{
IShape t = new Triangle(3, 4, 5);
Console.WriteLine("Tri A=" + t.Area() + " P=" + t.Perimeter());
}
}
Auxiliar Assert improvisado
Crie uma pequena classe Assert. Compare o esperado com o obtido usando uma tolerância para valores double.
using System;
public static class Assert
{
// Approx compare for doubles (tolerance)
public static void AreClose(double expected, double actual, double eps, string msg)
{
if (Math.Abs(expected - actual) > eps)
{
throw new Exception("Assert failed: " + msg + " expected=" + expected + " actual=" + actual);
}
Console.WriteLine("OK: " + msg);
}
}
public interface IShape
{
double Area();
double Perimeter();
}
public sealed class Rectangle : IShape
{
private readonly double _w, _h;
public Rectangle(double w, double h) { if (w <= 0 || h <= 0) throw new ArgumentOutOfRangeException(); _w = w; _h = h; }
public double Area() { return _w * _h; }
public double Perimeter() { return 2 * (_w + _h); }
}
public class Program
{
public static void Main(string[] args)
{
Rectangle r = new Rectangle(3, 4);
Assert.AreClose(12.0, r.Area(), 0.0001, "rectangle area");
Assert.AreClose(14.0, r.Perimeter(), 0.0001, "rectangle perimeter");
}
}
Run testes rápidos
Agrupe alguns testes em Main. Mantenha as expectativas simples e legíveis.
using System;
public static class Assert
{
public static void AreClose(double expected, double actual, double eps, string msg)
{
if (Math.Abs(expected - actual) > eps)
throw new Exception("Assert failed: " + msg + " expected=" + expected + " actual=" + actual);
Console.WriteLine("OK: " + msg);
}
}
public interface IShape
{
double Area();
double Perimeter();
}
public sealed class Circle : IShape
{
private readonly double _r;
public Circle(double r) { if (r <= 0) throw new ArgumentOutOfRangeException(); _r = r; }
public double Area() { return 3.14159 * _r * _r; }
public double Perimeter() { return 2 * 3.14159 * _r; }
}
public sealed class Triangle : IShape
{
private readonly double _a, _b, _c;
public Triangle(double a, double b, double c)
{
if (a <= 0 || b <= 0 || c <= 0) throw new ArgumentOutOfRangeException();
if (a >= b + c || b >= a + c || c >= a + b) throw new ArgumentException("invalid triangle");
_a = a; _b = b; _c = c;
}
public double Perimeter() { return _a + _b + _c; }
public double Area()
{
double s = (_a + _b + _c) / 2.0;
return Math.Sqrt(s * (s - _a) * (s - _b) * (s - _c));
}
}
public class Program
{
public static void Main(string[] args)
{
double eps = 0.001;
Circle c = new Circle(2);
Assert.AreClose(12.56636, c.Area(), eps, "circle area r=2");
Assert.AreClose(12.56636, c.Perimeter(), eps, "circle peri r=2");
Triangle t = new Triangle(3, 4, 5);
Assert.AreClose(12.0, t.Perimeter(), eps, "triangle perimeter 3-4-5");
Assert.AreClose(6.0, t.Area(), eps, "triangle area 3-4-5");
}
}
Dicas de implementação
Lista de verificação:
- Valide as entradas nos construtores.
- Mantenha as fórmulas curtas; use constantes locais para pi.
- Crie um pequeno Assert para testes improvisados.
- Teste Area e Perimeter para cada forma geométrica.
Ideia para testes improvisados
Recapitulação
Recapitulação: Implemente formas geométricas com verificações claras e depois valide-as com um auxiliar Assert mínimo em Main. Mantenha os testes pequenos e determinísticos.
Perguntas Frequentes
A aula “Implementação e testes” é grátis?
Sim — o texto completo de “Implementação e testes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.
O que vou aprender em “Implementação e testes”?
Implemente Rectangle, Circle e Triangle; adicione verificações básicas de entrada; escreva pequenos testes improvisados sem um framework. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 3.
Quanto tempo leva a aula “Implementação e testes”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Design (interfaces e herança)
- Implementação e testes
- Comportamentos polimórficos