pengantar
Cara kami membuat aplikasi web sekarang sangat berbeda dari kode yang datang kepada kami untuk dukungan dari zaman kuno, ketika Pabrik Bintang ditampilkan di TV, sangat modis untuk berjalan dengan kulit kerang , dan PHP baru saja mulai memperoleh tanda-tanda bahasa Berorientasi Objek. Pemrograman pada tahun 2000-an menurut saya merupakan ilustrasi yang sangat baik dari ide-ide Darwin: pada saat itu, hampir semua pengembang menciptakan solusi sendiri, beberapa di antaranya menangkap pikiran lebih dari satu orang, dan setelah melewati seleksi alam yang dipercepat, kerangka kerja dan CMS menjadi contoh judul metode pengembangan terbaik dan terpopuler ... Dalam beberapa kasus, bagaimanapun, hanya populer, tanpa kata "baik" atau bahkan lebih "yang terbaik".
Tapi tidak seperti dinosaurus dan mammoth, tidak semua solusi alternatif terlupakan, terutama di bagian belakang, dan saya tahu ini secara langsung. Saya memiliki kesempatan untuk bekerja, saya tidak akan mengatakan dengan banyak, tetapi jumlah warisan yang cukup solid di php. Beberapa di antaranya sangat buruk dan beberapa situs dan bahkan CMS cukup menarik. Terkadang saya suka menyelidiki apa yang lahir di benak para pionir. Tidak ada standarisasi seperti itu saat itu, dan meskipun sebagian besar waktu itu adalah materi yang sangat baik untuk mempelajari anti-pola, tetapi kode ini menghibur saya, membuat pekerjaan itu terlihat seperti arkeologi TI.
Warisan tercinta
Secara pribadi, saya suka bekerja dengan situs yang bekerja pada warisan - untuk mengedit, menghapus beberapa penopang liar, mengurangi tingkat kekacauan dan pada saat yang sama tidak merusak seluruh sistem. Pada saat-saat seperti itu saya merasa seperti orang yang membuat dunia ini sedikit lebih baik, dan ini keren.
print " <button onClick='domultimove();' class=controlbutton><img src=syspix/ico32_move.gif border=0><br></button>";
print "<b>" . $ITEM->Description . "</b>:<br>";
$browsebgcolor = "#D9D9D9";
$sql = "select i.ID, m.Name, i.perm, i.descr from item4 i inner join main m on i.ID=m.ElementID";
echo "<script language='JavaScript'> document.location='" . $_SERVER['PHP_SELF']";
Fitur umum dari legacy adalah banyaknya kode yang ditulis dalam berbagai bahasa, meskipun dalam perkembangan modern, tentu saja, kita dapat menambahkan, misalnya, kode dalam SQL ke kelas PHP. Tapi saya berbicara tentang hal lain, dalam warisan seringkali ada aliran pemikiran universal pengembang - apa dan dalam bahasa apa yang dia pikirkan, dia tulis di aliran. Saya ingin berbicara tentang situasi serupa dengan satu solusi CMS mega-sekolah tua yang telah saya kerjakan selama beberapa waktu. Segala sesuatu di sana begitu "luar biasa" sehingga saya sangat senang dapat memperbaiki sesuatu dan membuat situs ini bekerja dengan lebih baik dan lebih cepat.
Jadi, saya mendapat situs web untuk perusahaan besar, yang ditulis pada paruh pertama tahun 2000-an. Dalam proyek ini, semuanya didasarkan pada kelas dengan satu metode, di mana semuanya terjadi: bekerja dengan logika, dan menampilkan antarmuka (tampilan) dan mengakses database, terlebih lagi, sql ada di sana di antara perintah
print "<table>";... Mengedit situs web yang menjalankan kode seperti itu, dengan lalu lintas yang baik dan komponen komersial, bukanlah peristiwa yang paling menyenangkan, tetapi sangat menyenangkan.
Mudah ditebak bahwa saya membuat kehidupan developer backend jauh lebih mudah dengan terlebih dahulu menghadirkan keluaran tata letak ke dalam template. Untuk ini saya menggunakan mesin templat ranting yang sudah jadi dan agak populer. Itu mudah dan cepat, jadi saya bahkan tidak menghabiskan banyak waktu untuk merefaktornya. Langkah selanjutnya, menurut saya, adalah melakukan sesuatu dengan query ke database, lagipula MVC tidak sia-sia begitu populer di web kita.
Setelah melihat Symphony dan Laravel, saya memutuskan bahwa pendekatan ORM akan cocok di sini juga. Ini akan membantu untuk melakukan pekerjaan dengan Database dan pergi untuk sementara waktu tidak-untuk-pengontrol hanya bekerja dengan data yang sudah diterima. Adalah logis dan sepenuhnya benar untuk menggunakan solusi yang ada. Oleh karena itu, pertama-tama, saya bergegas ke pembuat paket untuk melihat alternatif apa yang saya miliki selain Doktrin, tetapi setelah berpikir dengan hati-hati, saya sampai pada kesimpulan yang mengecewakan bahwa itu tidak begitu penting. Intinya adalah proyek ini memiliki struktur data yang agak tidak biasa. Saya belum pernah melihat hal seperti itu di tempat lain, meskipun saya bekerja dengan MODx :) Saya menghadapi masalah: menggunakan ORM open-source populer seperti yang saya inginkan tidak akan berfungsi, yah, setidaknya ini akan menjadi petualangan lain. Jadi saya memutuskan untuk membuat sepeda.
Sedikit tentang apa yang saya lakukan
Ya, saya memutuskan bahwa saya akan menulis ORM dalam PHP dari awal (tidak, yah, saya punya ide dan konsep yang dipinjam dari Docktrine yang sama) khusus untuk proyek ini, sehingga berfungsi dengan struktur data. Bagaimanapun, ini adalah situs yang berfungsi, dan tidak ada yang siap mengalokasikan sumber daya pemrogram untuk tugas "menulis ulang semuanya dari awal dengan struktur database normal". Para nenek moyang yang mendirikan CMS ini membuat 2 jenis objek, dan salah satunya juga dibagi menjadi "tipe data" internal: sumber daya yang memiliki tanggal, tautan, berbagai jenis teks, gambar, dan sejumlah jenis lainnya disimpan dalam 2 tabel, tetapi ada juga objek disimpan dalam satu tabel, saya pikir mereka bisa disebut data sistem.
Saya tidak ingin memikirkan tentang join saat menerapkan panggilan ke model, atau setidaknya mencoba mengurangi momen seperti itu seminimal mungkin. Oleh karena itu, saya memutuskan bahwa model harus terdiri dari dua jenis: untuk objek tabel tunggal dan untuk objek dua tabel dasar. Karena kelas Model ini memiliki banyak metode umum, ORDER BY atau LIMIT yang sama, oleh karena itu, setiap kelas dasar, atas dasar Model yang konkret akan dibuat, saya mewarisi dari kelas Abstrak umum.
Seperti yang Anda lihat dari pohon, saya juga menambahkan dukungan untuk berbagai jenis Database, yang berlebihan dalam kasus ini. Tetapi pada saat itu saya memasuki "aliran" dan membuat :). Juga, langkah yang paling benar dalam kasus ini adalah saya melakukannya berdasarkan PDO, karena php-mysql yang digunakan dalam kode tidak memungkinkan menerjemahkan situs ke dalam versi bahasa ketujuh, dan saya ingin memperbaikinya di root, seperti yang mereka katakan.
$element = (new Model())->getOne($id);
Karena fakta bahwa saya memiliki pemahaman yang baik tentang logika struktur Basis data, saya dapat mencari dan mengambil sumber daya hanya dengan ID-nya, tanpa mengetahui jenis data internal apa yang dimiliki sumber daya, yang diperlukan dengan pendekatan lama. Objek nyata bekerja dengan data, dan kita lupa tentang sql di kodenya.
Paragraf terakhir ...
Pekerjaan ini membawa 2 putaran tak terduga bagi saya. Pertama, saya mencoba menulis semuanya sekaligus dalam bentuk kode, dan tidak ada yang berhasil. Saya harus mengambil pena, buku catatan, pergi ke alam, dan mendengar kicauan burung pipit dan dengungan lebah, pertama menggambar apa yang ingin saya dapatkan, bagaimana itu akan terhubung, kelas apa yang saya butuhkan, dan bagaimana itu akan disebut dalam kode "pengontrol". Ngomong-ngomong, maka penerapannya hanya sedikit berbeda dari sketsa aslinya. Jadi, jika seorang programmer tidak membuat kode apa pun, itu tidak berarti bahwa dia tidak melakukan sesuatu yang berguna.
Kedua, saya melakukannya dengan sangat cepat, banyak bisnis tidak suka ketika pemrogram menghabiskan waktu untuk segala macam pemfaktoran ulang yang tidak dapat dipahami. Saya mengimplementasikan keseluruhan proyek dalam waktu sekitar satu minggu, sekaligus melakukan tugas untuk implementasi fitur baru.
Saya akan mencatat keuntungan yang saya nyatakan di awal artikel: urutan dan gradual dari penggantian kode yang ada pada proyek kerja, yang berarti bahwa tidak perlu mengalokasikan lebih banyak waktu untuk transisi, refactoring kode dalam kerangka tugas yang masuk. Mengenai hal ini saya pamit, terima kasih telah membaca.