-
-
Save GigaOrts/30b829790aaaa1a238affa90d9ee7553 to your computer and use it in GitHub Desktop.
This file contains 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; | |
using System.Collections.Generic; | |
using System.Linq; | |
internal class Program | |
{ | |
static void Main(string[] args) | |
{ | |
Good iPhone12 = new Good("IPhone 12"); | |
Good iPhone11 = new Good("IPhone 11"); | |
Warehouse warehouse = new Warehouse(); | |
Shop shop = new Shop(warehouse); | |
warehouse.Delive(iPhone12, 10); | |
warehouse.Delive(iPhone11, 1); | |
//Вывод всех товаров на складе с их остатком | |
warehouse.ShowInfo(); | |
// Решение | |
Cart cart = shop.Cart(); | |
cart.Add(iPhone12, 4); | |
cart.Add(iPhone11, 3); //при такой ситуации возникает ошибка так, как нет нужного количества товара на складе | |
//Вывод всех товаров в корзине | |
cart.ShowInfo(); | |
// Решение | |
Console.WriteLine(cart.Order().Info); | |
cart.Add(iPhone12, 9); //Ошибка, после заказа со склада убираются заказанные товары | |
} | |
} | |
class Cart | |
{ | |
private readonly Shop _shop; | |
private readonly List<Slot> _goods; | |
public Cart(Shop shop) | |
{ | |
_shop = shop; | |
_goods = new List<Slot>(); | |
} | |
public void Add(Good item, int count) | |
{ | |
Slot slot = _shop.Remove(item, count); | |
foreach (Slot slotToFind in _goods) | |
{ | |
if (slotToFind.Item.Name == item.Name) | |
{ | |
slotToFind.Merge(count); | |
return; | |
} | |
} | |
_goods.Add(slot); | |
} | |
public Order Order() | |
{ | |
return new Order(_goods); | |
} | |
public void ShowInfo() | |
{ | |
Console.WriteLine($"Товары в корзине: "); | |
foreach (Slot slot in _goods) | |
{ | |
Console.WriteLine($"{slot.Item.Name} - {slot.Count}"); | |
} | |
} | |
} | |
class Order | |
{ | |
readonly List<Slot> _goods; | |
public Order(List<Slot> goods) | |
{ | |
_goods = goods; | |
Info = $"Куплено всего {_goods.Count} разновидности товара в количестве {_goods.Sum(slot => slot.Count)} штук"; | |
} | |
public string Info { get; private set; } | |
} | |
class Shop | |
{ | |
private readonly List<Slot> _goods; | |
public Shop(Warehouse warehouse) | |
{ | |
_goods = new List<Slot>(); | |
warehouse.SetShop(this); | |
} | |
public IReadOnlyList<Slot> Goods => _goods; | |
public Cart Cart() | |
{ | |
return new Cart(this); | |
} | |
public void Add(Good item, int count) | |
{ | |
foreach (Slot slot in _goods) | |
{ | |
if (slot.Item.Name == item.Name) | |
{ | |
slot.Merge(count); | |
return; | |
} | |
} | |
_goods.Add(new Slot(item, count)); | |
} | |
public Slot Remove(Good item, int count) | |
{ | |
foreach (Slot slot in _goods) | |
{ | |
if (slot.Item.Name == item.Name && slot.Count >= count) | |
{ | |
Slot slotToSell = new Slot(item, count); | |
slot.Remove(count); | |
return slotToSell; | |
} | |
} | |
throw new ArgumentOutOfRangeException(nameof(count)); | |
} | |
} | |
class Warehouse | |
{ | |
private Shop _shop; | |
public Warehouse SetShop(Shop shop) | |
{ | |
_shop = shop; | |
return this; | |
} | |
public void Delive(Good item, int count) | |
{ | |
_shop.Add(item, count); | |
} | |
public void ShowInfo() | |
{ | |
Console.WriteLine($"Товары на складе магазина: "); | |
foreach (Slot slot in _shop.Goods) | |
{ | |
Console.WriteLine($"{slot.Item.Name} - {slot.Count}"); | |
} | |
} | |
} | |
class Slot | |
{ | |
public Slot(Good item, int count) | |
{ | |
Item = item; | |
Count = count; | |
} | |
public Good Item { get; private set; } | |
public int Count { get; private set; } | |
public void Remove(int count = 1) | |
{ | |
if (Count > 0) | |
Count -= count; | |
} | |
public void Merge(int count) | |
{ | |
Count += count; | |
} | |
} | |
class Good | |
{ | |
public Good(string name) | |
{ | |
Name = name; | |
} | |
public string Name { get; private set; } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment