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 Queryobjek dan Databaseobjek:
The Queryobjek 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, Queryobjek 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 Databaseobjeknya. 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 Databaseobjek. Kelas yang baik akan menyederhanakan penalaran ketika memanipulasi keadaan internal. Untuk Databaseobjek ini Anda bisa menyembunyikan cara kerja panggilan jaringan, atau permintaan batch atau pembaruan, atau memberikan lapisan caching.
Masalahnya adalah Databaseobjek 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 Managerobjek, 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 EmailManagermulai dengan fungsi yang dipanggil sendEmailyang mengambil Emailobjek. 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 AnimalStepdan AnimalTrip(mengumpulkan AnimalSteps) kelas. Sekarang setiap perjalanan memiliki semua data Langkah, maka harus bisa mencari tahu tentang hal itu, mungkin AnimalTrip.calculateDistance()masuk akal.