Я розумію поняття об’єкта, і як програміст Java, я відчуваю, що парадигма ОО на практиці приходить досить природно до мене.
Однак нещодавно я задумався:
Зачекайте секунду, які насправді практичні переваги використання об'єкта над використанням статичного класу (при належній практиці інкапсуляції та ОО)?
Я міг би подумати про дві переваги використання об'єкта (обидва значущі та потужні):
Поліморфізм: дозволяє динамічно та гнучко міняти функціональність під час виконання. Також дозволяє легко додавати нові функціональні «частини» та альтернативи до системи. Наприклад, якщо є
Car
клас, призначений для роботи зEngine
об'єктами, і ви хочете додати новий двигун до системи, якою може користуватися Автомобіль, ви можете створити новийEngine
підклас і просто передати об’єкт цього класу вCar
об'єкт, не маючи необхідності щось змінитиCar
. І ви можете вирішити це під час виконання.Можливість передачі функціоналу навколо: ви можете динамічно передавати об'єкт навколо системи.
Але чи є більше переваг для об’єктів над статичними класами?
Часто, коли я додаю нові "частини" до системи, я роблю це, створюючи новий клас і створюючи з нього об'єкти.
Але нещодавно, коли я зупинився і подумав про це, я зрозумів, що статичний клас буде робити те саме, що і об’єкт, у багатьох місцях, де я зазвичай використовую об’єкт.
Наприклад, я працюю над додаванням механізму збереження / завантаження файлів у свій додаток.
З об'єктом, рядок виклику коду буде виглядати так: Thing thing = fileLoader.load(file);
З статичним класом це виглядатиме так: Thing thing = FileLoader.load(file);
Яка різниця?
Досить часто я просто не можу придумати привід для створення об'єкта, коли звичайний старий клас статики діяв би так само. Але в системах OO статичні класи досить рідкісні. Тому я, мабуть, чогось не вистачаю.
Чи є ще якісь переваги для інших, ніж два, які я перерахував? Будь ласка, поясніть.
EDIT: Для уточнення. Я вважаю об'єкти дуже корисними під час обміну функціональністю або передачі даних навколо. Наприклад, я написав додаток, що складає мелодії. MelodyGenerator
мали кілька підкласів, які по-різному створюють мелодії, а об'єкти цих класів були взаємозамінними (шаблон стратегії).
Мелодії теж були об’єктами, оскільки їх корисно передавати навколо. Так само були акорди та шкали.
А як щодо "статичних" частин системи - які не будуть передаватися навколо? Наприклад - механізм "збереження файлу". Чому я повинен реалізовувати його в об'єкті, а не в статичному класі?
FileLoader
на той, який читається з розетки? Або макет для тестування? Або той, який відкриває zip-файл?
System.Math
в .NET - це приклад чогось, що має набагато більше сенсу як статичного класу: вам ніколи не потрібно буде поміняти його чи знущатися над ним, і жодна з операцій не може логічно бути частиною екземпляра. Я дійсно не думаю, що ваш приклад "заощадження" відповідає цьому рахунку.
Thing
?