Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active January 13, 2026 20:21
Show Gist options
  • Select an option

  • Save sunmeat/a81a15055d6e690132e9aa8ea2150e4c to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/a81a15055d6e690132e9aa8ea2150e4c to your computer and use it in GitHub Desktop.
OCP nice example C#
using System.Text;
class Product
{
public string? Name { get; set; }
public decimal Price { get; set; }
}
class Order
{
private List<Product> items = new List<Product>();
// робота з замовленням
public void Calculate()
{
decimal total = 0;
foreach (var item in items)
{
total += item.Price;
}
Console.WriteLine($"Загальна сума: {total}");
}
public void AddItem(Product product)
{
items.Add(product);
Console.WriteLine("Елемент додано!");
}
public Product[] GetItems()
{
return items.ToArray();
}
}
// інтерфейс генерації звітів !!!
interface IReportable
{
string GenerateReport(Order order);
}
// генерація pdf-звіту
class PDFReporter : IReportable
{
public string GenerateReport(Order order)
{
var data = "Звіт PDF\n";
data += "------------\n";
decimal total = 0;
foreach (var item in order.GetItems())
{
data += $"{item.Name}: {item.Price}\n";
total += item.Price;
}
data += $"Загальна сума: {total}\n";
return data;
}
}
// генерація excel-звіту
class ExcelReporter : IReportable
{
public string GenerateReport(Order order)
{
var data = "Звіт Excel\n";
data += "-----------\n";
decimal total = 0;
foreach (var item in order.GetItems())
{
data += $"{item.Name}\t{item.Price}\n";
total += item.Price;
}
data += $"Загальна сума\t{total}\n";
return data;
}
}
// готовий клас, в який зміни вносити більше не доведеться
class PrintManager
{
public void Print(Order order, IReportable reporter)
{
Console.WriteLine(reporter.GenerateReport(order));
}
}
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
var product1 = new Product { Name = "Книга", Price = 200m };
var product2 = new Product { Name = "Зошит", Price = 50m };
var order = new Order();
order.AddItem(product1);
order.AddItem(product2);
order.Calculate();
var printManager = new PrintManager();
var pdfReporter = new PDFReporter();
printManager.Print(order, pdfReporter);
var excelReporter = new ExcelReporter();
printManager.Print(order, excelReporter);
var items = order.GetItems();
Console.WriteLine($"Кількість елементів: {items.Length}");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment