@m_w: rozpatrz coś takiego jak Dział_magazynu. To pozwoli Ci pokombinować z Obrotem_wewnętrznym, który nie będzie dotykał stanu ogólnego, ale będziesz mógł rozdysponować tę ilość pomiędzy działy. W razie wydania zewnętrznego, zobaczysz który dział ma ile czego i wydasz. Innymi słowy klient poprosi o 100 sztuk X i dostaje, ale to Magazyn wie, że X1 musi pobrać z DziałuA oraz 100-X1 z DziałuB

W ten sposób ukrywasz tak naprawdę pewną implementację wewnętrzną, czyli idziesz tym torem, który jest dla obiektowości idealny -> enkapsulacja. Magazyn dysponuje metodami pobierania z działów i wysyłania do działu lub ewentualnie przesyłki między działami (to tak naprawde pobierz i wyślij w jednym).
To o czym wspomniał krystianroza wiązało by się z większym doprecyzowaniem. Nie miałbyś już w magazynie/dziale hedynie id_produktu i jego ilości, ale pojawiła by się Partia produktu, czyli mocniejsze rozwarstwienie i produkt na stanie magazynu/działu koniecznie musiałby być sumowany by poznać całkowitą ilość na stanie. A że takie operacje byłyby konieczne do zapamiętania, to rośnie nam ilość klas obsługujących.
Takie wydanie wewnętrzne to przesunięcie produktu z partii R w ilości X z działu A do działu B. Konieczna klasa obsługi wewetrznej typu pobierz_z_działu(A, partia, ilość), wyślij_do_działu(B, partia, ilość). Zauważ, że jeśli mamy kilka sztuk z każdej partii to przesunięcie większej ilości do magazynu B ze wskazaniem po prostu "przyslij do B truskawki", bez precyzowania z jakiej dostawy, angażuje operację przesyłu kilkukrotnie tak, by zgadzała się ilośc sumaryczna do przesłania, bo nie definiuje czy ma to być jedna partia produktu czy można mieszać.
Jeszcze gorzej w przypadku zewnętrznej, ktore też ma swoją klasę zawiadującą stanem całości magazynu... korzystając wewnątrz więdzy innymi z klasy przesyłu wewnętrznego, bo musisz użyć pobierz_z_działu(), ale byłaby to wewętrzne użycie metody na rzecz wydaj_z_magazynu.
Zauważ, że jednak CAŁY proces to tak naprawdę tylko kontrola nad malutkimi procesikami klas działu i magazynu. Można jedynie próbować to tak zorganizować, by partie się nie "fragmentowały", a więc jeśli widzimy partię porozrzucaną po kilku działach, co jakis czas zebrać ją do kupy w jednym dziale.