PatternsCSharpProgramming/Patterns/3_Принцип подстановки Барбары Лисков/Program.cs

127 lines
3.7 KiB
C#
Raw Normal View History

2024-10-05 09:15:54 +03:00
/*
* Глава 19: Принцип подстановки Барбары Лисков (SOLID SRP)
*
* Автор: Роберт Мартин (Дядя Боб)
*
* Сам принцип:
* - Пусть Q(x) является свойством, верным относительно объектов x некоторого
* типа T. Тогда Q(y) также должно быть верным для объектов y типа S, где S является подтипом T.
*
* или
*
* - Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом.
* Поведение классов-наследников не должно противоречить поведению, заданному базовым классом
*
* Принципы:
* 1. Single responsibility - принцип единственной ответственности
* 2. Open-closed - принцип открытости/закрытости
* 3. Liskov substitution - принцип подстановки Барбары Лисков (самый сложный)
* 4. Interface Segregation - принцип разделения интерфейса
* 5. Dependency inversion - принцип инверсии зависисмостей
*/
public class Coordinates
{
public int Longtitude { get; set; }
public int Latitude { get; set; }
public override string ToString()
{
return $"Широта: {Longtitude} Долгота: {Latitude}";
}
}
/// <summary>
/// Шаблон летающей птицы
/// </summary>
public class Bird
{
protected Random rand;
public Coordinates Position { get; set; }
protected int speed, spacing;
public int Spacing { get => spacing; }
public Bird()
{
Position = new Coordinates();
rand = new Random();
}
protected void Mark(int x, int y) { }
/// <summary>
/// Полёт птицы
/// </summary>
private void Fly()
{
speed = 1;
switch (rand.Next(2))
{
case 0: Position.Latitude += speed; break;
default: Position.Longtitude += speed; break;
}
spacing++;
Console.SetCursorPosition(Position.Latitude, Position.Longtitude);
Console.WriteLine("B");
}
/// <summary>
/// Движение птицы
/// </summary>
public virtual void Move()
{
Fly();
}
}
/// <summary>
/// Шаблон бегущей птицы
/// </summary>
public class Kiwi : Bird
{
private void Run()
{
speed = 1;
switch (rand.Next(2, 6))
{
case 3: Position.Latitude += speed; break;
default: Position.Longtitude += speed; break;
}
spacing++;
Console.SetCursorPosition(Position.Latitude, Position.Longtitude);
Console.WriteLine("K");
}
public override void Move()
{
Run();
}
}
/// <summary>
/// Шаблон отображеня движения
/// </summary>
class CalculatingDistance
{
private int time;
public CalculatingDistance(int time) { this.time = time; }
public void Calculate(Bird bird)
{
for (int i = 0; i < time; i++)
{
bird.Move();
}
Console.Title = ($"\n\n\nРасстояние: {bird.Spacing} {bird.Position}");
}
}
public class Program
{
public static void Main(string[] argv)
{
var bird = new Bird();
new CalculatingDistance(10).Calculate(bird);
var kiwi = new Kiwi();
new CalculatingDistance(10).Calculate(kiwi);
Console.ReadLine();
}
}