View difference between Paste ID: Syu6TLkm and rUF8gS35
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()
29
    {
30
        GoodEqualityCompare goodEqualityCompare = new();
31
        _goods = new(goodEqualityCompare);
32
    }
33
34
    public void Delive(Good good, int countGoods)
35
    {
36
        good = good ?? throw new ArgumentNullException();
37
38
        if (countGoods < 0)
39
            throw new ArgumentOutOfRangeException();
40
41-
        if (_goods.ContainsKey(good))
41+
        if (_goods.ContainsKey(good) == false)
42-
            _goods[good] += countGoods;
42+
            _goods[good] = 0;
43-
        else
43+
44-
            _goods.Add(good, countGoods);
44+
        _goods[good] += countGoods;
45
    }
46
47
    public bool CanIssue(Good good, int countGoods)
48
    {
49
        good = good ?? throw new ArgumentNullException();
50
51
        if (countGoods < 0)
52
            throw new ArgumentOutOfRangeException();
53
54-
        if (_goods.TryGetValue(good, out int count))
54+
        if (_goods.TryGetValue(good, out int count) == false)
55-
            return count >= countGoods;
55+
56-
        else
56+
            
57
        return count >= countGoods;        
58
    }
59
60
    public void TransferForDelivery(Good good, int countGoods)
61
    {
62
        good = good ?? throw new ArgumentNullException();
63
64
        if (countGoods < 0)
65
            throw new ArgumentOutOfRangeException();
66
67-
        if (_goods.ContainsKey(good) && _goods[good] >= countGoods)
67+
        if (_goods.ContainsKey(good) == false || _goods[good] < countGoods)
68-
            _goods[good] -= countGoods;
68+
69-
        else
69+
        
70
        _goods[good] -= countGoods;
71
    }
72
}
73
74
public class Shop
75
{
76
    private readonly Warehouse _warehouse;
77
78
    public Shop(Warehouse warehouse) => _warehouse = warehouse ?? throw new ArgumentNullException();
79
    
80
    public Cart Cart()
81
    {
82
        return new Cart(_warehouse);
83
    }
84
}
85
86
public class Cart
87
{
88
    private readonly Dictionary<Good, int> _goods;
89
    private readonly IDeliveryWarehouse _warehouse;
90
91
    public Cart(IDeliveryWarehouse warehouse) 
92
    {
93
        _warehouse = warehouse ?? throw new ArgumentNullException();
94
95
        GoodEqualityCompare goodEqualityCompare = new();
96
        _goods = new(goodEqualityCompare);
97
    }
98
99
    public void Add(Good good, int countGoods)
100
    {
101
        good = good ?? throw new ArgumentNullException();
102
103
        if (countGoods < 0)
104
            throw new ArgumentOutOfRangeException();
105
106-
        if (_goods.ContainsKey(good))
106+
        if (_warehouse.CanIssue(good, countGoods) == false)
107-
            _goods[good] += countGoods;
107+
            throw new InvalidOperationException();
108-
        else
108+
109-
            _goods.Add(good, countGoods);
109+
        if (_goods.ContainsKey(good) == false)
110
            _goods[good] = 0;
111
112
        _goods[good] += countGoods;          
113
    }
114
115
    public PayOrder Order()
116
    {
117
        foreach(var goods in _goods)
118
        {
119
            _warehouse.TransferForDelivery(goods.Key, goods.Value);
120
        }
121
122
        _goods.Clear();
123
        return new PayOrder();
124
    }
125
}
126
127
public class Good
128
{
129
    public Good(string name)
130
    {
131
        if (string.IsNullOrEmpty(name))
132
            throw new ArgumentNullException();
133
134
        Name = name;
135
    }
136
137
    public string Name { get; }
138
}
139
140
public class PayOrder
141
{
142
    public PayOrder() { }
143
144
    public string Paylink { get; }
145
}
146
147
public interface IDeliveryWarehouse
148
{
149
    public bool CanIssue(Good good, int countGoods);
150
151
    public void TransferForDelivery(Good good, int countGoods);
152
}
153
154
public class GoodEqualityCompare : IEqualityComparer<Good>
155
{
156
    public bool Equals(Good? good1, Good? good2)
157
    {
158
        if (ReferenceEquals(good1, good2)) 
159
            return true;
160
161
        if (good1 == null || good2 == null)
162
            return false;
163
164
        return good1.Name == good2.Name;
165
    }
166
167
    public int GetHashCode(Good good) => good.Name.GetHashCode();
168
}