PatternsCSharpProgramming/Patterns/3_Принцип подстановки Барбары Лисков/Program.cs
Dvurechensky 3a28caed27 1.0
Main
2024-10-05 09:15:54 +03:00

127 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Глава 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();
}
}