Polecam rzetelnie (co tak naprawdę oznaczają i jakie problemy rozwiązują) zapoznać się z zasadami SOLID i wzorcami projektowymi. Znalazłbyś w ten sposób sens programowania obiektowego i kilka odpowiedzi na Twoje pytania:
Ma ktoś może jakieś wskazówki czym się kierować, na co zwracać uwagę żeby mieć intuicję kiedy "porzucić" klasę A i zacząć pisać już klasę B?
Single responsibility principle (Zasada jednej odpowiedzialności)
Klasa powinna mieć tylko jedną odpowiedzialność (nigdy nie powinien istnieć więcej niż jeden powód do modyfikacji klasy).
dodajZakupy(), podzielNaKategorie(), podliczWydatki() - Te wszystkie metody prawdopodobnie powinny być w oddzielnych klasach.
Na początku nauki OOP wydaje się być przerostem formy nad treścią. Jednak jak zapoznasz się z dependency injection, interfejsami, testowaniem przy użyciu mocków, wszystko nabierze sensu.
Taka porada, abyś też nie używał na siłę dziedziczenia np. kwadrat nie powinien dziedziczyć po prostokącie.