Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Fighting Code Smells #FrozenRails
Search
Dennis Ushakov
September 21, 2012
Technology
0
57
Fighting Code Smells #FrozenRails
Ruby code quality tool overview
Dennis Ushakov
September 21, 2012
Tweet
Share
More Decks by Dennis Ushakov
See All by Dennis Ushakov
Ruby Debugger Internals
denofevil
1
67
RubyMine and RubyMotion
denofevil
0
48
Ruby Debugger API
denofevil
0
130
RubyMotion #JetBrainsDay
denofevil
0
41
Get More from RubyMotion with RubyMine
denofevil
0
46
Other Decks in Technology
See All in Technology
東京海上日動におけるセキュアな開発プロセスの取り組み
miyabit
0
190
Jitera Company Deck / JP
jitera
0
230
(HackFes)米国国防総省のDevSecOpsライフサイクルをAWSのセキュリティサービスとOSSで実現
syoshie
5
680
RapidPen: AIエージェントによる高度なペネトレーションテスト自動化の研究開発
laysakura
1
400
Recoil脱却の現状と挑戦
kirik
3
450
大規模組織にAIエージェントを迅速に導入するためのセキュリティの勘所 / AI agents for large-scale organizations
i35_267
6
310
claude codeでPrompt Engineering
iori0311
0
520
OpenTelemetry の Log を使いこなそう
biwashi
5
1.1k
株式会社島津製作所_研究開発(集団協業と知的生産)の現場を支える、OSS知識基盤システムの導入
akahane92
1
1.3k
Datasets for Critical Operations by Dataform
kimujun
0
110
マルチモーダル基盤モデルに基づく動画と音の解析技術
lycorptech_jp
PRO
2
210
経理出身PdMがAIプロダクト開発を_ハンズオンで学んだ話.pdf
shunsukenarita
1
220
Featured
See All Featured
Become a Pro
speakerdeck
PRO
29
5.4k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
It's Worth the Effort
3n
185
28k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Why Our Code Smells
bkeepers
PRO
337
57k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
The Pragmatic Product Professional
lauravandoore
35
6.8k
Optimizing for Happiness
mojombo
379
70k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
GitHub's CSS Performance
jonrohan
1031
460k
How STYLIGHT went responsive
nonsquared
100
5.7k
Transcript
Fighting Code Smells ! ruby code analysis tools Dennis Ushakov
Pareto Principle • 20% Write new code •80% Modify existing
code
Does This Smell? a = something.valid?! ! if (a.to_s ==
"true")! # code here! end!
Does This Smell? def has_currency_rate?! val = false! if currency.id
== company.currency.id or rate.blank?! else! val = true! end! val! end!
Does This Smell? class FinancialEventObserver < ActiveRecord::Observer! observe Payment, Invoice!
def before_save(model)! event = nil ! if model.class == Payment! if model.new_record? ! event = FinancialEvent.new(:event => FinancialEvent::Event::PAYMENT_INVOICE,! :arguments => {:client_name => model.invoice.client.short_name, :invoice_number => model.invoice.invoice_number},! :company_id=>model.invoice.client.company.id)! end! elsif model.class == Invoice! i = Invoice.find_by_id model.id ! if model.new_record? or i.status != model.status ! if model.status == Invoice::Status::ESTIMATE! event = FinancialEvent.new(:event => FinancialEvent::Event::ESTIMATE_SEND,! :arguments => {:client_name => model.client.short_name, :invoice_number => model.invoice_number},! :company_id=>model.client.company.id)! elsif model.status == Invoice::Status::APPROVED! event = FinancialEvent.new(:event => FinancialEvent::Event::ESTIMATE_APPROVED,! :arguments => {:client_name => model.client.short_name, :invoice_number => model.invoice_number},! :company_id=>model.client.company.id)! elsif model.status == Invoice::Status::REJECTED! event = FinancialEvent.new(:event => FinancialEvent::Event::ESTIMATE_REJECTED,! :arguments => {:client_name => model.client.short_name, :invoice_number => model.invoice_number},! :company_id=>model.client.company.id)! elsif model.status == Invoice::Status::SEND! event = FinancialEvent.new(:event => FinancialEvent::Event::INVOICE_SEND,! :arguments => {:client_name => model.client.short_name, :invoice_number => model.invoice_number},! :company_id=>model.client.company.id) ! end! elsif !model.new_record? and i.state != model.state! if model.state == Invoice::State::DELETED! event = FinancialEvent.new(:event => FinancialEvent::Event::INVOICE_DELETED,! :arguments => {:invoice_number => model.invoice_number},! :company_id=>model.client.company.id)! end! end ! end! event.eventable = model.requester unless event.blank? ! event.save unless event.blank? !
Code That Smells • Runtime errors • Runtime warnings •
Dead code • Copy/paste • Complex method bodies • Code style violations • Framework pattern violations
Code Quality Tools autotest cucumber rspec simplecov rcov reek flay
dust pelusa roodi flog metrics_fu heckle Static Runtime
Static Tools • Inspect your code without launching it •
100% side effects free • Challenging to implement • Rails DSL magic kills ‘em
Reek • Class, module, method, identifier names • Using is_a?,
kind_of? instead of duck typing • Code duplicates • Large classes and methods • Nested iterators
Flog • Uses ABC metrics system • Assignment • Branches
• Conditions • |ABC| = √(A²+B²+C²) • Consider revising most painful methods
Flay • Analyzes code duplicates • Ignores identifier/ constants names
• Consider refactoring code that’s reported
Roodi • Assignments in conditions • Case blocks without else
• Large classes, modules and methods • Naming conventions • Cyclomatic complexity
metrics_fu/metrical Provides aggregate results for • Flay • Flog •
Reek • Roodi
Runtime Tools • Inspect your code by launching it •
100% follow the way Ruby works • Cope well with DSL magic • May have side effects • Works until the very first failure
Runtime Tools • Code testing • Test::Unit/MiniTest • RSpec/Cucumber •
Autotest/CI • Code coverage • RCov/SimpleCov • Heckle
Heckle • Changes code • if → unless • Calls
are changed • Numbers are changed • Runs tests • At least one test should fail after change
RubyMine • Static analysis • On-the-fly inspections with quickfixes •
Understands Rails DSLs • Code duplication • Dynamic analysis tools integration • Graphical representation • Autotest simulation • Stacktrace navigation
Refactorings • Rename • Extract • Method • Class/Module •
Variable/Parameter
Morale • Use static analysis tools • Don’t forget to
test • Try RubyMine http://jetbrains.com/ ruby
en_Dal
[email protected]
denofevil