Last active
January 13, 2026 18:59
-
-
Save sunmeat/881392549fb99a21094893814f9870e4 to your computer and use it in GitHub Desktop.
OCP bad example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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