Alat atau teknik apa yang berguna untuk menggambarkan basis kode yang tidak dikenal? [Tutup]

9

Ketika secara manual memeriksa kode yang tidak dikenal (untuk meninjau atau memodifikasi), saya sepertinya memiliki tiga opsi.

  • Sebuah top-down membaca kode, memilih setiap berkas sumber berikutnya dengan cara yang mendasar nama file tampaknya. Saya biasanya membaca hampir semuanya. Beberapa file dua kali.
  • Sebuah lebar-pertama membaca , di mana saya menemukan dan membaca semua metode memohon dengan pemahaman minimal. Kemudian baca semua fungsi yang dipanggil fungsi, dan seterusnya. Tumpukan mental saya cenderung meluap jika saya membuat beberapa panggilan mendalam.
  • Sebuah membaca depth-first , di mana aku melangkah melalui semua kode di debugger, tidak yakin apakah ini akan mengambil 8 menit atau 8 jam.

Setelah saya cukup membaca kode untuk memiliki pemahaman yang cukup kuat tentang apa yang dilakukannya, saya sering mencerminkan bahwa saya telah membaca 80% atau lebih basis kode, sementara kode dasarnya adalah 20% atau kurang . Saya sudah membuang banyak waktu.

Alat apa yang berguna untuk memahami kode asing secara cepat? Apakah ada alat yang dapat memberikan "gambaran besar" dari jalur kode kritis dan memungkinkan saya untuk menelusuri rincian setiap bagian?

Drew Dormann
sumber
2
tanpa memahami 80% persen Anda tidak dapat memahami mengapa 20% adalah bagian mendasar
ratchet freak
@ scratchetfreak Saya tidak akan mengatakan itu dengan syarat absolut. Alat dapat mengisolasi kode yang selalu disebut, misalnya. Atau hanya menjalankan banyak level stack.
Drew Dormann

Jawaban:

8

Hal terbaik, tentu saja, bagi seseorang yang tahu basis kode untuk memandu Anda melewatinya. Jika itu bukan opsi, maka ada beberapa alat yang dapat membantu Anda.

  • VisualStudio dapat secara otomatis menghasilkan diagram kelas UML dari basis kode. Paling tidak itu akan menunjukkan hierarki kelas.
  • Doxygen bisa sangat membantu. Sekalipun kode tersebut tidak memiliki komentar gaya doxygen, doxygen masih dapat menghasilkan dokumentasi yang dapat dibaca, diagram kelas, dan grafik panggilan, yang dapat sangat membantu untuk menemukan jalan Anda di sekitar basis kode yang tidak dikenal.

Secara umum, Anda juga ingin menggunakan IDE berfitur lengkap, di mana Anda dapat mengklik kanan apa saja dan "masuk ke definisi". Ini dapat menghemat banyak waktu, dibandingkan dengan menggunakan grep pada banyak file dalam struktur direktori yang kompleks.

Hal penting lainnya, tergantung pada berapa lama Anda harus berurusan dengan kode. Jika ada unit test, maka lihatlah melalui tes. Jika tidak ada tes, mulailah menulisnya. Bentuk hipotesis tentang apa yang dilakukan kelas atau fungsi tertentu, dan tulis tes untuk mengujinya. Ini membutuhkan banyak disiplin, tetapi ini adalah cara yang bagus untuk mendapatkan jawaban tentang apa yang terjadi dalam kode.

Dima
sumber
2
Terima kasih @ima. Doxygen sangat hebat dalam menangani beberapa hal itu. (Saya tidak ingin mengarahkan jawaban dengan menjatuhkan satu nama alat yang saya tahu). Kudos pada komponen "interaksi manusia" berkepala dingin juga. :)
Drew Dormann
3

Ini adalah pendekatan yang lebih drastis. Teknik ini mungkin berguna untuk proyek yang memiliki banyak kelas yang tidak diatur ke dalam ruang nama yang bermakna.

Tujuan latihan ini adalah untuk menemukan hubungan kelas. Buat tiruan sekali pakai dari proyek, dan kemudian coba untuk menempatkan beberapa kelas ke dalam ruang nama. Untuk menghemat waktu pada upaya berulang, gunakan beberapa alat pemrosesan file Regex untuk mengotomatiskan perubahan ini.

Ini akan menyebabkan banyak kesalahan kompiler. Dalam proses memperbaiki kesalahan ini, orang akan memiliki pemahaman yang lebih baik tentang bagaimana kelas-kelas ini saling bergantung satu sama lain, dan memutuskan kelas apa yang bisa dimasukkan ke dalam namespace yang sama.

Teknik ini berguna karena seseorang dapat menerapkannya bahkan dengan sedikit pemahaman tentang organisasi kode proyek. Dengan ini muncul risiko bahwa beberapa kelas bisa salah tempat oleh teknik ini karena kesalahpahaman.

rwong
sumber
Itu pintar. Apakah Anda biasanya melakukan itu untuk banyak kelas atau Anda menyimpannya ketika Anda menemukan kelas tertentu yang tidak jelas bagi Anda?
Drew Dormann
@DrewDormann Saya belajar teknik ini dari salah satu kolega saya ketika dihadapkan dengan 100-an kelas yang tidak dikelompokkan. Ini adalah langkah pertama menuju "menyortir" file proyek, sebelum refactoring apa pun terjadi. Dengan kata lain, ini digunakan ketika semuanya masih berantakan. (Yang memalukan, kekacauan itu ditulis oleh diri saya sebelumnya.) Dengan menyortir file proyek menjadi ruang nama, itu memfasilitasi generasi halaman kelas Doxygen (dengan menampilkan pohon namespace) dan juga mempercepat pemahaman programmer.
rwong