Bagaimana Anda menavigasi dan kode refactor ditulis dalam bahasa yang dinamis?

14

Saya suka bahwa menulis Python, Ruby atau Javascript membutuhkan boilerplate yang sangat sedikit. Saya suka konstruksi fungsional sederhana. Saya suka sintaksis yang bersih dan sederhana.

Namun, ada tiga hal yang saya sangat buruk ketika mengembangkan perangkat lunak besar dalam bahasa yang dinamis:

  • Menavigasi kode
  • Mengidentifikasi antarmuka objek yang saya gunakan
  • Refactoring secara efisien

Saya telah mencoba editor sederhana (yaitu Vim) serta IDE (Eclipse + PyDev) tetapi dalam kedua kasus saya merasa seperti saya harus melakukan lebih banyak ke memori dan / atau untuk terus "grep" dan membaca kode untuk mengidentifikasi antarmuka. Ini terutama benar ketika bekerja dengan basis kode besar dengan banyak dependensi.

Adapun refactoring, misalnya mengubah nama metode, itu menjadi sangat tergantung pada kualitas tes unit saya. Dan jika saya mencoba untuk mengisolasi tes unit saya dengan "memotongnya" sisa aplikasi, maka tidak ada jaminan bahwa antarmuka rintisan saya tetap up to date dengan objek yang saya matikan.

Saya yakin ada solusi untuk masalah ini. Bagaimana Anda bekerja secara efisien dalam Python, Ruby atau Javascript?

Philippe Beaudoin
sumber
Fitur penggantian nama PyDev bekerja sangat baik untuk saya sejauh ini.

Jawaban:

3

Menavigasi kode

Dapatkan editor yang lebih baik daripada VIM.

Saya menggunakan Komodo Edit.

Saya merasa harus melakukan lebih banyak ke memori

Baik. Berpikir itu baik. Saya menemukan bahwa "belajar" pada akhirnya mengarah ke "memori".

Terus-menerus "grep" dan baca kode untuk mengidentifikasi antarmuka.

Ini tipikal. Jika Anda tidak dapat mengingatnya, maka itu terlalu rumit, bukan? Saatnya menyederhanakan.

Sederhana sulit dibuat. Tetapi ketika Anda memiliki kesulitan mengingat, itu adalah gejala desain yang buruk.

Saya menggunakan grep. Ini bekerja untuk saya. Edit Komodo saya memiliki banyak pencarian yang bagus. Begitu juga Notepad ++

Mengidentifikasi antarmuka objek yang saya gunakan

Doc Strings dan help()fungsinya berfungsi. Saya menggunakannya. Harian.

Refactoring secara efisien ... menjadi sangat tergantung pada kualitas tes unit saya.

Itu bukan berita. Itu selalu benar, bahkan dalam bahasa statis.

Dalam bahasa statis, kita sering menjadi malas, dengan asumsi bahwa - selama dikompilasi - itu benar-benar mungkin berhasil. Ini benar-benar salah, tetapi kita menjadi malas.


Saya yakin ada solusi untuk masalah ini.

Ini bukan "masalah" dan tidak memerlukan "solusi".


Bahasa dinamis adalah tepatnya tentang tidak mengetahui jenis objek yang Anda manipulasi. Ketika Anda menerima parameter, Anda menganggapnya mendefinisikan metode "quack ()" dan "feathers ()", tetapi Anda tidak tahu di mana ada dokumentasi (pada kenyataannya, mereka akan memiliki beberapa dokumen dalam beberapa implementasi mereka).

"tidak tahu jenis benda"? Betulkah. Ketika saya mendesain klien suatu objek, saya tahu tipe apa yang saya desain.

Ketika saya mendefinisikan layanan, digunakan oleh banyak klien, tipe "tepat" tidak relevan, ketika saya telah mendefinisikan antarmuka yang diperlukan dari quack()dan feathers().

Akhirnya, saya memiliki Read-Execute-Print-Loop dan alat-alat lain untuk menentukan tipe "tepat" dalam kasus yang jarang terjadi ketika saya memiliki masalah halus. Itulah yang sebenarnya saya gunakan setiap hari.

>>> x = some_mystery_factory( some, args )
>>> type(x)
>>> dir(x)

Sepertinya tidak terlalu sulit - setidaknya dengan Python - untuk melepas tipe objek. Harus bahasa yang dinamis memiliki REPL, sehingga cukup mudah untuk melihat apa yang terjadi.

Anda juga tidak tahu urutan parameter yang diharapkan. Tampaknya sulit bagi IDE untuk membantu di sana.

Itu tidak masuk akal. help()bekerja.

Dan IDE saya sering dapat menemukan definisi. Tidak selalu - beberapa konstruksi dinamis yang berbelit-belit dapat dengan mudah menyembunyikan kelas dasar. Dalam hal itu, saya harus benar-benar berpikir tentang kelas objek untuk menemukan definisi metode. Tentu saja, saya sedang menulis kode, jadi ada sedikit (atau tidak ada) misteri di sana.

S.Lott
sumber
6
Saya merasa dapat berdebat bahwa dipaksa untuk melakukan lebih banyak ke memori memberi Anda lebih sedikit kapasitas untuk berpikir ...
Nicole
@Renesis: Menghafal tidak jahat jika ada pola atau sistem apa pun untuk antarmuka.
S.Lott
1
Saya setuju dengan antarmuka hafalan @Renesis membuat pikiran saya menjauh dari pemikiran yang sebenarnya. Saya tidak peduli bagaimana programmer lain di tim saya memutuskan untuk memesan parameter. Fakta bahwa basis kode besar menggunakan banyak perpustakaan yang berbeda dengan standar penamaan yang berbeda tidak jarang, dan seringkali tidak mungkin atau tidak praktis untuk menyederhanakan atau menyatukan komponen-komponen ini.
Philippe Beaudoin
Re: Doc string, mereka baik-baik saja ketika Anda tahu jenis objek, tetapi sering kali Anda tidak dan Anda harus mencarinya.
Philippe Beaudoin
1
Grr ... tidak ada editor yang lebih baik daripada Vim: P
Anto
1

Ada sebuah perusahaan - JetBrains - penulis ReSharper, TeamCity dan IDEA. Mereka baru-baru ini mulai melihat bahasa dinamis dan sudah merilis alat mereka untuk Python, PHP dan Ruby.

Kualitasnya bagus. Ini bukan plugin lain untuk IDE favorit Anda tetapi IDE berfitur lengkap dan mereka cukup baik untuk refactoring / navigasi / debugging dll - mereka seperti IDEA lite.

Andrey Taptunov
sumber