Skip to content

Instantly share code, notes, and snippets.

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

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

Select an option

Save sunmeat/881392549fb99a21094893814f9870e4 to your computer and use it in GitHub Desktop.
OCP bad example
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();
}
}
class ReportManager
{
// формування звітів
public void PrintOnConsole(Order order)
{
Console.WriteLine("Друк звіту в консолі:");
foreach (var item in order.GetItems())
{
Console.WriteLine($"{item.Name}: {item.Price}");
}
}
// !!! уявімо, що замовник попросив додати генерацію документів у різних форматах
public void GeneratePDF(Order order)
{
Console.WriteLine("PDF-звіт згенеровано.");
}
public void GenerateExcel(Order order)
{
Console.WriteLine("Excel-звіт згенеровано.");
}
public void GenerateTextFile(Order order)
{
Console.WriteLine("Текстовий звіт згенеровано.");
}
}
// але! згідно з ідеологією SOLID,
// клас, який добре спроєктований, не потребує редагування!
// а додавання методів — це зміна класу,
// яка спричинить нові тести та нові проблеми...
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
// до речі, подумайте, як поточна версія класу ReportManager співвідноситься з принципом SRP ;)
var product = new Product { Name = "Книга", Price = 200m };
var order = new Order();
order.AddItem(product);
order.Calculate();
var reportManager = new ReportManager();
reportManager.PrintOnConsole(order);
reportManager.GeneratePDF(order);
reportManager.GenerateExcel(order);
reportManager.GenerateTextFile(order);
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