Memperbaiki kesalahan ejaan dalam nama metode

73

Salah satu metode yang biasa saya gunakan dalam basis kode kami salah eja (dan itu mendahului saya).

Ini benar-benar membuat saya jengkel bukan hanya karena salah mengeja tetapi yang lebih penting itu membuat saya SELALU mendapatkan nama yang salah saat pertama kali saya mengetiknya (dan kemudian saya harus ingat "Oh, benar, itu harus salah eja untuk ini ...")

Saya membuat beberapa perubahan di sekitar metode asli. Haruskah saya mengambil kesempatan untuk mengganti nama metode panik?

Satu dua tiga
sumber
12
Bisakah Anda mengganti nama? Jika digunakan oleh kode yang tidak Anda kontrol, Anda perlu menjustifikasi jeda kompatibilitas mundur.
16
*salah eja. Dan Anda harus mengubahnya di mana pun metode itu dipanggil.
JohnP
2
* salah mengeja ... atau mungkin ejaan yang berbeda?
HorusKol
2
@ JohnP Ada Tiga, sekarang Satu sudah diperbaiki dan Dua masih salah. Secara kebetulan cocok dengan nama OP dengan cukup baik. :)
Disillusioned
3
Kita tidak boleh membiarkan apa pun dieja dengan salah!
Magus

Jawaban:

136

Haruskah saya mengambil kesempatan untuk mengganti nama metode panik?

Benar.

Yang mengatakan, jika kode Anda telah dirilis sebagai API, Anda biasanya juga harus meninggalkan metode yang salah eja dan meneruskannya ke metode yang dinamai dengan benar (menandainya Obsolete jika bahasa Anda mendukung hal-hal seperti itu).

Telastyn
sumber
33
Gagasan "meneruskan ke metode yang dinamai dengan benar" sederhana dan cemerlang. Tautan menarik pada teori windows yang rusak, juga.
dev_feed
2
Perhatikan bahwa jika ini adalah bagian dari API publik, ini mungkin bukan perubahan yang kompatibel ke belakang (tergantung pada bahasa). Ini tidak sesederhana kedengarannya .. jika saya harus mewarisi dari API yang ada dengan nama yang salah saya pasti akan memperbaikinya.
Voo
10
@ voo - eh? Bahasa apa yang membuat menambahkan metode baru (dan mengubah implementasi dari satu untuk melakukan perilaku yang persis sama) tidak kompatibel?
Telastyn
3
@ Telastyn kadang-kadang sulit untuk menambahkan metode untuk mengatakan layanan web. Beberapa klien menolak mengubah WSDL misalnya, tiba-tiba menolak untuk berbicara dengan server. Itu adalah masalah implementasi di klien, tetapi jika klien adalah yang penting Anda tidak ingin kesal itu bisa mencegah Anda mengubah antarmuka Anda.
jwenting
17
@ Telastyn Jika nama metode misspelt ada pada antarmuka (seperti pada tipe antarmuka yang digunakan dalam Delphi / Java / C #), maka menambahkan versi nama yang dieja dengan benar mungkin akan merusak semua implementasi yang ada dari antarmuka tersebut.
Disillusioned
52

Ada beberapa kasus di mana Anda harus menghindari melakukan refactoring tersebut:

  1. Jika metode ini digunakan dalam antarmuka publik. Contoh kanonik adalah salah mengeja referer dalam referer HTTP , ejaan yang salah disimpan, karena mengubah ejaan sekarang akan memiliki terlalu banyak dampak.

  2. Jika basis kode tidak dicakup oleh tes apa pun. Setiap refactoring harus dilakukan pada kode yang diuji untuk dapat melakukan pengujian regresi. Refactoring basis kode yang tidak sedang diuji sangat berisiko. Jika Anda memiliki banyak waktu, mulailah dengan menambahkan tes; jika Anda bekerja di bawah tekanan waktu, mengambil risiko memperkenalkan bug halus bukanlah hal terbaik untuk dilakukan jika Anda ingin mengirim tepat waktu.

  3. Jika metode ini dapat digunakan dengan cara yang tidak biasa , yang membuat penggunaannya hampir mustahil untuk ditemukan (melalui Ctrl + F atau dengan alat refactoring otomatis). Misalnya, dalam C #, metode dapat dipanggil melalui Refleksi, membuat dialog Ganti Nama Visual Studio tidak efektif. Dalam JavaScript, fungsi yang disebut di dalam eval()sulit juga ditemukan. Di PHP, variabel variabel dapat menyebabkan masalah.

  4. Jika ukuran proyek sangat besar dan metode ini dapat digunakan oleh tim lain. Ini mirip dengan poin pertama, yaitu antarmuka yang Anda berikan ke tim lain dapat dianggap sebagai antarmuka publik.

  5. Jika Anda berurusan dengan proyek kritis kehidupan. Kemungkinannya, kesalahan mengeja tidak terlalu penting untuk membenarkan beberapa bulan dokumen untuk mengubah nama metode dan memastikan itu tidak akan menyebabkan pasien menerima sepuluh kali radiasi resmi atau antar-jemput untuk salah menghitung kecepatannya.

Dalam situasi lain, jangan ragu untuk mengganti nama metode.

Arseni Mourzenko
sumber
1
+1 untuk komentar yang menyebutkan Refleksi, itu menggigit saya lebih dari sekali.
DaveShaw
33
Jika proyek Anda yang kritis dalam kehidupan cukup rapuh sehingga refactoring sekecil apa pun kemungkinan akan membunuh seseorang, itu cukup rapuh sehingga tidak seorang pun boleh memercayainya dengan hidup mereka. Bagaimana Anda bisa merasa yakin bahwa fitur baru atau antarmuka pengguna yang disederhanakan tidak memperkenalkan bug yang mengancam jiwa jika Anda bahkan tidak dapat mengubah nama metode?
user2357112
2
Demikian pula, jika satu perubahan nama metode menyebabkan beberapa bulan dokumen tambahan (daripada, katakanlah, sebagian besar diurus oleh dokumen untuk semua hal lain yang berubah pada saat yang sama), maka keseimbangan pemrograman-ke-dokumen miring. oleh beberapa urutan besarnya, dan tidak mungkin untuk mendapatkan perbaikan besar dilakukan tanpa mengubah sistem.
user2357112
8
@ user2357112: Saya tidak pernah mengatakan bahwa refactoring sekecil apa pun kemungkinan akan membunuh seseorang. Ini bukan tentang membunuh seseorang, tetapi tentang membuat segala kemungkinan untuk mengurangi risiko 0,001% yang tersisa memiliki bug. Ini membutuhkan proff formal. Ini membutuhkan beberapa lapisan pengujian. Ini membutuhkan formalisme. Ini melarang "Saya ingin segera mengganti nama metode ini, semoga akan berhasil!" tingkah laku. Proyek kritis kehidupan menggunakan teknik yang akan dianggap sebagai pemborosan waktu dan uang untuk aplikasi bisnis apa pun. Itu sebabnya mereka sangat dapat diandalkan (dan mahal).
Arseni Mourzenko
5
@ user2357112: seperti yang ditunjukkan MainMa, ini bukan tentang aplikasi bisnis biasa. Ini tentang jenis perangkat lunak khusus yang diuji / diverifikasi secara luas. Bagaimana jika metode ini disebut refleksi di suatu tempat? Bagaimana jika beberapa alat kompilasi pra / pasca melakukan sesuatu dengannya? Bagaimana dengan dokumentasinya? Bagaimana dengan tim lain yang menggunakannya? Apakah mereka menggunakan refleksi? Bagaimana jika ... Kehidupan nyata terkadang sangat kompleks. Dan kadang-kadang lebih baik membiarkan nama metode tidak tersentuh daripada memverifikasi jika ada konsekuensi dengan cara anti peluru.
dagnelies
30

Saya sudah melakukan ini beberapa bulan yang lalu (untuk alasan yang berbeda). Langkah-langkah yang saya ambil (bahasanya Perl):

  1. Ganti nama metode. Alias ​​nama lama ke nama baru (ini tidak boleh merusak kode apa pun, karena metode ini dapat dipanggil dengan nama lain).
  2. Beri tahu pengembang lain tentang perubahan nama dan alasannya, beri tahu mereka untuk menggunakan nama baru mulai sekarang.
  3. Ambil basis kode untuk nama lama, perbaiki setiap kejadian.
  4. Catat penggunaan apa pun dari nama lama (menggunakan nama lama seharusnya masih berfungsi saat ini). Perbaiki kasus-kasus itu.
  5. Tunggu (sambil melakukan 4.), hingga tidak ada lagi entri yang muncul di log.
  6. Hancurkan alias. Buat metode menggunakan nama lama yang melempar pengecualian fatal dengan pesan tentang perubahan nama.
  7. Setelah beberapa waktu, hapus metode dengan nama lama.

    Tentu saja, jarak tempuh Anda akan bervariasi.

Abigail
sumber
Satu peningkatan - jangan bergantung pada grep untuk menemukan pengguna dari nama lama, juga masuk ke dalam forwarder.
Ben Voigt
@ BenVoigt, bukankah itu yang dilakukan # 4?
Bob
6

Cara yang baik untuk tidak merusak kode apa pun yang ada adalah dengan mem-chain nama metode baru ke yang lama seperti itu

private void MyNewMethodName()
{
    TheOldMethodName();
}

dan kemudian tandai metode lama sebagai usang (jika bahasa Anda mendukung ini). Dengan cara ini, kode apa pun yang ada akan tetap berfungsi dan Anda dapat menghapus semua kesalahan ejaan lama dari basis kode Anda secara bertahap. Akhirnya Anda bahkan bisa menyalin / menempelkan body metode ke metode baru dan menghapus yang lama.

/ Sunting Seperti yang dikatakan ivo dalam komentar: Hal yang lebih baik untuk dilakukan adalah memindahkan kode dari TheOldMethodNameke MyNewMethodNamedan memanggil metode baru dari yang lama. Yang ini juga akan memiliki keuntungan untuk membantu dev untuk mendapatkan kepala mereka di mana kode itu berasal.

Resi
sumber
2
Saya setuju dengan metode Anda; Aku akan melakukan hal yang sama. Ini adalah metode refactoring yang paling waras, jelas, dan aman. Apa yang juga mungkin merupakan cara yang baik adalah memindahkan kode dari metode lama ke metode baru dan membuat yang lama menggunakan metode baru. Ketika basis kode adalah beberapa iterasi pada timeline Anda hanya perlu menghapus metode lama yang sudah usang.
Ivo Limmen
1
@IvoLimmen Itu saran yang sangat bagus. Dengan cara ini, orang-orang semakin menggunakan metode baru dan ini akan menghapus peringatan dari panggilan usang ke metode lama dari dalam metode baru. Saya akan menambahkan ini ke jawaban saya.
Rémi
1

Mengganti nama metode:

  • Lakukan melalui refactoring agar Anda tidak memiliki pekerjaan yang lebih banyak daripada yang Anda inginkan
  • Jika IDE Anda mendukung pelengkapan otomatis, gunakan itu ketika merujuk metode itu

Itu adalah dua opsi yang bisa Anda pilih. Saya lebih suka penyelesaian otomatis (mis. Eclipse IDE) dan tidak perlu mengetikkan nama metode. Pergi untuk mengganti nama; pastikan Anda mencari tahu apa yang memanggil metode itu dan mengubah referensi langsung di setiap tempat. Refactoring akan menjadi teman Anda untuk itu tetapi paling berhati-hati saat melakukannya.

Lembek
sumber
0

Saya biasanya akan merekomendasikan ya, ganti namanya.

Jawaban lain di sini telah mencantumkan alasan bagus mengapa Anda mungkin tidak ingin menamainya kembali, jadi jika Anda menemukan diri Anda dalam satu situasi seperti itu, Anda dapat membuat metode baru dengan nama dan implementasi yang tepat, dan mengubah metode lama untuk memanggil metode baru . Kemudian tandai yang lama sudah usang jika bahasa Anda mendukungnya.

Brian
sumber