View difference between Paste ID: 05EM94QY and Syu6TLkm
SHOW: | | - or go back to the newest paste.
1
Good iPhone12 = new Good("IPhone 12");
2
Good iPhone11 = new Good("IPhone 11");
3
4
Warehouse warehouse = new Warehouse();
5
6
Shop shop = new Shop(warehouse);
7
8
warehouse.Delive(iPhone12, 10);
9
warehouse.Delive(iPhone11, 1);
10
11
//Вывод всех товаров на складе с их остатком
12
13
Cart cart = shop.Cart();
14
cart.Add(iPhone12, 4);
15
cart.Add(iPhone11, 3); //при такой ситуации возникает ошибка так, как нет нужного количества товара на складе
16
17
//Вывод всех товаров в корзине
18
19
Console.WriteLine(cart.Order().Paylink);
20
21
cart.Add(iPhone12, 9); //Ошибка, после заказа со склада убираются заказанные товары
22
23
24
public class Warehouse : IDeliveryWarehouse
25
{
26
    private readonly Dictionary<Good, int> _goods;
27
28-
    public Warehouse()
28+
    public Warehouse() =>    
29
        _goods = new(new GoodEqualityCompare());
30
    
31
32
    public void Delive(Good good, int countGoods)
33
    {
34
        good = good ?? throw new ArgumentNullException();
35
36
        if (countGoods < 0)
37
            throw new ArgumentOutOfRangeException();
38
39
        if (_goods.ContainsKey(good) == false)
40
            _goods[good] = 0;
41
42
        _goods[good] += countGoods;
43
    }
44
45
    public bool CanIssue(Good good, int countGoods)
46
    {
47
        good = good ?? throw new ArgumentNullException();
48
49
        if (countGoods < 0)
50
            throw new ArgumentOutOfRangeException();
51
52
        if (_goods.TryGetValue(good, out int count) == false)
53
            return false;
54
            
55
        return count >= countGoods;        
56
    }
57
58
    public void TransferForDelivery(Good good, int countGoods)
59
    {
60
        good = good ?? throw new ArgumentNullException();
61
62
        if (countGoods < 0)
63
            throw new ArgumentOutOfRangeException();
64
65
        if (_goods.ContainsKey(good) == false || _goods[good] < countGoods)
66
            throw new ArgumentOutOfRangeException();
67
        
68
        _goods[good] -= countGoods;
69
    }
70
}
71
72
public class Shop
73
{
74
    private readonly Warehouse _warehouse;
75
76
    public Shop(Warehouse warehouse) =>
77
        _warehouse = warehouse ?? throw new ArgumentNullException();
78-
    public Shop(Warehouse warehouse) => _warehouse = warehouse ?? throw new ArgumentNullException();
78+
79
    public Cart Cart() =>
80-
    public Cart Cart()
80+
         new Cart(_warehouse);    
81
}
82-
        return new Cart(_warehouse);
82+
83
public class Cart
84
{
85
    private readonly Dictionary<Good, int> _goods;
86
    private readonly IDeliveryWarehouse _warehouse;
87
88
    public Cart(IDeliveryWarehouse warehouse) 
89
    {
90
        _warehouse = warehouse ?? throw new ArgumentNullException();
91
92
        GoodEqualityCompare goodEqualityCompare = new();
93
        _goods = new(goodEqualityCompare);
94
    }
95
96
    public void Add(Good good, int countGoods)
97
    {
98
        good = good ?? throw new ArgumentNullException();
99
100
        if (countGoods < 0)
101
            throw new ArgumentOutOfRangeException();
102
103
        if (_warehouse.CanIssue(good, countGoods) == false)
104
            throw new InvalidOperationException();
105
106
        if (_goods.ContainsKey(good) == false)
107
            _goods[good] = 0;
108
109
        _goods[good] += countGoods;          
110
    }
111
112
    public PayOrder Order()
113
    {
114
        foreach(var goods in _goods)
115
        {
116
            _warehouse.TransferForDelivery(goods.Key, goods.Value);
117
        }
118
119
        _goods.Clear();
120
121
        return new PayOrder();
122
    }
123
}
124
125
public class Good
126
{
127
    public Good(string name)
128
    {
129
        if (string.IsNullOrEmpty(name))
130
            throw new ArgumentNullException();
131
132
        Name = name;
133
    }
134
135
    public string Name { get; }
136
}
137
138
public class PayOrder
139
{
140
    public PayOrder() { }
141
142
    public string Paylink { get; }
143
}
144
145
public interface IDeliveryWarehouse
146
{
147
    public bool CanIssue(Good good, int countGoods);
148
149
    public void TransferForDelivery(Good good, int countGoods);
150
}
151
152
public class GoodEqualityCompare : IEqualityComparer<Good>
153
{
154
    public bool Equals(Good? good1, Good? good2)
155
    {
156
        if (ReferenceEquals(good1, good2)) 
157
            return true;
158
159
        if (good1 == null || good2 == null)
160
            return false;
161
162
        return good1.Name == good2.Name;
163
    }
164
165
    public int GetHashCode(Good good) => 
166
        good.Name.GetHashCode();
167-
    public int GetHashCode(Good good) => good.Name.GetHashCode();
167+