Last active
January 13, 2026 20:55
-
-
Save sunmeat/bce1c19bd2bba7ee977995adbf596bb0 to your computer and use it in GitHub Desktop.
LSP bad example C#
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(); | |
| } | |
| } | |
| // інтерфейс генерації звітів | |
| 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 void LoadExcelLibrary() | |
| { | |
| // завантаження бібліотеки ExcelDataReader.dll 3.8.0 | |
| // помістіть ExcelDataReader.dll і ExcelDataReader.DataSet.dll у папку bin/Debug | |
| // або bin/Release вашого проєкту | |
| // або використовуйте NuGet для встановлення пакета ExcelDataReader | |
| // https://www.nuget.org/packages/exceldatareader/ | |
| // Install-Package ExcelDataReader -Version 3.8.0 | |
| Console.WriteLine("ExcelDataReader"); | |
| // ... | |
| } | |
| 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) | |
| { | |
| // !!! пряме порушення принципу Барбари Лисков !!! | |
| // початок костиля | |
| if (reporter is ExcelReporter excelReporter) | |
| { | |
| excelReporter.LoadExcelLibrary(); | |
| } | |
| // кінець костиля | |
| 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