Rozumiem pojęcie obiektu i jako programista Java czuję, że paradygmat OO przychodzi mi w praktyce dość naturalnie.
Jednak ostatnio pomyślałem:
Poczekaj chwilę, jakie są praktyczne korzyści z używania obiektu w porównaniu z użyciem klasy statycznej (z odpowiednimi praktykami enkapsulacji i OO)?
Mógłbym wymyślić dwie zalety używania obiektu (oba są znaczące i potężne):
Polimorfizm: pozwala dynamicznie i elastycznie zamieniać funkcjonalność w czasie wykonywania. Pozwala również łatwo dodawać nowe funkcje „części” i alternatywy do systemu. Na przykład, jeśli istnieje
Car
klasa zaprojektowana do pracy zEngine
obiektami i chcesz dodać nowy silnik do systemu, z którego może korzystać samochód, możesz utworzyć nowąEngine
podklasę i po prostu przekazać obiekt tej klasy doCar
obiektu, bez konieczności zmienić cokolwiek na tematCar
. Możesz to zrobić podczas działania.Będąc w stanie „przekazywać funkcjonalność”: możesz dynamicznie przekazywać obiekt wokół systemu.
Ale czy są jakieś przewagi obiektów nad klasami statycznymi?
Często, gdy dodam nowe „części” do systemu, robię to, tworząc nową klasę i tworząc z niej obiekty.
Ale ostatnio, kiedy zatrzymałem się i pomyślałem o tym, zdałem sobie sprawę, że klasa statyczna zrobiłaby to samo co obiekt, w wielu miejscach, w których normalnie używam obiektu.
Na przykład pracuję nad dodaniem mechanizmu zapisywania / ładowania plików do mojej aplikacji.
W przypadku obiektu linia wywołująca kodu będzie wyglądać następująco: Thing thing = fileLoader.load(file);
W przypadku klasy statycznej wyglądałoby to tak: Thing thing = FileLoader.load(file);
Co za różnica?
Dość często nie potrafię wymyślić żadnego powodu, aby utworzyć obiekt, gdy zwykła klasa statyczna działałaby tak samo. Ale w systemach OO klasy statyczne są dość rzadkie. Więc coś mi brakuje.
Czy są jeszcze jakieś zalety innych obiektów niż te, które wymieniłem? Proszę wytłumacz.
EDYCJA: aby wyjaśnić. Uważam, że obiekty są bardzo przydatne podczas wymiany funkcji lub przekazywania danych. Na przykład napisałem aplikację, która tworzy melodie. MelodyGenerator
miał kilka podklas, które inaczej tworzą melodie, a obiekty tych klas były wymienne (wzorzec strategii).
Melodie też były przedmiotami, ponieważ warto je przekazywać. Podobnie jak Akordy i Łuski.
Ale co z „statycznymi” częściami systemu - które nie zostaną przekazane? Na przykład - mechanizm „zapisz plik”. Dlaczego powinienem zaimplementować go w obiekcie, a nie w klasie statycznej?
FileLoader
na czytający z gniazda? A może próbny test? Lub taki, który otwiera plik zip?
System.Math
w .NET jest przykładem czegoś, co ma o wiele większy sens jako klasa statyczna: nigdy nie będziesz musiał go wymieniać ani wyśmiewać i żadna z operacji nie mogłaby logicznie stać się częścią instancji. Naprawdę nie sądzę, że twój przykład „oszczędzania” pasuje do tego rachunku.
Thing
?