Bagaimana cara mendekati refactoring aplikasi web yang ada?


11

Saya telah membaca dan banyak berpikir belakangan ini, dan saya sampai pada kesimpulan bahwa saya mungkin saya harus memikirkan kembali strategi pengembangan web saya. Saya melakukan banyak pemrograman on-the-fly, dan dalam 2 tahun saya telah mengerjakan aplikasi web PHP, apa yang mungkin telah dimulai sebagai alat kecil menjadi proyek yang cukup besar. Tetapi ada satu ton kode warisan dari saya dan pendahulu saya, potongan kode yang mungkin masuk akal pada saat itu, tetapi sekarang saya mempertanyakan kegunaan kode tersebut dalam bentuk sebenarnya. Selain itu, hal-hal seperti pengujian unit dan Pengembangan Berbasis Tes tidak ada dalam lingkup saya sampai baru-baru ini.

Jadi bagaimana Anda mendekati refactoring aplikasi web? Apa yang harus saya cari dan dalam urutan apa? Bagaimana dengan game browser versus aplikasi web fungsional? Apakah akan ada perbedaan dalam pendekatan?


4
Jika tidak rusak, jangan memperbaikinya. Luangkan lebih banyak waktu menulis tes, dan sedikit waktu membuat perubahan yang tidak perlu.
Macneil

Hanya karena ketertarikan. Bahasa / teknologi apa yang Anda gunakan untuk menulis aplikasi Anda? Situs apa itu? Lihat welie.com/patterns -> Konteks desain -> Jenis situs
JW01

@ JW01 Saya menggunakan PHP untuk logika internal dan AJAX untuk manajemen tampilan dan validasi formulir. Ini akan menjadi varian dari pola Aplikasi berbasis web tetapi hanya tersedia di lingkungan tertentu, karena merupakan alat internal.
Eldros

Saya memiliki gambaran yang sangat berbeda dari aplikasi Anda di kepala ketika saya menjawab pertanyaan itu. Anda memiliki lebih banyak kebebasan untuk mengubah API daripada jika berada di domain publik.
JW01

@ JW01 Saya tidak ingin terlalu spesifik, karena saya ingin pertanyaan ini bermanfaat bagi orang lain juga.
Eldros

Jawaban:


6

Hampir sama dengan cara Anda mendekati segala jenis kode warisan. Anda menemukan bagian yang dapat diuji, Anda menulis tes untuk itu, dan refactor.

Jika Anda tidak dapat menemukan bagian yang dapat diuji dengan mudah, Anda harus membuatnya dapat diuji tanpa menggunakan safety suite, dalam hal ini Anda sangat hati-hati mengubah beberapa bagian kode yang hampir dapat diuji sehingga dapat diuji.

Kode yang tidak membuat hal-hal ke browser - kode "infrastruktur", model, hal-hal yang menyentuh database - mungkin tempat yang baik untuk memulai.

Sunting: Pengujian UI: Dengan peringatan bahwa saya memiliki sedikit pengalaman di sini, seorang teman saya melakukan ini: ia menjalankan beberapa kode penghasil HTML. Kemudian ia meretas kodenya, dan membandingkan kode yang baru dibuat dengan versi yang lama (menggunakan diff; ia belum mengotomatiskan sepenuhnya). Perubahan pada HTML berarti refactoring Anda rusak.


Bagaimana Anda menyarankan untuk menguji bagian "tampilan" dari aplikasi lawas - IE, bagian HTML / JavaScript / CSS / dll? Saya setuju pengujian unit adalah cara yang harus dilakukan, tetapi pengujian kode aplikasi tampaknya sulit untuk diotomatisasi.
Justin Ethier

saat membuat tes untuk UI web - membandingkan HTML lama dengan HTML baru adalah cara yang agak rapuh dalam melakukan sesuatu. Saya cenderung mengidentifikasi semantik halaman web dan mengujinya. Yaitu bertanya "Apakah cetakan web (judul halaman, judul, kata kunci, tautan keluar, formulir) berubah?" bukan "Sudahkah HTML berubah?".
JW01

Anda dapat menguji aplikasi web dengan 'browser tanpa kepala' - pada dasarnya perpustakaan yang untuk tes unit apa browser untuk pria QA. Di dunia java, ada HTMLUnit (java murni, mandiri) dan WebDriver (remote-kontrol browser nyata seperti FireFox). Proyek saya memiliki serangkaian ratusan tes yang ditulis seperti ini.
Tom Anderson

@ JW01 Kamu benar sekali - sangat rapuh. Ini bagus untuk menguji sebuah refactoring dengan cara yang sudah-sekali saja: Anda dapat memeriksa bahwa refactoring tidak mengubah output, tetapi setiap kali Anda mengubah HTML yang dihasilkan, Anda harus menyimpan HTML "yang diharapkan".
Frank Shearar

10

Ada buku bagus tentang ini yang disebut "Bekerja Efektif dengan Kode Legacy" oleh Michael Feathers. Mari kita hadapi itu, kita semua memiliki kode warisan.

Yang utama adalah menguji-drive kode baru yang Anda buat. Karena Anda harus menyentuh potongan kode lain, Anda akan menemukan peluang untuk mendapatkannya juga. Ini adalah proses yang panjang dan lambat, tetapi jika Anda melakukannya secara sistematis, Anda dapat benar-benar meningkatkan keseluruhan produk dari waktu ke waktu.


3
"Mari kita hadapi itu, semua yang kita lakukan adalah menulis perangkat lunak warisan besok hari ini." - Martin Fowler
Frank Shearar

3
  • Ya - Aplikasi Web berbeda dengan Situs Web

Saya akan memperlakukan mereka secara terpisah. Jika Anda memiliki satu bagian dari situs Anda yang hanya kumpulan dokumen (yang terlihat sama untuk pengguna anonim dan pengguna yang masuk sama) - maka metode penataan terbaik sangat berbeda dari aplikasi web yang melayani halaman yang berbeda secara dinamis untuk setiap pengguna. Membagi dua bagian situs menjadi dua aplikasi / komponen dan menangani masing-masing bagian secara berbeda.

  • Mulai Menggunakan Kontrol Versi

Setelah kode Anda berada di bawah kontrol versi, Anda dapat melewati dan, dengan percaya diri, menghapus semua kode yang tidak perlu yang sebelumnya Anda simpan 'berjaga-jaga' dll. Saya tidak tahu bagaimana saya bertahan tanpa kontrol versi.

  • Kurangi infinitas

Jika empat url berbeda semuanya menunjuk ke sumber yang sama, maka masalahnya jauh lebih besar. Anda akhirnya berurusan dengan jumlah url yang tak terbatas. Segera setelah Anda bisa, pastikan Anda memiliki kebijakan Normalisasi URL. Setelah selesai, Anda dapat mulai melampirkan makna semantik ke URL dan dapat melakukan pencarian terbalik dari sumber daya ke url. Ini memungkinkan Anda untuk memisahkan 'jejak web' dari 'sumber daya' situs.

Anda harus bertanya pada diri sendiri, "diberi url apa bentuk normalnya?". Setelah Anda mendapatkan ini ditembaki. Maka 50.0000+ url di situs Anda dapat dikurangi menjadi, 2.000. yang jauh lebih mudah untuk dipahami dan dikelola dalam pikiran Anda.

lihat: http://www.sugarrae.com/be-a-normalizer-a-c14n-exterminator/

  • Mulailah dengan memodelkan 'apa itu', bukan 'apa yang Anda inginkan'

Jika Anda merapikan situs warisan, yang tidak dirancang dengan praktik terbaik sejak awal, maka tergoda untuk melompat dari 'kekacauan' ke 'desain ideal'. Saya percaya bahwa Anda perlu melakukannya setidaknya dalam dua langkah: 'mess' -> 'kode warisan model yang baik' -> 'kode baru yang ideal dengan fitur yang ditambahkan'. Berhenti menambahkan fitur. Berkonsentrasi pada memperbaiki kekacauan atau merangkumnya di balik lapisan anti-korupsi. Hanya dengan begitu, Anda dapat mulai mengubah desain menjadi sesuatu yang lebih baik.

Lihat: http://www.joelonsoftware.com/articles/fog0000000069.html

Lihat: http://www.laputan.org/mud/

  • Mengujinya adalah ide yang bagus.

Buat test suite / kerangka kerja dan mulai menambahkan tes. Tapi, cukup sulit untuk menguji beberapa kode lama. Jadi, jangan terlalu terpaku. Selama Anda memiliki kerangka kerja di sana, Anda dapat menambahkan tes sedikit demi sedikit.

Lihat: http://www.simpletest.org/en/web_tester_documentation.html

  • Milikilah keberanian dalam keyakinan Anda

Sebagian besar literatur tentang praktik terbaik pengembangan perangkat lunak adalah desktop-centric / Enterprise App Centric. Ketika situs Anda berantakan, Anda membaca buku-buku ini dan Anda bisa kagum pada kebijaksanaan yang keluar dari mereka. Tapi, jangan lupa bahwa sebagian besar praktik terbaik ini telah terjadi sebelum web / SEO menjadi penting. Anda tahu banyak tentang web modern, lebih dari yang disebutkan dalam buku-buku klasik seperti POEA, Gof dll. Ada banyak hal yang bisa diambil darinya, tetapi jangan sepenuhnya membuang pengalaman dan pengetahuan Anda sendiri.


Saya bisa melanjutkan. Tetapi itu adalah beberapa hal yang saya pilih ketika refactoring situs lama menjadi situs baru yang mengkilap.


Tautan referensi yang bagus!
Nilesh

2

Sebelum melakukan apa pun, yang terbaik untuk memiliki proyek Anda dalam kontrol sumber. Dengan cara ini, Anda dapat mengembalikan perubahan, atau bekerja pada perubahan besar pada cabang terpisah, serta menandai tonggak.

Selanjutnya, tulis tes untuk kode apa pun yang Anda rencanakan untuk diubah. Anda tidak perlu keluar sekaligus, menulis tes untuk semuanya. Apa yang Anda rencanakan untuk segera dikerjakan. Teorinya berjalan bahwa diberikan waktu yang cukup, sebagian besar basis kode akan ditanggung oleh tes. Perhatikan bahwa beberapa refactoring "aman" untuk dilakukan tanpa tes - ini didokumentasikan dalam buku Kode Warisan yang disebutkan sebelumnya, dan tidak diragukan lagi di tempat lain.

Dengan tes di tempat untuk bagian kode, ubah kode. Lakukan apa pun yang Anda perlu, selama tes masih berlalu.

Bahkan dengan kode lawas, Anda dapat melakukan TDD jika membuat penambahan atau perubahan. Cukup tulis tes terlebih dahulu untuk perubahan yang Anda antisipasi, lihat gagal, lalu lakukan perubahan.

Beberapa alat mungkin berguna di sini. NDepend dapat menunjukkan kode yang sangat berpasangan dan aroma lainnya. NCover melacak level cakupan kode Anda. FxCop pada dasarnya adalah pemeriksa kebenaran kode, di luar apa yang dikompilasi oleh kompiler. Ini semua adalah alat yang berguna untuk berguna bagi proyek dengan ukuran nyata, terutama variasi warisan.

Pada akhirnya, ini adalah proses multi-langkah. Jangan mencoba melakukan semuanya sekaligus, cukup lakukan sedikit demi sedikit.


-2

Jika itu cukup jelek untuk membuatku jengkel, itu cukup jelek bagiku untuk menghapus semuanya dan menulis setetes pengganti.

Anda akan menemukan bahwa lebih sering daripada tidak, dibutuhkan jumlah waktu yang sama untuk melakukan ini, seperti halnya untuk duduk di sana dan berjinjit di sekitar kekacauan yang tidak terorganisir dan tidak terdokumentasi dan membelai itu dengan lembut.


2
Saya tidak setuju (meskipun saya tidak memberi Anda -1). joelonsoftware.com/articles/fog0000000069.html
JW01

1
Benar-benar terlalu banyak keputusan situasional untuk secara akurat membela diri. Saya mungkin tidak melakukan ini ketika saya sedang mengerjakan pustaka Objective-C yang besar, namun, saya tidak punya keraguan untuk menulis pustaka javascript yang sama sekali baru.
Sneakyness

Ide yang sangat buruk! Saya berharap saya telah membaca artikel oleh Joel Spolsky yang @ JW01 ditautkan 2 tahun yang lalu sebelum saya memutuskan untuk menulis ulang aplikasi PHP yang ada menggunakan Angular & Bootstrap. Angular & Bootstrap adalah teknologi hebat tapi saya MASIH mencoba mengonversi aplikasi lama ini 2 tahun kemudian. Seharusnya saya baru saja memodifikasi aplikasi yang ada dan tidak robek / diganti.
Zack Macomber

Saya setuju terutama ketika memperhitungkan komentar Anda. "skenario" adalah hal utama yang menentukan keputusan. Haruskah Anda merobek API besar yang melayani seluruh bisnis Anda? Siapa tahu, ada banyak yang harus dipertimbangkan. Anda ingin tes sebelum untuk menguji sesudahnya. Artikel yang ditautkan terlalu linier, seperti ada satu ukuran yang cocok untuk semua, tetapi bagaimana dengan ketika ada yang bermasalah, atau kode yang benar-benar tua? Apakah artikel tersebut benar-benar menyarankan agar kita tidak beralih dari warisan dengan kode yang lebih baru agar lebih mudah dibaca dan dipelihara? Tidak ada hitam dan putih di dunia dev, hanya skenario dan keputusan
James
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.