Я понимаю концепцию объекта, и, как программист на Java, я чувствую, что парадигма ОО приходит на практике довольно естественно.
Однако недавно я подумал:
Подождите секунду, каковы на самом деле практические преимущества использования объекта по сравнению со статическим классом (с правильной практикой инкапсуляции и ОО)?
Я мог бы подумать о двух преимуществах использования объекта (оба являются значительными и мощными):
Полиморфизм: позволяет динамически и гибко менять функциональность во время выполнения. Также позволяет легко добавлять новые функциональные возможности и детали в систему. Например, если есть
Car
класс, предназначенный для работы сEngine
объектами, и вы хотите добавить новый Engine в систему, которую может использовать Car, вы можете создать новыйEngine
подкласс и просто передать объект этого класса вCar
объект без необходимости изменить что-нибудь оCar
. И вы можете решить сделать это во время выполнения.Возможность «передавать функциональность»: вы можете динамически передавать объект по системе.
Но есть ли еще преимущества для объектов перед статическими классами?
Часто, когда я добавляю новые «детали» в систему, я делаю это, создавая новый класс и создавая для него объекты.
Но недавно, когда я остановился и подумал об этом, я понял, что статический класс будет делать то же самое, что и объект, во многих местах, где я обычно использую объект.
Например, я работаю над добавлением механизма сохранения / загрузки файла в мое приложение.
С объектом вызывающая строка кода будет выглядеть так: Thing thing = fileLoader.load(file);
Со статическим классом это будет выглядеть так: Thing thing = FileLoader.load(file);
Какая разница?
Довольно часто я просто не могу придумать причину создания объекта, когда обычный старый статический класс будет действовать точно так же. Но в ОО-системах статические классы довольно редки. Так что я должен что-то упустить.
Есть ли еще какие-то преимущества для других объектов из двух, которые я перечислил? Пожалуйста, объясни.
РЕДАКТИРОВАТЬ: уточнить. Я нахожу объекты очень полезными при обмене функциональностью или передаче данных. Например, я написал приложение, которое составляет мелодии. MelodyGenerator
было несколько подклассов, которые по-разному создают мелодии, и объекты этих классов были взаимозаменяемыми (шаблон Стратегии).
Мелодии тоже были объектами, потому что их полезно передавать. Так были аккорды и весы.
Но как насчет «статических» частей системы, которые не будут распространяться? Например, механизм сохранения файла. Почему я должен реализовывать это в объекте, а не в статическом классе?
FileLoader
на тот, который читает из сокета? Или макет для тестирования? Или тот, который открывает ZIP-файл?
System.Math
в .NET - пример чего-то, что имеет гораздо больший смысл как статический класс: вам никогда не понадобится менять его или высмеивать его, и ни одна из операций не может быть логически сделана частью экземпляра. Я действительно не думаю, что ваш «спасительный» пример соответствует этому счету.
Thing
?