Apakah ada alat refactoring C ++ yang berfungsi? [Tutup]


161

Adakah yang tahu alat refactoring berfitur lengkap untuk C ++ yang dapat diandalkan dengan basis kode besar (sekitar 100.000 baris)?

Saya mencoba apa pun yang dapat saya temukan berulang kali selama beberapa tahun terakhir: SlickEdit, Eclipse CDT. Mereka semua sama sekali tidak dapat digunakan.

RINGKASAN : Saya mengambil waktu dan mengevaluasi "Visual Assist X" serta "Refactor for C ++". Keduanya memiliki beberapa fitur yang mengesankan, tetapi keduanya juga jauh dari sempurna. Mengekstraksi sejumlah besar kode biasanya tidak memuaskan tanpa modifikasi manual - dan karena itu tidak membuahkan hasil.

"Visual Assist X" memiliki fitur-fitur yang bagus seperti pelengkapan otomatis yang jauh lebih lengkap, dll. Tetapi itu menyebabkan banyak kedipan dan melambat pada titik-titik tertentu.

Oleh karena itu menurut saya jawabannya adalah: "Tidak, tidak ada alat refactoring siap produksi untuk C ++"

UPDATE Maret 2015 Adapun balasan hdoghmens hari ini saya mencoba Resharper untuk C ++. Tautannya https://www.jetbrains.com/resharper/ tidak mengatakan apa-apa tentang C ++. Tetapi saya menemukan Resharper C ++ yang diumumkan lebih dari setahun yang lalu di sini:

https://www.jetbrains.com/resharper/features/cpp.html

Saya mencobanya dengan VC2010 menggunakan basis kode 20MB.

Tes 1: Ekstrak Metode: menghasilkan pengecualian Pengambilan Ulang. Tidak ada kode sumber yang diubah.

Tes 2: Ekstrak Metode dengan sumber berbeda: Berfungsi baik

Tes 3: Ubah tanda tangan dari fungsi yang diekstraksi: Menghasilkan kode C ++ yang rusak:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

Mungkin itu sebabnya C ++ tidak terdaftar di halaman utama.

Menurut pendapat saya jawaban untuk pertanyaan ini masih "TIDAK" .


11
Favorite'd yang satu ini. Masalah dengan C ++ adalah sintaksnya yang sangat kompleks, konteks-sensitif. Tanpa benar-benar mem-parsing sumber lengkap, Anda tidak dapat yakin apa arti pengidentifikasi.
DevSolar

Lihat juga: stackoverflow.com/questions/249827/... tetapi tidak banyak yang ditawarkan
dmckee --- ex-moderator kitten

4
Eclipse benar-benar berfungsi dengan cukup baik, Anda hanya perlu mengizinkannya menggunakan lebih banyak memori dengan mengedit eclipse.ini
n0rd

3
Jika Anda masih memonitor alat refactoring untuk C ++, harap pertimbangkan bahwa kami di JetBrains saat ini sedang mengerjakan dukungan C ++ di ReSharper dan IDE lintas-platform C ++ yang terpisah
Jura Gorohovsky

1
@RED SOFT ADAIR Anda terkenal. Periksa youtu.be/RT46MpK39rQ?t=1611
George C.

Jawaban:


38

Saya menemukan Visual Assist X dengan Visual Studio sangat berguna. Pilihan lain adalah Refactor untuk C ++ .


8
Sayangnya, Refactor untuk C ++ tidak berfungsi dengan baik (jika ada) dengan basis kode yang besar.
Daniel Rose

1
Apa yang secara khusus terjadi dengan Refactor untuk C ++ dan basis kode besar?
Ira Baxter

2
@IraBaxter Itu hanya rusak. Opsi refactoring tidak muncul atau tidak lengkap. Ada pesan kesalahan aneh atau tidak ada sama sekali.
Daniel Rose

4
Refactor untuk C ++ tidak bekerja dengan baik bahkan untuk basis kode kecil, itu rusak dan tidak dapat digunakan sama sekali.
kovarex

3
@Nils: dapatkah Anda memberikan contoh spesifik tentang apa yang tidak dimengerti?
Ira Baxter

41

Visual Assist dan Visual Studio membuat berurusan dengan basis kode besar jauh lebih mudah. Bantuan visual bagus dalam melacak bagaimana kelas atau anggota digunakan dan lebih efektif dalam penamaan ulang tanpa kesalahan positif daripada pencarian dan penggantian.


23

Saya berharap dentang akan secara signifikan mengubah lanskap alat refactoring C ++ di luar sana selama beberapa tahun ke depan. Ini adalah kompiler modular open-source yang memaparkan API untuk mengurai dan menganalisis secara semantik kode C ++. IDE dan alat-alat lain akan dapat menggunakan API ini daripada melakukan pekerjaan yang sulit untuk menulis penganalisa parser dan semantik mereka sendiri.

Google sudah membuat alat refactoring skala besar menggunakan dentang .


2
Tetapi apakah ada beberapa hasil yang bisa digunakan oleh manusia biasa di luar Google?
Jan Hudec

1
@JanHudec: Lihat tutorial yang ditautkan dari sini: comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4

17

Mozilla memiliki alat refactoring sendiri bernama Pork ( Wiki , Developer Wiki ). Berikut adalah blog pengembang di belakang Pork. Dari apa yang saya baca, daging babi berhasil digunakan dalam refactor di Mozilla.

Daging babi seharusnya membantu jika Anda berasal dari * nix land, untuk Visual Studio saya juga merekomendasikan Visual Assist.


9

Perangkat Rekayasa Ulang Perangkat Lunak DMS kami adalah mesin transformasi yang dirancang untuk melakukan transformasi kompleks pada sejumlah besar kode, termasuk C ++. Ini telah digunakan untuk membuat perubahan yang dapat diandalkan pada sistem jutaan baris kode. Ini beroperasi dengan menggunakan penganalisis dan transformator langauges yang akurat-kompiler.

Ini memiliki parser C ++ lengkap dengan resolusi nama dan tipe, membangun AST kode, dapat menerapkan transformasi prosedural atau sumber-ke-sumber (dengan sintaks permukaan C ++) untuk merevisi pohon-pohon tersebut, dan membuat kembali keluaran yang dapat dikompilasi dengan komentar yang dipertahankan. (Sunting: 7/1/2011: Sekarang apakah C ++ 1X sejauh kita memahami standar :)

Ini telah digunakan pada proyek rekayasa ulang skala besar, termasuk pembuatan ulang komponen C ++, dan 100% terjemahan sepenuhnya otomatis antara bahasa. Anda dapat membaca tentang ini di situs web.

DMS juga digunakan untuk membangun alat analisis sumber sewenang-wenang. Contohnya termasuk deteksi kloning, cakupan pengujian, perbedaan cerdas (perbandingan struktur kode sumber dan operasi pengeditan abstrak daripada garis dengan memasukkan dan menghapus sederhana), dll.

Apa yang tidak (saat ini) adalah alat refactoring interaktif. Kami percaya bahwa untuk melakukan sebagian besar refactoring dengan baik, Anda perlu kontrol mendalam dan analisis data. DMS memiliki mesin generik untuk mendukung hal ini, dan mesin tersebut diimplementasikan untuk C, COBOL dan Java pada saat ini, dengan C ++ menjadi yang berikutnya. Ini adalah pekerjaan yang sulit. Anda tidak akan melihat banyak alat refactoring C ++ yang serius dari siapa pun sampai masalah seperti ini diselesaikan dengan baik. Pertama, Anda membutuhkan parser C ++ lengkap: -}

EDIT 7/5/2011: Sepertinya kita akan berlari di versi interaktif. Kami telah memenangkan Departemen Energi Tahap I SBIR untuk menyelidiki bagaimana melakukan ini. Lihat http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Cari Desain Semantik di bawah "Texas"). Jangan berharap hasil terburu-buru; ini hanyalah awal dari program multi-tahun 3 fase untuk mendapatkan alat.

EDIT 8/11/2011: Kemajuan pertama ... kami sekarang menangani semua arahan C ++ 0x dan OpenMP.

EDIT 1/4/2012: Apakah analisis aliran kontrol penuh kode C ++.

EDIT 9/15/2014: Sekarang ada mesin parser / transformasi front end C ++ 14. Bahkan mengubah nama dengan cukup andal pada saat ini: -}


Tampaknya tidak ada tautan untuk mengevaluasi alat ini di halaman unduhan Anda semanticdesigns.com/Products/RegisterEval.html Apakah versi percobaan dan harga tersedia saat ini untuk VS2010 atau VS2008?
SmacL

Untuk alat refactoring, "jangan berharap hasil terburu-buru". Tugas Litbang Fase I kami selesai, dan kami mengajukan dana untuk Fase II. Untuk membahas DMS dan sarana untuk mengevaluasinya, hubungi perusahaan. Ini bukan hal yang Anda "unduh untuk evaluasi", dengan cara yang sama seperti Enterprise Oracle bukan item unduhan.
Ira Baxter

... DMS mampu mengubah VS2008 / VS2010, tetapi tidak sebagai alat interaktif, dan ada batasan sehubungan dengan arahan preprosesor. (Berita baiknya adalah kami pikir kami telah memecahkan masalah besar dengan ini, dan akan menerapkannya dalam program R&D Tahap II).
Ira Baxter

Terima kasih atas umpan baliknya, tetapi tidak terlihat seperti jenis alat yang saya cari. Saya tidak perlu interaktif, hanya sesuatu yang dapat melakukan transformasi sederhana pada basis kode besar, tanpa biaya lengan dan kaki, misalnya mengubah jumlah parameter yang dibutuhkan panggilan, mengubah parameter pointer ke referensi. VisualAssist dekat tetapi hanya perlu melangkah sedikit lebih jauh.
SmacL

3
... tujuan DMS adalah mengaktifkan pengodean dan aplikasi bebas dari transformasi kode, baik "refactoring" atau "tidak". Ya, ini sulit dan kami belum sampai. Kami lebih dekat IMNSHO daripada alat lain yang saya lihat untuk C ++, dan tidak ada yang salah dengan dasar alat kami. Yang tersisa adalah masalah buruk dengan preprocessor, skala kode, dan upaya untuk kode semantik C ++ secara memadai untuk memungkinkan transformasi tersebut. Dan saya akan menjadi yang pertama mengatakan ini adalah proyek BESAR.
Ira Baxter

8

Jika Anda menggunakan emacs, coba Xrefactory . Ini mendukung ekstraksi metode, penggantian nama kelas / fungsi / variabel dan memasukkan / menghapus / memindahkan parameter. Ini juga memiliki mesin penyelesaian kode yang sangat baik / cepat.


6

Saat ini saya tidak bisa merekomendasikan setiap alat refactoring untuk C ++, tentu bukan untuk basis kode besar dari 100k garis dan di atas. Saya berharap ini akan berubah, seperti OP, dan saya berharap suatu hari akan ada sesuatu. Saya takut bahasanya sendiri mungkin harus berubah secara signifikan sebelum kita melihat alat yang benar-benar bagus.

btw, sudahkah SlickEdit menjatuhkan fitur refactoring-nya?


Bahasa itu berubah secara signifikan, dengan merilis standar C ++ 2011. Komplikasi tambahan membuat masalah lebih sulit, tidak mudah, karena semua pengguna akan menginginkan semua fitur bahasa canggih, dan kemampuan refactoring: - {
Ira Baxter

2
Setelah baru-baru ini membaca tentang kemampuan Slickedit, tampaknya ia menentukan definisi yang sesuai dengan penggunaan nama dengan metode heuristik. Itu tidak melakukan pencarian nama C ++ yang "benar". Ini berarti Anda tidak dapat percaya transformasi ini benar. Jika Anda tidak keberatan memeriksa pekerjaannya, ini mungkin baik untuk Anda. Pada paket perangkat lunak yang sangat besar, ini mungkin tidak baik. Pendapat saya.
Ira Baxter

3

The DMS software rengineering toolkit melakukan hal ini saya pikir. Ini adalah mesin transformasi kode, dirancang untuk skala besar dan menangani C ++. Tidak tahu seberapa elegan outputnya.


1
DMS telah digunakan untuk mengotomatisasi pengurutan ulang sejumlah besar kode C ++. Lihat Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Studi Kasus: Rekayasa ulang C ++ Model Komponen Melalui Transformasi Program Otomatis, Teknologi Informasi & Perangkat Lunak 49 (3): 275 -291 2007. Tersedia dari penerbit
Ira Baxter

Tidak tahu apa yang Anda maksud dengan "output elegan". Output yang Anda dapatkan dari DMS jelas tergantung pada apa yang Anda berikan, dan transformasi apa yang Anda terapkan. Jika transformasi tidak menyentuh bagian dari kode, bagian kode itu sama anggun atau tidaknya dengan yang semula. Jika itu menyentuh kode, keanggunan ditentukan oleh seberapa pintar transformasi, sama seperti perubahan manual dari pembuat kode. Saya tidak berpikir ini adalah keanggunan, tetapi format hasilnya bisa berupa pencetakan "fidelity" (format asli), atau gaya cetak awal yang ditentukan.
Ira Baxter

3

Saya sarankan untuk mencoba rtags jika Anda menggunakan emacs dan belum mencobanya (ada juga paket untuk vim yang tersedia). Ini adalah aplikasi klien / server berdentang yang mengindeks kode C / C ++, dengan fitur-fitur ini termasuk:

  • buka definisi / deklarasi
  • temukan semua referensi, lanjut ke yang berikutnya / sebelumnya
  • ganti nama simbol
  • integrasi dengan "perlengkapan" dentang

Saya memutuskan untuk mencobanya setelah menonton ceramah ini yang memperkenalkan rtags (dan emacs) untuk saya.

(Saya harus mengatakan bahwa saya melangkah sejauh ini hanya setelah QtCreator saya gagal mengubah nama beberapa simbol dengan benar, yang merupakan show-stopper untuk saya menggunakan IDE yang hebat ini untuk saat ini)

Selain apa yang didukung oleh rtags, saya juga memerlukan beberapa fitur rapi tambahan, termasuk:

  • membuat definisi fungsi / prototipe
  • fungsi ekstrak
  • buat metode pengambil / penyetel

Untuk ini, saya sarankan untuk menggunakan paket semantic-refactor untuk emacs (tidak yakin apakah ada alternatif untuk vim)

Secara umum, alat berbasis dentang terlihat sangat menjanjikan. Jika Anda tertarik pada informasi lebih lanjut tentang alat dentang untuk refactoring C ++, termasuk untuk proyek dengan basis kode besar, ada beberapa pembicaraan hebat oleh Chandler Carruth.


2

Orang pasti harus menyebut Klocwork sebagai suite kode refactoring komersial. Itu terlihat sangat menjanjikan ketika Anda pergi melalui video demo.


2

Masalahnya adalah template C ++. Sampai 2019 saya tidak mengetahui adanya alat refactoring yang mendukung templat C ++. Saya sudah mencoba VS2019, VisualAssist, Clion, QtCreator.

Pertimbangkan contoh:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

Jika saya menjalankan Ubah Nama Refactoring foo::print, bar::printharus juga diganti nama secara otomatis. Karena mereka terhubung melalui call_printinstantiations templat fungsi.


1

Jika Anda menggunakan Visual C ++ (Edisi Express gratis), Anda dapat menggunakan Visual Assist dari www.wholetomato.com (tautan ke fitur refactoring C ++).

Ini memiliki masa percobaan 30 hari dan kami telah menemukan itu menjadi lebih cepat dan lebih banyak fitur-penuh bahwa built-in intellisense dalam produk Visual C ++ itu sendiri.


2
Saya tidak berpikir Anda bisa menggunakan plugin dengan edisi kilat
Yacoby

3
Saya sudah pasti mencoba menginstal VA dengan VS C ++ express di masa lalu dan tidak berhasil.
quamrana

Anda tidak dapat menginstal plugin Visual Studio dalam mode terisolasi (edisi Express semua menjalankan IDE dalam mode terisolasi). Jika Anda seorang pelajar, Anda dapat mengunduh Visual Studio versi lengkap melalui DreamSpark atau MSDNAA.
Billy ONeal

1

Jika Anda ingin merekayasa ulang basis kode Anda: MOOSE. Tapi itu koleksi besar alat analisis dan rekayasa ulang, bukan editor.




1

CLion terlihat sangat menjanjikan.

Penafian: Saya belum mencobanya karena saya perlu mengubah proyek saya ke format CMake untuk menggunakannya.


1

Saya sarankan Anda mencoba Lattix . Ini memungkinkan Anda untuk menganalisis basis kode C / C ++ besar untuk menemukan arsitektur, mengidentifikasi dependensi yang bermasalah, dan merekayasa ulang kode untuk meningkatkan modularitas dan mengurangi hutang teknis. Lattix juga menyediakan sejumlah algoritma untuk membantu dalam proses refactoring. Algoritma ini membantu Anda mengetahui cara memindahkan elemen dari satu bagian hierarki ke yang lain, untuk memutus siklus dan untuk memindahkan subsistem sehingga penggabungan dan kohesi subsistem dapat ditingkatkan. Berikut adalah hasil Lattix menganalisis Kernel Android (1,6 juta LOC dari C / C ++). Pengungkapan penuh: Saya bekerja untuk Lattix


1

Maaf hanya menemukan pertanyaan ini sangat terlambat. Siswa dan asisten saya bekerja di C ++ refactoring sejak sekitar 2006. Sebagian besar infrastruktur refactoring CDT dibangun oleh tim saya di IFS institute of software. sejak beberapa tahun kami menyediakan Cevelop versi CDT kami dengan dukungan untuk perbaikan kode C ++ dll. Cevelop dapat bekerja dengan basis kode yang besar, jika ruang kerja diatur dengan benar. Gratis tersedia di https://cevelop.com


Sangat menarik. Saya mengunduhnya dan itu tidak akan mulai. Silakan lihat github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR

0

Saya menemukan plugin berikut untuk Visual Studio 2013: Visual C ++ Refactoring oleh Microsoft.

Ini hanya alat ganti nama yang sederhana tetapi bekerja dengan sempurna. Itu menambahkan menu konteks berikut setelah mengklik kanan pada simbol:

masukkan deskripsi gambar di sini

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.