Menuliskan kata benda, kata kerja, kata sifat Anda merupakan pendekatan yang hebat, tetapi saya lebih suka menganggap desain kelas sebagai mengajukan pertanyaan data apa yang harus disembunyikan ?
Bayangkan Anda memiliki Query
objek dan Database
objek:
The Query
objek akan membantu Anda membuat dan menyimpan query - toko, adalah kunci di sini, sebagai fungsi bisa membantu Anda membuat satu dengan mudah. Mungkin Anda bisa tinggal: Query().select('Country').from_table('User').where('Country == "Brazil"')
. Tidak masalah persis sintaksisnya - itu adalah pekerjaan Anda! - kuncinya adalah objek membantu Anda menyembunyikan sesuatu , dalam hal ini data yang diperlukan untuk menyimpan dan menampilkan kueri. Kekuatan objek berasal dari sintaks menggunakannya (dalam hal ini beberapa rantai pintar) dan tidak perlu tahu apa yang disimpannya untuk membuatnya bekerja. Jika dilakukan dengan benar, Query
objek dapat menampilkan kueri untuk lebih dari satu basis data. Secara internal ia akan menyimpan format tertentu tetapi dapat dengan mudah dikonversi ke format lain saat mengeluarkan (Postgres, MySQL, MongoDB).
Sekarang mari kita pikirkan Database
objeknya. Apa yang disembunyikan dan disimpan oleh ini? Yah jelas itu tidak bisa menyimpan isi penuh dari database, karena itu sebabnya kami punya database! Jadi apa gunanya? Tujuannya adalah untuk menyembunyikan cara kerja database dari orang yang menggunakan Database
objek. Kelas yang baik akan menyederhanakan penalaran ketika memanipulasi keadaan internal. Untuk Database
objek ini Anda bisa menyembunyikan cara kerja panggilan jaringan, atau permintaan batch atau pembaruan, atau memberikan lapisan caching.
Masalahnya adalah Database
objek ini BESAR. Ini mewakili cara mengakses database, jadi di balik selimut itu bisa melakukan apa saja. Jelas jaringan, caching, dan batching sangat sulit untuk ditangani tergantung pada sistem Anda, jadi menyembunyikannya akan sangat membantu. Tetapi, seperti yang diketahui oleh banyak orang, sebuah basis data sangat kompleks, dan semakin jauh dari panggilan DB mentah yang Anda dapatkan, semakin sulit untuk menyesuaikan kinerja dan memahami cara kerja berbagai hal.
Ini adalah tradeoff mendasar dari OOP. Jika Anda memilih abstraksi yang benar, membuat pengodean menjadi lebih mudah (String, Array, Dictionary), jika Anda memilih abstraksi yang terlalu besar (Database, EmailManager, NetworkingManager), mungkin menjadi terlalu rumit untuk benar-benar memahami cara kerjanya, atau apa yang harus dilakukan. mengharapkan. Tujuannya adalah untuk menyembunyikan kompleksitas , tetapi beberapa kompleksitas diperlukan. Aturan praktis yang baik adalah mulai menghindari Manager
objek, dan sebaliknya membuat kelas yang seperti structs
- yang mereka lakukan hanyalah memegang data, dengan beberapa metode pembantu untuk membuat / memanipulasi data untuk membuat hidup Anda lebih mudah. Misalnya, dalam kasus EmailManager
mulai dengan fungsi yang dipanggil sendEmail
yang mengambil Email
objek. Ini adalah titik awal yang sederhana dan kodenya sangat mudah dimengerti.
Sebagai contoh Anda, pikirkan tentang data apa yang perlu disatukan untuk menghitung apa yang Anda cari. Jika Anda ingin tahu seberapa jauh seekor binatang berjalan, misalnya, Anda dapat memiliki AnimalStep
dan AnimalTrip
(mengumpulkan AnimalSteps) kelas. Sekarang setiap perjalanan memiliki semua data Langkah, maka harus bisa mencari tahu tentang hal itu, mungkin AnimalTrip.calculateDistance()
masuk akal.