Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Fighting Code Smells #FrozenRails
Search
Dennis Ushakov
September 21, 2012
Technology
63
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Fighting Code Smells #FrozenRails
Ruby code quality tool overview
Dennis Ushakov
September 21, 2012
More Decks by Dennis Ushakov
See All by Dennis Ushakov
Ruby Debugger Internals
denofevil
1
77
RubyMine and RubyMotion
denofevil
0
53
Ruby Debugger API
denofevil
0
130
RubyMotion #JetBrainsDay
denofevil
0
45
Get More from RubyMotion with RubyMine
denofevil
0
55
Other Decks in Technology
See All in Technology
夫婦で子育てするための育児標準化
codmoninc
PRO
0
350
AIにシークレットを見せない、WSL2で安全な開発環境
yazm
0
300
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
260
パッチ更新でterraform initが落ちた日
grimoh
1
140
USB PDを使ってスマホを労わりたい
raspython3
0
180
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
Active Record Connection Adaptersにおける長年の課題に再び取り組む
yahonda
0
150
Classmethod Company Deck
satoshi7
1
690
How to Design Configuration for Rails Applications
willnet
1
800
Gemini Intelligence 入門 ― AppFunctions と Gemini Nano
takuroabe
0
260
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
130
Featured
See All Featured
A Soul's Torment
seathinner
8
3.8k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
New Earth Scene 8
popppiees
4
2.7k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Designing for Performance
lara
612
70k
For a Future-Friendly Web
brad_frost
184
10k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
320
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
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