Setelah konsep dari OOP kita pelajari, pasti sudah ada gambaran terkait dengan bagaimana membuat sebuah Parent Class kemudian membuat berbagai Child Class yang mana mewarisi sifat-sifat dari parent-nya, serta dapat menambahkan, mengubah, bahkan merombak setiap method yang ada.
Sebuah paradigma OOP akan menghasilkan hierarki, di mana semakin besar software yang kita buat, maka akan semakin besar dan rumit juga hierarkinya.
Coba bayangkan saja jika kita ingin membuat Child Class bernama PersonalEnterpriseWhatsApp di mana blueprint kelas tersebut kita ingin menggunakan method dan attribute yang ada di PersonalWhatsApp dan BussinessWhatsApp. Kita perlu merombak kembali kelas-kelas parent-nya hanya untuk membuat sebuah kelas baru. Nah, di sinilah pendekatan object composition berperan.
Object composition adalah prinsip komposisi dari sebuah alur bisnis tanpa perlu melakukan pewarisan dari parent class. Prinsip ini didasarkan pada kumpulan perilaku (method/function) yang sudah kita definisikan. Sehingga, ketika ingin membuat alur bisnis lain dengan beberapa perilaku (method) yang sama, kita dapat menggunakan fungsi yang sudah ada tanpa melakukan inheritance/pewarisan.
Pada dasarnya konsep yang harus dilakukan adalah:
- const yourGenericAction = params => ({
- actionA: () => { /** do action A **/},
- actionB: () => { /** do action B **/},
- });
- const YourClassName = (paramA, paramB) => {
- }
- const YourClassName = (paramA, paramB) => {
- const self = {
- paramA,
- paramB
- };
- }
- const YourClassName = (paramA, paramB) => {
- const self = {
- paramA,
- paramB
- };
- const yourSpecificActions = self => ({
- specificActionA: { /** do action A **/},
- });
- }
- const YourClassName = (paramA, paramB) => {
- const self = {
- paramA,
- paramB
- };
- const yourSpecificActions = self => ({
- specificActionA: { /** do action A **/},
- });
- return Object.assign(self, yourGenericAction(self), yourSpecificActions(self))
- }
Sebagai contoh, dari hirarki Mail yang sudah kita buat sebelumnya. kita akan merombak dan membuatnya dengan pendekatan Object composition.
// [1] list of abstractionsconst canSendMessage = self => ({ sendMessage: () => console.log('send message:', self.message) });const checkIsValidPhone = self => ({ isValid: () => console.log('valid phone', self.from) });// [2] crate object compositionconst personalEnterprise = (from, message, store) => { // [3] attributes const self = { from, message, store }; // [4] method const personalEnterpriseBehaviors = self => ({ createCatalog: () => console.log('Catalog has created: ', self.store)Penjabaran kode di atas:
Dari contoh kode di atas maka kita dapat membuat sebuah object dengan nama personalEnterprise tanpa harus melakukan pewarisan.