Ein C# .NET 8.0 Projekt mit praktischen Übungen zu den SOLID-Prinzipien der objektorientierten Programmierung.
Dieses Repository enthält sechs verschiedene Übungen, die jeweils eines der SOLID-Prinzipien demonstrieren. Jede Übung zeigt sowohl die problematische Implementierung als auch die verbesserte Lösung nach den SOLID-Prinzipien.
- S - Single Responsibility Principle (SRP)
- O - Open/Closed Principle (OCP)
- L - Liskov Substitution Principle (LSP)
- I - Interface Segregation Principle (ISP)
- D - Dependency Inversion Principle (DIP)
- .NET 8.0 SDK oder höher
- Visual Studio 2022 oder Visual Studio Code
- C# Entwicklungsumgebung
Problem: Die Exersise1_Invoice
Klasse hat mehrere Verantwortlichkeiten - Rechnung generieren, speichern und drucken.
Lösung: Aufteilen in separate Klassen:
InvoiceService
- Rechnung generierenInvoiceRepository
- Rechnung speichernInvoicePrintPdfService
- Rechnung drucken
Dateien:
Exersise1/Exersise1.cs
(Problem)Exersise1/InvoiceService.cs
(Lösung)Exersise1/InvoiceRepository.cs
(Lösung)Exersise1/InvoicePrintPDFService.cs
(Lösung)
Problem: Die Exersise2_ShapeAreaCalculator
Klasse muss für jede neue Form modifiziert werden.
Lösung: Verwendung von Interfaces und Polymorphismus:
IShape
Interface mitCalculateArea()
Methode- Jede Form implementiert
IShape
ShapeAreaCalculator
arbeitet mit dem Interface
Dateien:
Exersise2/Exersise2.cs
(Problem)Exersise2/IShape.cs
(Lösung)Exersise2/Circle.cs
,Rectangle.cs
,Square.cs
(Implementierungen)Exersise2/ShapeAreaCalculator.cs
(Verbesserte Lösung)
Problem: Die Exersise3_DiscountCalculator
Klasse verwendet String-Vergleiche für verschiedene Kundentypen.
Lösung: Vererbungshierarchie mit korrekter Substitution:
ICustomerType
InterfaceRegularCustomer
,PremiumCustomer
,NoDiscountCustomer
ImplementierungenCustomerTypeFactory
für Objekterstellung
Dateien:
Exersise3/Exersise3.cs
(Problem)Exersise3/ICustomerType.cs
(Interface)Exersise3/RegularCustomer.cs
,PremiumCustomer.cs
(Implementierungen)Exersise3/DiscountCalculator.cs
(Verbesserte Lösung)
Problem: Die Exersise4_ElectricEngine
Klasse verletzt LSP durch Werfen einer Exception.
Lösung: Korrekte Vererbungshierarchie:
Bird
BasisklasseIFlyable
Interface für flugfähige VögelEagle
implementiertIFlyable
Penguin
implementiert nurBird
Dateien:
Exersise4/Exersise4.cs
(Problem)Exersise4/Bird.cs
,IFlyable.cs
(Lösung)Exersise4/Eagle.cs
,Penguin.cs
(Implementierungen)
Problem: Das Exersise5_IDevice
Interface zwingt Klassen dazu, Methoden zu implementieren, die sie nicht benötigen.
Lösung: Aufteilen in spezifische Interfaces:
IPrintDevice
- für DruckfunktionalitätIScanDevice
- für ScanfunktionalitätIFaxDevice
- für Faxfunktionalität
Dateien:
Exersise5/Exersise5.cs
(Problem)Exersise5/IPrintDevice.cs
,IScanDevice.cs
,IFaxDevice.cs
(Spezifische Interfaces)Exersise5/SimplePrinter.cs
(Implementierung)
Problem: Die Exersise6_OrderService
Klasse ist direkt von einer konkreten Datenbankimplementierung abhängig.
Lösung: Abhängigkeiten umkehren durch Interfaces:
IOrderRespository
Interface definierenOrderRepository
implementiert das InterfaceOrderService
verwendet Dependency Injection
Dateien:
Exersise6/Exersise6.cs
(Problem)Exersise6/IOrderRespository.cs
(Interface)Exersise6/OrderRepository.cs
(Implementierung)Exersise6/OrderService.cs
(Verbesserte Lösung)
SolidExcersises/
├── SolidExcersises.sln
├── SolidExcersises/
│ ├── SolidExcersises.csproj
│ ├── Program.cs
│ ├── Exersise1/ # Single Responsibility Principle
│ ├── Exersise2/ # Open/Closed Principle
│ ├── Exersise3/ # Liskov Substitution Principle
│ ├── Exersise4/ # Liskov Substitution Principle (Vererbung)
│ ├── Exersise5/ # Interface Segregation Principle
│ └── Exersise6/ # Dependency Inversion Principle