Setelah pemfaktoran ulang
Sebaiknya hal ini dicegah sejak awal.
Anda hanya dapat mengetahui kesalahan pemfaktoran ulang semacam ini dengan menjalankan pengujian setelah setiap langkah pemfaktoran ulang. Kesalahan ini juga akan muncul, karena foo['blubb']
disetel ke nilai tertentu dan ini akan menyebabkan efek yang tidak diinginkan pada pengujian lain - tidak hanya pada pengujian logika penyetel.
Kami menggunakan tes, tetapi terkadang Anda melewatkan banyak hal...
Ya, sering kali cakupannya tidak cukup tinggi. Itu sebabnya memiliki cakupan pengujian yang baik adalah titik awal untuk semua pemfaktoran ulang.
Kedua baris ini tidak berwarna hijau dalam laporan cakupan Anda:
if(!isset($this->bla['blubb'])) {
$this->foo['blubb'] = $value;
Selain itu, mohon jangan menimpa metode ajaib. Saya tidak ingin memiliki sifat/abstrak apapun di setiap kelas.
Anda telah mengecualikannya, tapi itu salah satu cara untuk menangkap properti: dengan menggunakan fungsi ajaib __set()
(untuk vars yang tidak dapat diakses) atau property_exists()
atau penggunaan kelas Reflection*
untuk menemukan.
Sekarang, sudah terlambat, Anda ingin alat lain menangkap kesalahan tersebut, oke:
Alat ini perlu mengurai file PHP dan induknya (karena cakupan variabel) dan menemukan $this->bla
tanpa deklarasi variabel public|private|protected
sebelumnya (properti kelas). Ini tidak akan menunjukkan jenis kesalahan yang sebenarnya, hanya saja bla itu diakses tanpa deklarasi.
Ini mungkin untuk diterapkan sebagai aturan CodeSniffer.
Anda juga dapat memberikan http://phpmd.org/ atau https://scrutinizer-ci.com/ coba. Dan, jika Anda menggunakan PHP7: https://github.com/etsy/phan
tl;tr
Sulit untuk menentukan kesalahan sebenarnya dan konteksnya tanpa menjalankan, mengevaluasi, dan menganalisis kode yang mendasarinya. Coba pikirkan tentang nama variabel dinamis dan Anda tahu alasannya: Anda bahkan tidak mengetahui nama properti dengan melihat kode sumbernya, karena properti tersebut dibuat secara dinamis selama aliran program. Penganalisis statis tidak akan menangkapnya.
Penganalisis dinamis harus melacak semua hal, di sini $this->
mengakses dan akan mempertimbangkan konteksnya: !isset(x). Evaluasi konteks dapat menemukan banyak kesalahan pengkodean yang umum. Pada akhirnya Anda dapat membuat laporan: mengatakan bahwa $this-›bla diakses hanya 1 kali dan itu menunjukkan bahwa
- properti yang dideklarasikan secara dinamis telah diperkenalkan, namun tidak pernah digunakan kembali, dengan saran agar Anda menghapusnya atau mendeklarasikannya sebagai properti kelas
- ATAU dengan evaluasi konteks tambahan: bahwa dan ketika variabel ini diakses dari dalam isset() - kunci properti yang tidak dideklarasikan yang tidak ada diakses, tanpa set() sebelumnya, dll.
person
Jens A. Koch
schedule
13.01.2016
$this->bla
dapat didefinisikan di kelas induk. Codesniffer bekerja pada tingkat file/token, dan jika Anda mengikuti standar pengkodean PSR, ia tidak akan mengetahui struktur kelas induk (karena berada dalam file terpisah). - person weirdan   schedule 08.01.2016