Реализация и тесты
Реализуйте Rectangle, Circle и Triangle, добавьте базовые проверки входных данных и напишите небольшие тесты без использования фреймворка.
«Реализация и тесты» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
План реализации
Цель: реализовать фигуры и проверить их.
- Реализуйте Rectangle, Circle, Triangle
- Защитите код от недопустимых входных данных
- Добавьте небольшой вспомогательный класс Assert
- Выполните быстрые проверки в Main
Прямоугольник и окружность
Добавьте в конструкторы простые проверки, чтобы размеры были положительными. Формулы должны оставаться небольшими и понятными.
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());
}
}
Треугольник с проверками
Проверьте стороны (неравенство треугольника). Используйте известную формулу и записывайте числа понятно.
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());
}
}
Вспомогательный класс Assert
Создайте небольшой класс Assert. Сравнивайте ожидаемое и фактическое значения с допуском для чисел 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");
}
}
Быстрые проверки
Объедините несколько проверок в Main. Ожидаемые результаты должны быть простыми и понятными.
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");
}
}
Советы по реализации
Контрольный список:
- Проверяйте входные данные в конструкторах.
- Делайте формулы короткими и используйте локальные константы для числа пи.
- Создайте небольшой Assert для разовых проверок.
- Проверяйте и Area, и Perimeter каждой фигуры.
Идея разовой проверки
Повторение
Повторение: реализуйте фигуры с понятными проверками, а затем проверьте их с помощью минимального вспомогательного класса Assert в Main. Проверки должны быть небольшими и детерминированными.
Часто задаваемые вопросы
Урок «Реализация и тесты» бесплатный?
Да — полный текст урока «Реализация и тесты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.
Чему я научусь в уроке «Реализация и тесты»?
Реализуйте Rectangle, Circle и Triangle, добавьте базовые проверки входных данных и напишите небольшие тесты без использования фреймворка. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Реализация и тесты»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проектирование (интерфейсы и наследование)
- Реализация и тесты
- Полиморфное поведение