1. SOLID (5 принципів)
S - Single Responsibility Principle (SRP)
Кожен клас відповідає лише за одну відповідальність:
- Money – зберігає інформацію про гроші.
- Product – представляє товар.
- WarehouseItem – містить інформацію про товар на складі.
- Warehouse – керує складом.
- Reporting – відповідає за генерацію звітів.
- Cart – управляє кошиком покупок.
O - Open/Closed Principle (OCP)
Класи розширюються, але не змінюються. Наприклад, якщо потрібно додати нову валюту, достатньо створити новий клас(наприклад USD), що реалізує ICurrency.
L - Liskov Substitution Principle (LSP)
Об'єкти підкласів можуть використовуватись замість батьківського класу без змін у коді. Наприклад, EUR та USD можуть замінювати ICurrency.
I - Interface Segregation Principle (ISP)
Кожен інтерфейс містить лише необхідні методи. Наприклад, замінювати ICurrency має тільки властивості Symbol і Name, без зайвих методів.
D - Dependency Inversion Principle (DIP)
Використання ICurrency дозволяє коду працювати із будь-якими валютами без прив'язки до конкретних класів USD або EUR.
2. DRY (Don't Repeat Yourself)
В коді уникається дублювання логіки:
- Money використовується у Product замість дублювання інформації про ціну.
- WarehouseItem і Cart працюють із Product, не дублюючи атрибути товару.
3. KISS (Keep It Simple, Stupid)
Код простий і зрозумілий:
- Кожен клас має чітко визначену роль.
- Мінімум складних конструкцій, методи логічно організовані.
- Використано зрозумілі назви змінних і методів.
4. YAGNI (You Ain't Gonna Need It)
В коді немає зайвого функціоналу, лише те, що потрібно:
- Наприклад, у Warehouse відсутні складні логістичні функції, поки вони не знадобляться.
- Cart реалізує лише базові операції додавання та видалення товару.
5. Composition Over Inheritance
Класи використовують композицію, а не наслідування:
- WarehouseItem містить Product, а не наслідується від нього.
- Cart використовує Dictionary<Product, int> замість створення окремого класу для кожного типу товару.
6. Program to Interfaces, not Implementations
- Money працює з ICurrency, а не з конкретними валютами (USD, EUR).
- Warehouse та Reporting використовують об'єкти класу WarehouseItem і Product, не залежачи від конкретних реалізацій.
7. Fail Fast
Код одразу перевіряє неправильні вхідні дані:
- Money перевіряє, чи wholePart і cents не є від’ємними.
- WarehouseItem.AddStock() і RemoveStock() перевіряють, чи кількість товару коректна.
- WarehouseItem кидає ArgumentNullException, якщо передано null.