Refactoring Your Rails Application

Get Started. It's Free
or sign up with your email address
Refactoring Your Rails Application by Mind Map: Refactoring Your Rails Application

1. Speakers

1.1. Zach Dennis (Atomic Object)

1.2. Drew Colthorp (Atomic Object)

2. What to refactor

2.1. Code that smells

2.1.1. Duplicated code smell

2.1.1.1. Project find en varias acciones

2.1.2. Shotgum surgery smell

2.1.2.1. un cambio implica cambiar muchas cosas

2.1.3. Long method smell

2.1.4. Inappropiate intimacy smell

2.1.4.1. un find demasiado sofisticado en el controlador

2.1.5. Divergent change smell

2.1.5.1. a class is commonly changing in different reasons

2.1.6. Large class smell

2.1.6.1. A class is doing too much

2.1.6.1.1. too many instance variables

2.1.6.1.2. too much code

2.1.6.1.3. too many methods

2.1.7. Feature envy smell

2.1.7.1. A methis is more interested in a cvlass other than the one is actually on

2.1.8. More

2.1.8.1. refactoring.com/sources.html

2.2. How to do refactor (small changes)

3. How do you refactor

3.1. small steps

3.2. two hats

3.3. solid tests

3.3.1. TDD / BDD Red. Green. Refactor

4. Rails -> MVC

4.1. Skinny Controller / Fat Model

4.2. Refactor to new artifacts

4.2.1. Presenters

4.2.2. Services

4.2.3. Mixins

4.2.4. Renderers

5. Examples

5.1. discharge model with Mixins

5.1.1. project.rb

5.1.1.1. statistics

5.1.1.1.1. Crea una carpeta project dir en models

5.1.1.1.2. Cread models/statistics

5.1.1.1.3. Mueve los métodos desde project.rb

5.1.1.1.4. include Project::Statistics

5.1.1.1.5. project_spec.rb

5.1.1.2. has_many :stories do include Project::StoriesAssociationMethods

5.1.1.2.1. using extend mejor que include has_many :stories, :exclude => Projects::StoriesAssociationMethods

5.2. Move logic from controller to presenters

5.2.1. formulario con selects. las listas para los selectes vienen en variables desde el controlador

5.2.2. Opción 1. Pasar que el objeto expense tenga varios métodos, cada uno para cada con los valores de cada select

5.2.3. What is a presenter?

5.2.3.1. Decorators

5.2.3.2. wrap objects

5.2.3.3. Can work for individual models

5.2.3.3.1. ExpensePresenter

5.2.3.4. can work for specific UI components

5.2.3.4.1. PlayerCardPresenter

5.2.4. class ExpensePresenter

5.2.4.1. initialize(expense)

5.2.4.2. delegate :description, :amount, :to => :@expense

5.2.4.3. def possible_expense_types

5.2.5. Bad smells

5.2.5.1. cargar variables solo con find :all

5.2.5.2. tener before_filter para eso

5.2.5.3. tener helper methods para eso

5.2.6. ejemplo

5.2.6.1. app/presenters/story_presenter.rb

5.2.6.1.1. class StoryPresenter

5.2.6.2. En el controlador @story = StoryPresenter.new @project.find_by...

5.2.6.2.1. admite que quizá sea mejor user @story_presenter

5.2.7. David Chemlisky propone alternativa

5.2.7.1. En lugar de un presenter que haga de wrapper

5.2.7.2. Un modulo que extienda el modelo

5.2.7.3. Y pasar a la vista un modelo extendido

5.2.7.4. Ventaja: no hay que preocuparse de delegar o del method_missiing

5.2.7.5. @story.extend StoryPresenter

5.3. Move logic from view to presenters

5.3.1. <% groups = user.admin? ? Group.find : user.groups %>

5.3.2. Sol: user.groups (user is a presenter)

5.4. Extract operations into service

5.4.1. Service: operations not state

5.4.2. Basics

5.4.2.1. controller

5.4.2.1.1. def create ProjectService.create_project(params[:project]) end

5.4.2.2. app/services/project_service.rb

5.4.2.2.1. def self.create_project #complex creation logic end

5.4.3. Possibilities

5.4.3.1. def create ProjectService.create_project(params[:project]) do |result| result.success do # success logic end result.failure do # failure logic end end end

5.5. Extract RJS into Renderer

5.5.1. ugly, nasty (realistic) rjs file

5.5.2. render with :site do

5.6. More refactorings

5.6.1. Extract complex creation into factory

5.6.2. move before filter and friends into app. service

5.6.3. move view data from controller into presenter

5.6.4. move view logic from controller into presenter

5.6.5. move extrinsic callback into observer

5.6.6. ...