
Daftar isi

Reek adalah alat yang memeriksa kelas ruby, modul, dan metode dan melaporkan bau kode apa pun yang ditemukannya.
Untuk pengantar yang sangat baik untuk Code Smells dan Reek, periksa posting blog ini atau yang itu. Ada juga pembicaraan dari RubyConfby (ada juga dek geser jika Anda lebih suka itu).
Instal melalui Rubygems:
gem install reekdan jalankan seperti ini:
reek [options] [dir_or_source_file] * Bayangkan demo.rb file sumber yang berisi:
# Smelly class
class Smelly
# This will reek of UncommunicativeMethodName
def x
y = 10 # This will reek of UncommunicativeVariableName
end
endReek akan melaporkan bau kode berikut dalam file ini:
$ reek --no-documentation demo.rb
Inspecting 1 file(s):
S
demo.rb -- 2 warnings:
[4]:UncommunicativeMethodName: Smelly#x has the name 'x'
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
Reek secara resmi didukung untuk Cruby 3.0 hingga 3.3 dan untuk Jruby 9.4. Implementasi Ruby lainnya (seperti Rubinius) tidak didukung secara resmi tetapi juga harus bekerja.
Perhatikan bahwa, pada setiap versi Ruby, Reek akan menggunakan parser untuk versi Ruby itu. Jadi, Anda harus selalu menjalankan Breek menggunakan salah satu versi Ruby target proyek Anda.
Reek berfokus pada bau kode tingkat tinggi, jadi kami tidak dapat memberi tahu Anda cara memperbaiki peringatan secara generik; Ini dan akan selalu sepenuhnya bergantung pada bahasa domain dan logika bisnis Anda.
Yang mengatakan, contoh mungkin membantu Anda pergi. Lihatlah sampel model Ruby on Rails ini (ketahuilah bahwa ini terpotong, bukan kode yang berfungsi):
class ShoppingCart < ActiveRecord :: Base
has_many :items
def gross_price
items . sum { | item | item . net + item . tax }
end
end
class Item < ActiveRecord :: Base
belongs_to :shopping_cart
endMenjalankan bau di file ini seperti ini:
reek app/models/shopping_cart.rb
akan melaporkan:
[5, 5]:ShoppingCart#gross_price refers to item more than self (FeatureEnvy)
Memperbaiki ini cukup mudah. Letakkan perhitungan harga kotor untuk satu item di tempatnya, yang akan menjadi kelas Item :
class ShoppingCart < ActiveRecord :: Base
has_many :items
def gross_price
items . sum { | item | item . gross_price }
end
end
class Item < ActiveRecord :: Base
belongs_to :shopping_cart
def gross_price
net + tax
end
endKode ini berbau dokumen mungkin memberi Anda petunjuk lebih lanjut - pastikan untuk memeriksa mereka terlebih dahulu ketika Anda memiliki peringatan bahwa Anda tidak tahu cara menghadapinya.
Ada beberapa cara Anda dapat bekerja dengan baik pada sumber, yang paling umum hanya
reek lib/Jika Anda tidak memberikan argumen sumber apa pun untuk dibekukan, itu hanya mengambil direktori kerja saat ini sebagai sumber.
Jadi
reekadalah hal yang persis sama dengan menjadi eksplisit:
reek .Selain itu, Anda dapat menyalakan kode untuk berbau seperti ini:
echo " class C; def m; end; end " | reekIni akan mencetak:
$stdin -- 3 warnings:
[1]:C has no descriptive comment (IrresponsibleModule)
[1]:C has the name ' C ' (UncommunicativeModuleName)
[1]:C#m has the name ' m ' (UncommunicativeMethodName)Reek saat ini mencakup pemeriksaan untuk beberapa aspek pasangan kontrol, gumpalan data, iri fitur, kelas besar, daftar parameter panjang, polimorfisme simulasi, terlalu banyak pernyataan, nama yang tidak komunikatif, parameter yang tidak digunakan dan banyak lagi. Lihat kode bau untuk detail terkini dari apa yang akan dibuaskan dengan tepat kode Anda.
Konfigurasi Khusus untuk Detektor Kontroversial:
Metode pribadi yang tidak digunakan dinonaktifkan secara default karena itu agak kontroversial yang berarti Anda harus mengaktifkannya secara eksplisit dalam konfigurasi Anda melalui
UnusedPrivateMethod :
enabled : trueFungsi utilitas adalah detektor kontroversial juga yang bisa menjadi benar -benar tidak memaafkan. Sebagai akibatnya, kami memungkinkan untuk menonaktifkannya untuk metode non-publik seperti ini:
---
UtilityFunction :
public_methods_only : true Untuk tinjauan dasar, jalankan
reek -- helpUntuk ringkasan opsi CLI, lihat opsi baris perintah.
Mengkonfigurasi berbau melalui file konfigurasi sejauh ini merupakan cara yang paling kuat. Reek mengharapkan nama file ini menjadi .reek.yml tetapi Anda dapat menimpa ini melalui sakelar CLI -c (lihat di bawah).
Ada tiga cara untuk melewati file konfigurasi berbau:
-c (lihat antarmuka baris perintah di atas)Urutan di mana Reek mencoba menemukan file konfigurasi seperti itu persis di atas: pertama -tama ia memeriksa apakah kami telah memberinya file konfigurasi secara eksplisit melalui CLI; Kemudian memeriksa direktori kerja saat ini untuk sebuah file dan jika tidak dapat menemukannya, ia melintasi direktori sampai menyentuh direktori root; Terakhir, itu memeriksa direktori rumah Anda.
Segera setelah Reek mendeteksi file konfigurasi, ia berhenti mencari segera, yang berarti bahwa dari sudut pandang Reek ada tepat satu file konfigurasi dan satu konfigurasi, terlepas dari berapa banyak file *.reek yang mungkin Anda miliki pada sistem file Anda.
Kami berupaya keras untuk membuat konfigurasi Reek sebagai penjelasan diri sebanyak mungkin sehingga cara terbaik untuk memahaminya adalah dengan melihat contoh sederhana (misalnya .reek.yml di direktori proyek Anda):
---
# ## Generic smell configuration
detectors :
# You can disable smells completely
IrresponsibleModule :
enabled : false
# You can use filters to silence Reek warnings.
# Either because you simply disagree with Reek (we are not the police) or
# because you want to fix this at a later point in time.
NestedIterators :
exclude :
- " MyWorker#self.class_method " # should be refactored
- " AnotherWorker#instance_method " # should be refactored as well
# A lot of smells allow fine tuning their configuration. You can look up all available options
# in the corresponding smell documentation in /docs. In most cases you probably can just go
# with the defaults as documented in defaults.reek.yml.
DataClump :
max_copies : 3
min_clump_size : 3
# ## Directory specific configuration
# You can configure smells on a per-directory base.
# E.g. the classic Rails case: controllers smell of NestedIterators (see /docs/Nested-Iterators.md) and
# helpers smell of UtilityFunction (see docs/Utility-Function.md)
#
# Note that we only allow configuration on a directory level, not a file level,
# so all paths have to point to directories.
# A Dir.glob pattern can be used.
directories :
" web_app/app/controllers " :
NestedIterators :
enabled : false
" web_app/app/helpers** " :
UtilityFunction :
enabled : false
" web_app/lib/**/test/** " :
UtilityFunction :
enabled : false
# ## Excluding directories
# Directories and files below will not be scanned at all
exclude_paths :
- lib/legacy
- lib/rake/legacy_tasks
- lib/smelly.rbSeperti yang Anda lihat di atas, konfigurasi Reek terdiri dari 3 bagian berbeda yang dilambangkan dengan 3 kunci yang berbeda:
Apa pun yang Anda tambahkan ke konfigurasi Anda harus dilingkupi di bawah salah satu kunci tersebut.
Jika Anda memiliki arahan direktori yang ada arahan default, yang lebih spesifik (yang merupakan arahan direktori) akan diutamakan.
Konfigurasi ini misalnya:
---
detectors :
IrresponsibleModule :
enabled : false
TooManyStatements :
max_statements : 5
directories :
" app/controllers " :
TooManyStatements :
max_statements : 10diterjemahkan ke:
Setiap detektor bau mendukung opsi bau dasar kami. Seperti yang dapat Anda lihat di atas, jenis bau tertentu menawarkan konfigurasi yang melampaui opsi bau dasar, misalnya kaleng data. Semua opsi yang melampaui opsi bau dasar didokumentasikan di halaman jenis bau /dokumen yang sesuai (jika Anda ingin mendapatkan gambaran cepat atas semua konfigurasi yang mungkin Anda juga dapat memeriksa file defaults.reek.yml di repositori ini.
Perhatikan bahwa Anda tidak memerlukan file konfigurasi sama sekali. Jika Anda baik -baik saja dengan semua default yang kami atur, Anda dapat melewatkan ini sepenuhnya.
Jangan khawatir tentang memperkenalkan kesalahan dalam file konfigurasi Anda yang mungkin tidak diperhatikan - Reek menggunakan skema untuk memvalidasi konfigurasi Anda terhadap start up dan akan gagal dengan keras jika Anda salah mengeja opsi atau menggunakan tipe data yang salah untuk nilai seperti ini:
Error: We found some problems with your configuration file: [/detectors/DetectorWithTypo] key 'DetectorWithTypo:' is undefined.
Reek mengambil satu file konfigurasi dan satu file konfigurasi hanya dengan .reek.yml menjadi nama default.
Jika Anda harus memiliki satu atau lebih file konfigurasi di direktori (misalnya Anda bermain -main dengan pengaturan yang berbeda dan saling eksklusif) Anda perlu memberi tahu Reek secara eksplisit file mana yang akan digunakan melalui reek -c config.reek .
Jika Anda perlu menekan peringatan bau dan Anda tidak dapat atau tidak ingin menggunakan file konfigurasi untuk alasan apa pun Anda juga dapat menggunakan komentar kode sumber khusus seperti ini:
# This method smells of :reek:NestedIterators
def smelly_method foo
foo . each { | bar | bar . each { | baz | baz . qux } }
endAnda bahkan dapat melewati pengaturan konfigurasi spesifik bau:
# :reek:NestedIterators { max_allowed_nesting: 2 }
def smelly_method foo
foo . each { | bar | bar . each { | baz | baz . qux } }
endIni adalah fitur yang sangat kuat dan dijelaskan lebih lanjut di bawah penindasan bau.
Dengan Reeks Mekanisme Dinamis Menemukan File Konfigurasi Anda mungkin mengalami situasi di mana Anda tidak 100% yakin file konfigurasi apa yang digunakan Reek. Misalnya Anda memiliki file konfigurasi spesifik proyek di root proyek Anda dan juga konfigurasi bacaan lain di direktori home Anda yang Anda gunakan untuk semua proyek Anda yang lain dan untuk alasan apa pun yang tampaknya Anda gunakan untuk menggunakan file konfigurasi lain daripada yang Anda anggap akan.
Dalam hal ini Anda dapat lulus bendera --show-configuration-path untuk berbau yang akan menyebabkan berbau untuk mengeluarkan jalur ke file konfigurasi yang digunakannya.
Mengintegrasikan alat seperti berbau ke basis kode yang lebih besar yang ada bisa menakutkan ketika Anda harus memperbaiki kemungkinan ratusan atau ribuan aroma peringatan terlebih dahulu. Tentu Anda dapat menonaktifkan peringatan bau secara manual seperti yang ditunjukkan di atas tetapi tergantung pada ukuran basis kode Anda, ini mungkin bukan pilihan. Untungnya Reek menyediakan bendera 'TODO' yang dapat Anda gunakan untuk menghasilkan konfigurasi yang akan menekan semua peringatan bau untuk basis kode saat ini:
reek --todo lib/Ini akan membuat file '.reek.yml' di direktori kerja Anda saat ini.
Anda kemudian dapat menggunakan ini sebagai konfigurasi Anda - karena direktori kerja Anda mungkin adalah root proyek Anda dalam banyak kasus, Anda tidak perlu memberi tahu Reek secara eksplisit untuk menggunakan '.reek.yml' karena Reek akan secara otomatis mengambilnya dan menggunakannya sebagai file konfigurasi. Lihat pemuatan konfigurasi di atas.
Jika karena alasan apa pun Anda memutuskan untuk menempatkan '.reek.yml' di tempat lain di mana Reek tidak akan mengambilnya secara otomatis, Anda perlu memberi tahu Reek secara eksplisit untuk melakukannya melalui:
reek -c whatever/.reek.yml lib/ Penting untuk dipahami bahwa kasus penggunaan nomor satu dari --todo bendera harus dijalankan sekali pada awal pengenalan bau untuk memudahkan transisi. Jika Anda mendapati diri Anda ingin menjalankan kembali dengan bendera --todo untuk membungkam banyak peringatan baru, Anda mengalahkan tujuan dari-bendera --todo dan dari Breek itu sendiri.
Sebagai akibatnya, berlari berbau dengan bendera --todo lagi tidak akan menimpa '.reek.yml' yang ada dan sebaliknya membatalkan eksekusi. Ini juga tidak akan memperhitungkan file konfigurasi lain yang mungkin Anda miliki.
Ini berarti bahwa saat Anda berlari
reek -c other_configuration.reek --todo lib/ other_configuration.reek hanya akan diabaikan.
Tentu saja Anda selalu dapat menghapus file .reek.yml yang ada dan kemudian jalankan baca dengan bendera --todo tetapi perlu diingat bahwa ini bukan kasus penggunaan yang dimaksudkan dari fitur ini.
Selain yang jelas
reek [options] [dir_or_source_file] *Ada beberapa cara lain cara menggunakan bau dalam proyek Anda:
Hal pertama yang ingin Anda lakukan setelah memeriksa kode sumber adalah menjalankan Bundler:
bundle install
dan kemudian jalankan tes:
bundle exec rspec spec/your/file_spec.rb # Runs all tests in spec/your/file_spec.rb
bundle exec rspec spec/your/file_spec.rb:23 # Runs test in line 23
bundle exec cucumber features/your_file.feature # Runs all scenarios in your_file.feature
bundle exec cucumber features/your_file.feature:23 # Runs scenario at line 23Atau hanya menjalankan seluruh suite tes:
bundle exec rake
Ini akan menjalankan tes (RSPEC dan mentimun), Rubocop dan berbau sendiri.
Tugas Rake Berguna Lainnya adalah Tugas console . Ini akan membuat Anda langsung ke lingkungan di mana Anda dapat bermain -main dengan modul dan kelas Reeks:
bundle exec rake console
irb(main):001> Reek::Examiner
=> Reek::Examiner
Anda juga dapat menggunakan IRB saat menjalankan tes dengan menambahkan yang berikut pada titik di mana Anda ingin memulai debugging:
binding . irbLihatlah API pengembang kami untuk lebih banyak inspirasi.
Sejak saat itu Anda harus memeriksa:
Jika Anda tidak ingin membuat tangan kotor dengan kode, masih ada cara lain, Anda dapat membantu kami:
Jika Anda mengalami masalah iklim kode (misalnya, buka ambang duplikasi kode) Anda mungkin ingin dapat menjalankan iklim kode terhadap basis kode baca secara lokal. Untuk melakukan ini, Anda perlu melakukan hal berikut:
gem install codeclimatecodeclimate engines:install Sekarang Anda dapat menjalankan berbagai mesin iklim kode, misalnya, codeclimate analyze -e duplication
Breek mendukung 6 format output:
--format html )--format yaml , lihat juga Laporan YAML)--format json )--format xml )--format github ) Membuat "Rails" Reek-ramah cukup sederhana karena kami mendukung konfigurasi spesifik direktori ( directory directives di Reek Talk). Cukup tambahkan ini ke file konfigurasi Anda:
directories :
" app/controllers " :
IrresponsibleModule :
enabled : false
NestedIterators :
max_allowed_nesting : 2
UnusedPrivateMethod :
enabled : false
InstanceVariableAssumption :
enabled : false
" app/helpers " :
IrresponsibleModule :
enabled : false
UtilityFunction :
enabled : false
" app/mailers " :
InstanceVariableAssumption :
enabled : false
" app/models " :
InstanceVariableAssumption :
enabled : falseHati -hati, Reek tidak menggabungkan entri konfigurasi Anda, jadi jika Anda sudah memiliki direktor direktori untuk "aplikasi/pengontrol" atau "aplikasi/pembantu", Anda perlu memperbarui arahan tersebut alih -alih menyalin sampel YAML di atas ke dalam file konfigurasi Anda.
Daftar analisis kode statis lainnya yang tidak lengkap yang mungkin ingin Anda lihat:
Tim inti bau terdiri dari:
Penulis asli Reek adalah Kevin Rutherford.
Penulis logo Reek adalah Sonja Heinen.
Kontribusi penting berasal dari: