Rekayasa Internal Kerangka RAD... sebagai Pengembang PHP dengan Nooku

Diterbitkan: 2022-03-11

Setiap orang memiliki seperangkat alat mereka sendiri. Sebagai pengembang PHP, salah satu favorit saya adalah kerangka Pengembangan Aplikasi Cepat yang disebut “Nooku”. Dalam kata-kata grup pengembangan: "Nooku lebih merupakan alat pengembangan web daripada kerangka kerja".

Jika Anda tidak terbiasa dengan itu, lihatlah. Ini adalah proyek sumber terbuka yang banyak menggunakan pola desain yang diterima industri untuk menghasilkan aplikasi dengan komponen tinggi yang mudah dikembangkan dan digunakan kembali (awalnya dibuat oleh salah satu pengembang utama Joomla!). Di luar kotak, Nooku memberi Anda banyak alat pengembangan aplikasi cepat untuk membantu menyelesaikan proyek lebih cepat. Contoh kecil, tapi kuat:

  • Implementasi default MVC di mana yang perlu Anda lakukan hanyalah menulis tata letak (inilah yang membuat saya ketagihan)
  • Ketersediaan HMVC segera
  • Dukungan untuk format output yang berbeda seperti JSON dan XML untuk semua data Anda (yaitu, mengekspos API Anda dalam hitungan menit)
  • Implementasi administratif dan front-end default

Inti dari Nooku adalah prinsip desain "Komposisi atas Warisan" (sebenarnya, ini adalah konsep pertama di halaman pengantar Nooku. Dalam satu baris: Anda harus bertujuan untuk menyusun (atau menambahkan) fungsionalitas beberapa objek untuk membuat beberapa semacam objek komposit, daripada mengandalkan subclassing.

Visualisasi komposisi over inheritance prinsip dalam pengembangan aplikasi cepat (RAD) PHP.

Prinsip ini memungkinkan Anda menulis lebih sedikit kode dan sering kali mengarah ke beberapa solusi yang cukup elegan. Jadi bagaimana sebenarnya itu dipromosikan? Nah, di tingkat kode, contoh terbaik datang melalui penggunaan Mixin dan Resource/Service Identifier. Mari lihat.

Campuran

Sebelum PHP 5.4, bahasa tersebut tidak memiliki konsep Traits . Ini adalah struktur seperti kelas yang, ketika 'digunakan' oleh suatu objek, menyediakan beberapa jenis fungsionalitas (mirip dengan Multiple Inheritance). Nooku telah memecahkan masalah ini selama bertahun-tahun (sejak PHP 5.2) dengan Mixin .

Mixin tidak hanya memungkinkan Anda membuat objek bersama-sama, tetapi juga menambahkan metode setiap objek campuran ke antarmuka objek komposit. Objek yang menggunakan mixin tampaknya 'mewarisi' metode campuran dalam objek.

 /** * Mixin an object * * When using mixin(), the calling object inherits the methods of the mixed * in objects, in a LIFO order. * * @param KMixinInterface $object An object that implements KMinxInterface * @return KObject */ public function mixin(KMixinInterface $object) { $methods = $object->getMixableMethods($this); foreach($methods as $method) { $this->_mixed_methods[$method] = $object; } // Set the mixer $object->setMixer($this); return $this; }

Hampir semua objek di Nooku memiliki kemampuan ini karena mereka memperluas kelas dasar KObject yang mendefinisikan metode mixin .

Kelas utama dalam arsitektur pengontrol Nooku juga diturunkan dari KObject. Kontroler abstrak adalah kelas KControllerAbstract dan dengan inspeksi Anda dapat melihat bahwa itu mengambil keuntungan dari kemampuan Mixing segera. Setiap kali instance kelas ini dibuat, fungsionalitas KMixinCommand dan KMixinBehavior segera ditambahkan ke antarmukanya. Akibatnya, setiap pengontrol di Nooku disusun dengan fungsi manajemen Rantai Perintah dan Perilaku melalui objek masing-masing.

Mengapa K di depan semua nama kelas? Perpustakaan utama Nooku adalah kode bernama "Koowa".

Kembali ke pengontrol Nooku: kelas KMixinBehavior menampung semua bagian untuk memberi KControllerAbstract kemampuan untuk memuat Perilaku tertentu saat runtime. Strategi perilaku adalah kelas yang menggambarkan proses atau logika yang dapat dipisahkan dan digunakan oleh kelas lain (misalnya, dapat diedit, dapat dipesan). KMixinBehavior cukup sederhana dan hanya memiliki empat metode: getBehavior, hasBehavior, addBehavior dan getBehaviors. Dan hanya itu yang kita butuhkan untuk memberikan objek kemampuan untuk menangani dan merangkum berbagai strategi perilaku.

Demikian pula, KMixinCommand hanya memiliki tiga metode: getCommandContext, getCommandChain, setCommandChain. Jika Anda tidak menebaknya, ketiga metode ini memberikan KControllerAbstract kemampuan untuk mengimplementasikan rantai perintah, tetapi memungkinkannya melakukannya saat runtime.

Anda dapat menganggap pencampuran ini sebagai penjumlahan aritmatika sederhana:

Penggambaran pencampuran Nooku sebagai penjumlahan aritmatika dalam kerangka pengembangan aplikasi cepat ini.

Memberi kita antarmuka yang terlihat seperti ini:

Seperti inilah tampilan antarmuka yang dihasilkan dalam kerangka kerja RAD khusus ini.

Menurut definisi Kelas abstrak dimaksudkan untuk diperluas dan dengan keajaiban pewarisan semua objek yang merupakan anak-anak atau instance dari KControllerAbstract juga mendapatkan kemampuan untuk menambahkan perilaku dan rantai perintah saat runtime.

Terdengar keren. Tapi apa maksud yang sebenarnya? Singkatnya, Nooku menyediakan fungsionalitas komponen; yaitu, Nooku memungkinkan Anda untuk memodulasi fungsionalitas Anda dan menyusun fungsionalitas di seluruh modul saat runtime.

Kedua contoh ini berfungsi untuk menunjukkan komposisi. Mereka juga berfungsi untuk menunjukkan dukungan kerangka kerja Nooku RAD untuk komposisi lebih lanjut pada intinya. Ini adalah keuntungan penting. Metode yang ditambahkan ke KControllerAbstract di atas mendukung "Pola Desain Strategi" dengan memberi pengembang alat untuk merangkum apa yang bervariasi sebelum satu baris kode ditulis. Fakta bahwa metode mixin() adalah bagian dari setiap ekstensi KObject berarti Anda dapat dengan mudah mendefinisikan dan menambahkan antarmuka manajemen perilaku lainnya ke sebagian besar objek saat runtime.

Pengidentifikasi dan Pencari Layanan dan Sumber Daya: Pisahkan Nama Kelas Saya dari Objek Saya

Pengidentifikasi dan Pencari Layanan dan Sumber Daya di Nooku juga memberikan dukungan yang kuat untuk pemisahan masalah.

Sekali lagi, mari kita lihat lagi KObject, tetapi juga KService. Kami dapat memperlakukan sebagian besar hal di Nooku sebagai layanan atau sumber daya, dan dengan demikian memberi contoh dan menginterogasinya dengan cara yang persis sama.

Pikirkan layanan sebagai sesuatu dari mana Anda mendapatkan sumber daya. Semua layanan adalah sumber daya tetapi tidak semua sumber daya adalah layanan

Ketika Anda pergi ke toko kelontong dan membeli produk, pikirkan toko itu sebagai Layanan, yaitu, kumpulan barang yang dapat Anda urutkan ; dan produk sebagai Sumber Daya, yaitu, satu item/logika solusi yang dapat berupa:


  • melihat secara khusus ( Baca) (misalnya, melihat sekaleng sup tomat)
  • bergerak di sekitar toko ( E dited) (misalnya, memindahkan sup ke lorong produksi)
  • ditambahkan ke atau dihapus dari inventaris toko ( A dd dan D elete) (mis., tambahkan jenis sup baru dan singkirkan tomat)

Mengambil contoh ini lebih jauh, bayangkan toko kelontong memiliki departemen waralaba dan Anda ingin berbisnis. Dalam situasi itu, Layanan adalah departemen waralaba dan sumber dayanya adalah toko kelontong yang Anda beli. Ini sangat banyak klasifikasi kontekstual. Secara keseluruhan, ini dikenal sebagai pola tindakan BREAD (Anda akan melihat masing-masing diwakili antara KControllerService dan KControllerResource yang diawali dengan '_action', yaitu _actionRead()).

Model dapat berupa layanan, objek tabel dapat dianggap sebagai layanan, triad MVC tertentu digunakan sebagai sumber daya atau layanan, sedangkan catatan spesifik yang dihasilkan dari interogasi layanan dapat dianggap sebagai sumber daya.

Setiap objek di Nooku adalah komposisi objek yang masing-masing berisi referensi ke seluruh layanan instantiated aplikasi dalam 'wadah layanan' dan metode untuk mengakses layanan yang disebut getService(). Semua yang diperlukan oleh metode KObject::getService() adalah bahwa kita melewati pengenal sumber daya yang valid dan itu akan mengembalikan layanan instantiated yang siap digunakan.

Dalam pengembangan aplikasi cepat PHP, Resource Identifier memberi kita cara yang ampuh untuk memisahkan instantiasi objek dari nama kelasnya, dan dengan demikian memberikan alias untuk identifikasi itu. Ini memiliki implikasi penting pada pemeliharaan aplikasi. Melalui aliasing, pengembang dapat mengubah kelas yang digunakan oleh setiap objek yang dipakai dengan pengenal yang diberikan dengan menambahkan satu baris kode dengan KService::addAlias().

Contoh pengenal sumber daya yang kita kenal adalah URI atau Uniform Resource Identifier:

Contoh pengidentifikasi sumber daya dalam tutorial kerangka kerja Nooku RAD ini.

Ini semua informasi yang diperlukan untuk KService untuk menemukan dan memuat kelas yang sesuai. Potongan-potongan ini cocok dengan penamaan kelas dan konvensi penempatan Nooku yang memberikan prediktabilitas penempatan dan instantiasi. Contoh pengenal dari atas (com://site/user.database.table.user) mencoba memuat file /components/com_user/databases/tables/user.php, yang memiliki nama kelas ComUserDatabaseTableUser. Kebetulan, jika file tidak ada, kerangka kerja akan memberi Anda objek tabel default dan membangunnya berdasarkan penamaan basis data dan konvensi skema id (ini membuat saya ketagihan lagi). Seperti disebutkan sebelumnya, KService juga memungkinkan Anda untuk mengatur alias untuk pengidentifikasi Anda. Menggunakan KService::setAlias('maindbaseadapter','com://admin/default.database.adapter.mysqli') ; memungkinkan kita memuat objek db dengan KService::getService('maindbaseadapter') .

Ini memberi kita decoupling yang kita bicarakan dan memberikan keuntungan yang nyata dalam pemeliharaan dan perluasan aplikasi kita. Kami bebas membuat aplikasi selain 'situs' dan 'admin' jika diperlukan dan melalui pengenal yang dijelaskan di sini dapat menggunakan layanan yang terletak di aplikasi lain dengan mudah untuk membantu solusi kami memenuhi persyaratan mereka. Sekali lagi, ini adalah contoh lain bagaimana Nooku memberikan dukungan kepada pengembang dan tim PHP dan RAD untuk komposisi tidak hanya objek kelas tunggal tetapi seluruh layanan dan aplikasi… gratis.

Menyimpulkan

Dengan komposisi atas warisan pada intinya; komposisi dan struktur cerdas yang sudah ada sebelumnya untuk mendukung amalgam lebih lanjut; dan arsitektur berorientasi layanan gratis dengan pengidentifikasi yang dijelaskan di sini, Nooku menyediakan kerangka kerja RAD yang kuat dengan awal yang signifikan di atas semua alat pengembangan PHP sejawatnya.