127 lines
3.7 KiB
C#
127 lines
3.7 KiB
C#
/*
|
||
* Глава 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();
|
||
}
|
||
} |