Ini adalah versi refactoring dari Kata Refactoring Gilded Rose asli di PHP. Paket dilengkapi dengan pengujian unit PHP yang dibuat, pemfaktoran ulang selesai, dan fitur baru ditambahkan.
Persyaratan Gilded Rose dapat ditemukan di sini.
php-xml
. Ikuti saja petunjuk di layar.Untuk menginstal proyek yang Anda butuhkan:
git clone [email protected]:mantis4444/gilded-rose-refactoring-kata-php.git /desired/directory
.cd /desired/directory
.composer install
proyek. Perhatikan bahwa jika Anda melakukannya pada OS Windows, Anda perlu menggunakan alih-alih
/
untuk pemisahan direktori.
texttest_fixture.php
dengan perintah php src/texttest_fixture.php
.src/texttest_fixture.php
../vendor/bin/phpunit
.Perhatikan bahwa petunjuk ini mengasumsikan bahwa Anda berada di direktori proyek.
Saya mempertahankan gaya pengkodean asli untuk beradaptasi dengan situasi saat ini. Meskipun saya ingin menggunakan standar dan namespace PSR. Hasilnya aplikasi mendukung input asli, sehingga file texttest_fixture.php
tidak disentuh.
Pertama-tama saya melakukan tes untuk memastikan bahwa kode asli berfungsi dengan baik dan ternyata memang demikian, meskipun struktur algoritmanya berantakan. Kemudian proses refactoring dimulai. Pada awalnya saya mengecilkan fungsi update_quality()
sebanyak mungkin. Kode menjadi lebih mudah dibaca, tetapi masih terlalu banyak kondisional if
dan saya tidak melihat cara untuk meminimalkannya.
Setelah melakukan beberapa analisis saya menyadari bahwa Polimorfisme adalah solusinya. Pertama-tama saya membuat kelas item yang ditingkatkan yang disebut ItemEnhanced
yang memperluas kelas Item
asli dan tak tersentuh untuk meningkatkan fungsinya. Tantangan pertama adalah meningkatkan Item dan mendukung kode instruksi asli. Sementara kode asli menyiapkan item dengan kelas Item
, saya harus menemukan cara untuk meningkatkan item tanpa mengubahnya. Saya berhasil melakukannya di konstruktor inisialisasi aplikasi GildedRose , meningkatkan Item sambil mengaturnya. Untuk meningkatkan objek item asli juga, saya menggunakan tautan referensi.
Sekarang kelas ItemEnhanced
memiliki fungsi yang dimiliki oleh semua jenis item. Pada langkah selanjutnya saya membuat kelas untuk setiap jenis item yang memiliki fungsi khusus masing-masing. Mereka memperluas kelas ItemEnhanced
sehingga menjadi Item
asli juga. Fungsi ItemEnhanced
yang hanya digunakan di kelas tipe item tersebut dilindungi untuk aksesibilitas di kelas tipe item saja.
Setelah pemfaktoran ulang selesai, pengujian berhasil dilewati. Sekarang saatnya menambahkan fungsi baru. Memiliki struktur aplikasi yang baru, hal itu mudah dilakukan. Pertama saya membuat kelas tipe item baru untuk item "Sulap" dengan aturan spesifiknya. Lalu saya membuat tes baru untuk itu.
Voila semuanya berfungsi dengan baik, kode jauh lebih mudah dibaca dan fleksibel. Menurut saya, tes ini masih bisa ditingkatkan. Mereka mungkin lebih spesifik dibandingkan sekarang.