Skip to content

Instantly share code, notes, and snippets.

@GigaOrts
Forked from HolyMonkey/Store.cs
Created August 11, 2023 22:18
Show Gist options
  • Save GigaOrts/30b829790aaaa1a238affa90d9ee7553 to your computer and use it in GitHub Desktop.
Save GigaOrts/30b829790aaaa1a238affa90d9ee7553 to your computer and use it in GitHub Desktop.
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