Saya memahami konsep suatu objek, dan sebagai programmer Java saya merasakan paradigma OO datang secara alami kepada saya dalam praktiknya.
Namun baru-baru ini saya mendapati diri saya berpikir:
Tunggu sebentar, apa sebenarnya manfaat praktis menggunakan objek daripada menggunakan kelas statis (dengan enkapsulasi dan praktik OO yang tepat)?
Saya bisa memikirkan dua manfaat menggunakan objek (keduanya signifikan dan kuat):
Polimorfisme: memungkinkan Anda untuk menukar fungsionalitas secara dinamis dan fleksibel selama runtime. Juga memungkinkan untuk menambahkan 'bagian' fungsionalitas baru dan alternatifnya ke sistem dengan mudah. Misalnya jika ada
Car
kelas yang dirancang untuk bekerja denganEngine
objek, dan Anda ingin menambahkan Mesin baru ke sistem yang dapat digunakan oleh Mobil, Anda dapat membuatEngine
subkelas baru dan cukup mengirimkan objek kelas ini keCar
objek, tanpa harus ubah apa saja tentangCar
. Dan Anda dapat memutuskan untuk melakukannya selama runtime.Mampu 'menyampaikan fungsionalitas': Anda dapat melewatkan objek di sekitar sistem secara dinamis.
Tetapi apakah ada lebih banyak keuntungan pada objek dibandingkan kelas statis?
Seringkali ketika saya menambahkan 'bagian' baru ke sistem, saya melakukannya dengan membuat kelas baru dan membuat objek dari itu.
Tetapi baru-baru ini ketika saya berhenti dan memikirkannya, saya menyadari bahwa kelas statis akan melakukan hal yang sama dengan objek, di banyak tempat di mana saya biasanya menggunakan objek.
Misalnya, saya sedang berupaya menambahkan mekanisme simpan / muat-file ke aplikasi saya.
Dengan sebuah objek, baris kode panggilan akan terlihat seperti ini: Thing thing = fileLoader.load(file);
Dengan kelas statis, akan terlihat seperti ini: Thing thing = FileLoader.load(file);
Apa bedanya?
Cukup sering saya tidak bisa memikirkan alasan untuk membuat instance objek ketika kelas statis lama-polos akan bertindak sama. Tetapi dalam sistem OO, kelas statis cukup langka. Jadi saya pasti kehilangan sesuatu.
Apakah ada lebih banyak manfaat untuk objek selain dari dua yang saya daftarkan? Tolong jelaskan.
EDIT: Untuk memperjelas. Saya menemukan benda sangat berguna ketika bertukar fungsionalitas, atau meneruskan data. Misalnya saya menulis aplikasi yang membuat melodi. MelodyGenerator
memiliki beberapa subclass yang membuat melodi secara berbeda, dan objek dari kelas-kelas ini dapat dipertukarkan (pola Strategi).
Melodi juga objek, karena berguna untuk menyebarkannya. Begitu juga dengan Chords and Scales.
Tetapi bagaimana dengan bagian 'statis' dari sistem - yang tidak akan diedarkan? Misalnya - mekanisme 'simpan file'. Mengapa saya harus mengimplementasikannya dalam objek, dan bukan kelas statis?
FileLoader
baca dari soket? Atau tiruan untuk pengujian? Atau yang membuka file zip?
System.Math
di .NET adalah contoh dari sesuatu yang jauh lebih masuk akal sebagai kelas statis: Anda tidak akan perlu menukar atau mengejeknya dan tidak ada operasi yang secara logis dapat menjadi bagian dari instance. Saya benar-benar tidak berpikir contoh 'menabung' Anda sesuai dengan tagihan itu.
Thing
?