Apa yang dimaksud dengan 'Ukuran Kondisi Cabang Tugas terlalu tinggi' dan bagaimana cara memperbaikinya?

112

Di aplikasi Rails saya, saya gunakan Rubocopuntuk memeriksa masalah. Hari itu memberi saya sebuah kesalahan seperti ini: Assignment Branch Condition size for show is too high. Ini kode saya:

def show
  @category = Category.friendly.find(params[:id])
  @categories = Category.all
  @search = @category.products.approved.order(updated_at: :desc).ransack(params[:q])
  @products = @search.result.page(params[:page]).per(50)
  rate
end

Apa artinya ini dan bagaimana cara memperbaikinya?

THpubs
sumber
9
Pencarian singkat mengungkap ini . Ini adalah rubocopcara formal untuk mengatakan "metode Anda melakukan terlalu banyak".
Sisi-D
Apakah semua variabel yang ditentukan digunakan dalam rendering?
Antarr Byrd

Jawaban:

114

Ukuran Assignment Branch Condition (ABC) adalah ukuran ukuran suatu metode. Ini pada dasarnya ditentukan dengan menghitung jumlah pernyataan A ssignments, B ranches , dan C onditional. (lebih detail..)

Untuk mengurangi skor ABC, Anda dapat memindahkan beberapa tugas tersebut ke panggilan before_action:

before_action :fetch_current_category, only: [:show,:edit,:update] 
before_action :fetch_categories, only: [:show,:edit,:update] 
before_action :fetch_search_results, only: [:show,:edit,:update] #or whatever

def show
  rate
end

private

def fetch_current_category
  @category = Category.friendly.find(params[:id])
end

def fetch_categories
  @categories = Category.all
end

def fetch_search_results
  @search = category.products.approved.order(updated_at: :desc).ransack(params[:q])
  @products = @search.result.page(params[:page]).per(50)
end
chad_
sumber
1
Terima kasih banyak. Sekarang kodenya terlihat sangat mudah dibaca tetapi bukankah itu membuat file menjadi besar? Lebih banyak kode? Apakah itu bagus
THpubs
Kurangi kode jika Anda membutuhkan variabel tersebut di tindakan lain.
chad_
2
Terima kasih. Saya mengarahkannya ke Wikipedia. Itu seharusnya sedikit lebih dapat diandalkan, saya harap.
chad_
Saya mendapatkan yang sama pada metode ini: # Gambarkan bola ke dalam konteks perangkat ini def draw (dc) dc.setForeground (color) dc.fillArc (x, y, w, h, 0, 64 * 90) dc.fillArc ( x, y, w, h, 64 * 90, 64 * 180) dc.fillArc (x, y, w, h, 64 * 180, 64 * 270) dc.fillArc (x, y, w, h, 64 * 270, 64 * 360) end Sepertinya saya tidak dapat mempertahankan tata letak blok kode di sini !!! Apa yang terjadi disini? Tidak ada tugas, tidak ada cabang, dan tidak ada persyaratan sama sekali !!!!
flajann
Anda memiliki tugas implisit di mana Anda mengalikan angka. Saya akan mengambilnya dan memindahkannya ke konstanta sehingga Anda tidak mengevaluasi ulang aritmatika yang sama dalam panggilan tersebut. Saya tidak yakin apakah ini akan memperbaiki umpan balik linter Anda tetapi itu pasti akan membersihkannya sedikit. :)
chad_