Código amigable: Limpieza de Chakras con RubyCritic
¿Quiénes somos?
Ingeniero de La UD
RubyCritic: Code Smells, Flay y Flog
Reek
- Detector de "Smells" en el código.
- Indica principalmente dónde el código es difícil de leer, mantener o extender.
- La gema del futuro.
- Detecta duplicidad en el código.
- Informa "Future Envy" o módulos dudosos junto con Reek
Flay
Flog
- Informa acerca de la complejidad del código.
- Detecta el comportamiento anti-Ruby gracias a esto
¡Ahora en Acción!
¡GRACIAS!
Módulos
Un módulo es una colección de métodos y constantes.
Namespaces
Mixins
No state dependent
Namespaces
module Trig
PI = 3.141592654
def Trig.sin(x)
# ..
end
def Trig.cos(x)
# ..
end
end
module Action
VERY_BAD = 0
BAD = 1
def Action.sin(badness)
# ...
end
end
y = Trig.sin(Trig::PI/4)
wrongdoing = Action.sin(Action::VERY_BAD)
Mixins
Herencia Múltiple ?
Evitar la Duplicación de Lógica
module Debug
def whoAmI?
"#{self.type.name} (\##{self.id}): #{self.to_s}"
end
end
class Phonograph
include Debug
# ...
end
class EightTrack
include Debug
# ...
end
ph = Phonograph.new("West End Blues")
et = EightTrack.new("Surrealistic Pillow")
ph.whoAmI? → "Phonograph (#537766170): West End Blues"
et.whoAmI? → "EightTrack (#537765860): Surrealistic Pillow"
No State Dependent
class API
def fetch(id)
HTTP.get('http://matt.aimonetti.net/article/:id', :id => id)
end
end
resource = API.new.fetch(42)
module API
def self.fetch(id)
HTTP.get('http://matt.aimonetti.net/article/:id', :id => id)
end
end
resource = API.fetch(4)
Uso de Módulos en Modelos
class Post < ActiveRecord::Base
validates :title, :content, presence: true
has_many :votes
has_many :comments
def vote!
votes.create
end
end
class Comment < ActiveRecord::Base
validates :content, presence: :true
belongs_to :post
end
class Vote < ActiveRecord::Base
belongs_to :post
end
Hasta ahora todo va bien
Uso de Módulos en Modelos
class Post < ActiveRecord::Base
validates :title, :content, presence: true
has_many :votes, as: :votable
has_many :comments
def vote!
votes.create
end
end
class Comment < ActiveRecord::Base
validates :content, presence: :true
has_many :votes, as: :votable
belongs_to :post
def vote!
votes.create
end
end
class Vote < ActiveRecord::Base
belongs_to :votable, polymorphic: true
end
Uso de Módulos en Modelos
class Vote < ActiveRecord::Base
enum type: [:upvote, :downvote]
validates :type, presence: true
belongs_to :votable, polymorphic: true
end
Uso de Módulos en Modelos
module Votable
extend ActiveModel::Concern
included do
has_many :votes, as: :votable
end
def upvote!
votes.create(type: :upvote)
end
def downvote!
votes.create(type: :downvote)
end
end
class Post < ActiveRecord::Base
include Votable
validates :title, :content, presence: true
has_many :comments
end
class Comment < ActiveRecord::Base
include Votable
validates :content, presence: :true
belongs_to :post
end
¿Preguntas?
Gracias!
Ruby Critic
By Nathaly Villamor
Ruby Critic
- 269