nie widzę jakoś też tego w zastosowaniu na szerszą skalę.
Poczytaj historie paradygmatów programowania. Programowanie obiektowe powstało właśnie dlatego, że podejście prodecuralne, a jeszcze wcześniej strukturalne nie sprawdzało się w dużych systemach. Ciężko było utrzymywać dużą aplikacje napisaną proceduralnie.
Koniec końców wszystko rozbija się o ogarnięcie dużej aplikacji przez programistów. O czytelność kodu.
Przykładowo gdy zobaczysz sobie 1000 linijek instrukcji napisanych w mainie to ciężko się to czyta, no nie? Nie daj boże są w tym kodzie jakieś skoki do losowych miejsc. Taki kod jest nieczytelny i masakryczny w utrzymaniu (modyfikacji).
Dlatego wymyślili podejśćie proceduralne. Kod stał się troche czytelniejszy, main jest szeregiem nazwanych funkcji operujących na danych przesłanych w argumentach.
Ale jeśli aplikacja jest na prawdę duża to masa danych (zmiennych) i funkcji w obszarze globalnym powoduje, że można się co najwyżej w tym wszystkim pogubić. Np masz strukture (klasa bez metod) i szereg funkcji przyjmujących tą strukture jako argument. Widać, że jest potrzeba połączenia danych z funkcjami, które na nich operują. I to jest właśnie kwintesencja obiektowości. Połączenie danych (zmiennych) z zachowaniem (funkcjami).
Programowanie obiektowe wprowadza także pewien poziom abstrakcji. Pewnego ukrywania bebechów. Tak jak człowiek na codzień posługuje się interfejsami, gdy używa pilota do telewizora czy lewarka skrzyni biegów tak programista może zrobić to samo. Gdy wciskasz czerwony przycisk na pilocie do TV to nie interesuje Cię w jaki sposób sygnał dociera do telewizora i jak telewizor te sygnał przetwarza. Interesuje Cię co możesz z tym pilotem zrobić. Jak się z nim obchodzić. Programowanie obiektowe pozwala w ten sposób projektować kod.
Każda klasa udostępnia pewien interfejs publiczny do komunikacji z innymi klasami jednocześnie ukrywając implementacje. Jest to w pewien sposób naturalny dla ludzi sposób myślenia o rzeczywistości.
Dam przykład. Tablica dynamiczna z której wszyscy korzystamy. Róznie ją nazywają - vector, arraylist, list. Wyobraż sobie jak by wyglądało korzystanie z tablicy dynamicznej gdyby była napisana proceduralnie. Miałbyś w obszarze GLOBANYM zmienna capacity określającą obecną pojemność (ile jeszcze mozna elementow do tablicy dodac zanim trzeba bedzie ja powiekszyć) i size - czyli ilość elementów w tablicy. Miałbyś też szereg wolnych funkcji przyjmujących jako argumenty właśnie te zmienne, które składają się na tablice dynamiczną:
addToList(int capacity, int size, int[] tab, int element_to_add);
removeFromList(int capacity, int size, int []tab)
printList(int size, int []tab);
Na pierwszy rzut oka widać nadmiarowość w postaci nazw funkcji: ...toList ...fromList ...List. Te funkcje sa połączone ze zmiennymi tylko nazwami i wszystko jest w obszarze globalnym. Język w żaden sposób ich nie łączy, mimo, że są przeznaczone do operowania na tych właśnie danych. Kolejny minus to integralność danych. Programista korzystający z listy może sobie ją zepsuć modyfikując capacity samemu. Np capacity jest 10 a programista podaje, ze jest 100. Program sie wysypuje.
Odpowiedz na wszystkie te problemy to programownaie obiektowe. Nie trzeba doawać do nazw funkcji podkreslenia że są przeznaczone do listy, bo ligoczna struktura języka wiaże je z listą.
Gwarantowana jest też integralność danych. Nikt z zewnątrz nie zmodyfikuje Ci zmiennej capacity i nie zepsuje listy.
Kod jest czytelny (nazwy), łatwy w utrzymaniu (zmienne prywatne) i wygodnie się z niego korzysta:
Lista list;
list.add(10);
lista.print();
lista.remove();
Mam nadzieje, że coś pomogłem. Programowanie obiektowe to o wiele więcej niż to co napisałem, ale mam nadzieje, że zrozumiesz jego istotę i sens.
EDIT: Opisywałem w innym wątku na czym polega abstrakcja, która jest bardzo ważna w programowaniu obiektowym. Rzuć okiem: https://forum.pasja-informatyki.pl/376120/abstrakcja-wyjasnienie#a376159
EDIT2: Zapomniałem dodać co jest super fajnego w obiektowej liście. Chodzi o to, że gdy zrobimy inną kolekcje np liste jednokierunkową to nazwy metod mogą być takie same (add, remove, print) ze względu na zmiane zasięgu. Można też zauważyć, że obydwie listy udostępniają podobne funkcjonalności i można wydobyć z nich jeden wspólny interfejs. Te same funkcjonalności inna implementacja - polimorfizm. Praca z takim kodem i jego utrzymanie jest niewyobrażalnie łatwe w porównaniu z podejściem proceduralnym.