SlideShare une entreprise Scribd logo
1  sur  97
Télécharger pour lire hors ligne
Refatorando Código
       Ruby


@caike
http://caikesouza.com
caike@envylabs.com
www.envylabs.com
Métodos
 Ágeis
Testes
(Anti-)Patterns
Software
Craftsmanship
"Any fool can write code that
   a computer can understand.
Good programmers write code that
    humans can understand"

          (Martin Fowler)
Refatorar é ...
Limpar a casa sem
 mudar a fachada
Algumas razões
Design
Responder
a mudanças
Entregas
Constantes
Waterfall




Jan   Feb   Mar    Apr     May     Jun           Jul

             Cost of Maintenance         Extreme Programming Explained: Embrace Change
                                                     Addison Wesley, 2000
XP




Jan   Feb   Mar    Apr     May     Jun           Jul

             Cost of Maintenance         Extreme Programming Explained: Embrace Change
                                                     Addison Wesley, 2000
Quando ?
novas features
bugs
Débito Técnico
Code Reviews
“The great thing about programming is
  pretty much everyone's code is shit.
Writing software is hard, so it's no problem
      finding dogs in someone's stuff”

                 (Zed Shaw)
exemplos.rb
managers = []

employees.each do |e|
  managers << e if e.is_manager?
end
managers = []

employees.each do |e|
  managers << e if e.is_manager?
end
Replace Loop with
 Closure Method
managers = []

employees.each do |e|
  managers << e if e.is_manager?
end
managers = employees.
  select { |e| e.is_manager? }
class Movie
  def initialize(stars)
    @stars = stars
  end

  def recommended?
    ((@stars > 5) ? 8 : 1) >= 8
  end
end
class Movie
  def initialize(stars)
    @stars = stars
  end

  def recommended?
    ((@stars > 5) ? 8 : 1) >= 8
  end
end
Introduce Explaining
      Variable
class Movie
  def initialize(stars)
    @stars = stars
  end

  def recommended?
    ((@stars > 5) ? 8 : 1) >= 8
  end
end
class Movie
  def initialize(stars)
    @stars = stars
  end

  def recommended?
    rating = (@stars > 5) ? 8 : 1
    rating >= 8
  end
end
class Movie
  def initialize(stars)
    @stars = stars
  end

  def recommended?
    rating = (@stars > 5) ? 8 : 1
    rating >= 8
  end
end
Replace Temp
With Query
class Movie
  def initialize(stars)
    @stars = stars
  end

  def recommended?
    rating = (@stars > 5) ? 8 : 1
    rating >= 8
  end
end
class Movie
  def initialize(stars)
    @stars = stars
  end

  def recommended?
    rating >= 8
  end

  def rating
    (@stars > 5) ? 8 : 1
  end
end
OMG OMG OMG OMG OMG
class Movie

  def recommended?
    rating >= 8
  end

  def rating
    (@stars > 5) ? 8 : 1
  end
end
class Movie

  def recommended?
    rating >= 8
  end

  def rating
    more_than_five_stars? ? 8 : 1
  end

  def more_than_five_stars?
    @stars > 5
  end
end
Inline Method
class Movie
  def initialize...end
  def recommended?
    rating >= 8
  end

  def rating
    more_than_five_stars? ? 8 : 1
  end

  def more_than_five_stars?
    @stars > 5
  end
end
class Movie
  def initialize...end
  def recommended?
    rating >= 8
  end

  def rating
    @stars > 5 ? 8 : 1
  end




end
mock = mock('user')
expectation = mock.expects(:find)
expectation.with("1")
expectation.returns([])
mock = mock('user')
expectation = mock.expects(:find)
expectation.with("1")
expectation.returns([])
Replace Temp
 With Chain
mock = mock('user')
expectation = mock.expects(:find)
expectation.with("1")
expectation.returns([])
mock = mock('user')
mock.expects(:find).with("1").
      returns([])
Command
  vs.
 Query
def expects
  ...
  self
end

def with
  ...
  self
end

def returns
  ...
  self
end
def charge(amount, card_number)
  begin
    conn = CC_Charger_Server.connect(...)
    conn.send(amount, card_number)
  rescue IOError => e
    Logger.log "Error: #{e}"
    return nil
  ensure
    conn.close
  end
end
def charge(amount, card_number)
  begin
    conn = CC_Charger_Server.connect(...)
    conn.send(amount, card_number)
  rescue IOError => e
    Logger.log "Error: #{e}"
    return nil
  ensure
    conn.close
  end
end
Extract Surrounding
      Method
def charge(amount, ccnumber)
  begin
    conn = CC_Charger_Server.connect(...)
    conn.send(amount, card_number)
  rescue IOError => e
    Logger.log "Error: #{e}"
    return nil
  ensure
    conn.close
  end
end
def charge(amount, card_number)
  connect do |conn|
    conn.send(amount, card_number)
  end
end
def connect
  begin
    conn = CC_Charger_Server.connect(...)
    yield conn
  rescue IOError => e
    Logger.log "Error: #{e}"
    return nil
  ensure
    conn.close
  end
end
def body_fat_percentage(name,
  age, height, weight, metric_system)
  ...
end
body_fat_percentage("fred", 30, 1.82, 90, 1)
body_fat_percentage("joe", 32, 6, 220, 2)
body_fat_percentage("fred", 30, 1.82, 90, 1)
body_fat_percentage("joe", 32, 6, 220, 2)
Introduce Named Parameter
body_fat_percentage("fred", 30, 1.82, 90, 1)
body_fat_percentage("joe", 32, 6, 220, 2)
body_fat_percentage("fred", :age => 30,
  :height => 1.82, :weight => 90,
  MetricSystem::METERS_KG)

body_fat_percentage("joe", :age => 32,
  :height => 6, :weight => 220,
  MetricSystem::FEET_LB)
def body_fat_percentage(name,
  age, height, weight, metric_system)
  ...
end
def   body_fat_percentage(name, params={})
  #   params[:age]
  #   params[:height]
  #   params[:weight]
  #   params[:metric_system]
end
user.posts.paginate(:page => params[:page],
    :per_page => params[:per_page] || 15)
user.posts.paginate(:page => params[:page],
    :per_page => params[:per_page] || 15)
Replace Magic Number
with Symbolic Constant
user.posts.paginate(:page => params[:page],
    :per_page => params[:per_page] || 15)
CONTACTS_PER_PAGE = 15

user.posts.paginate(:page => params[:page],
    :per_page => params[:per_page] ||
CONTACTS_PER_PAGE)
class MountainBike
  def price
    ...
  end
end

MountainBike.new(:type => :rigid, ...)
MountainBike.new(:type => :front_suspension, ...)
MountainBike.new(:type => :full_suspension, ...)
def price
  if @type_code == :rigid
      (1 + @comission) * @base_price
  end
  if @type_code == :font_suspension
    (1 + @comission) * @base_price +
    @front_suspension_price
  end
  if @type_code == :full_suspension
    (1 + @comission) * @base_price+
    @front_suspension_price +
    @rear_suspension_price
  end




end
def price
  if @type_code == :rigid
      (1 + @comission) * @base_price
  end
  if @type_code == :font_suspension
    (1 + @comission) * @base_price +
    @front_suspension_price
  end
  if @type_code == :full_suspension
    (1 + @comission) * @base_price+
    @front_suspension_price +
    @rear_suspension_price
  end
  if @type_code == :ultra_suspension
      ...
  end
end
CLOSED for modification
  OPEN for extension
Replace Conditional
With Polymorphism
class MountainBike
  def price
    ...
  end
end
module MountainBike
  def price
    ...
  end
end
class RigidMountainBike
  include MountainBike
end

class FrontSuspensionMountainBike
  include MountainBike
end

class FullSuspensionMountainBike
  include MountainBike
end
RigidMountainBike.new(:type => :rigid, ...)

FrontSuspensionMountainBike.new(:type =>
:front_suspension, ...)

FullSuspensionMountainBike.new(:type =>
 :full_suspension, ...)
class RigidMountainBike
  include MountainBike

  def price
    (1 + @comission) * @base_price
  end
end
class FrontSuspensionMountainBike
  include MountainBike
  def price
    (1 + @comission) * @base_price +
    @front_suspension_price
  end
end

class FullSuspensionMountainBike
  include MountainBike
  def price
    (1 + @comission) * @base_price +
    @front_suspension_price +
    @rear_suspension_price
  end
end
def price
  if @type_code == :rigid
    raise "should not be called"
  end
  if @type_code == :font_suspension
    (1 + @comission) * @base_price +
    @front_suspension_price
  end
  if @type_code == :full_suspension
    (1 + @comission) * @base_price+
    @front_suspension_price +
    @rear_suspension_price
  end
end
def price
  if @type_code == :rigid
    raise "should not be called"
  end
  if @type_code == :font_suspension
    raise "should not be called"
  end
  if @type_code == :full_suspension
    raise "should not be called"
  end
end
def price
  if @type_code == :rigid
    raise "should not be called"
  end
  if @type_code == :font_suspension
    raise "should not be called"
  end
  if @type_code == :full_suspension
    raise "should not be called"
  end
end
class RigidMountainBike
  include MountainBike
end

class FrontSuspensionMountainBike
  include MountainBike
end

class FullSuspensionMountainBike
  include MountainBike
end
Coding Dojo




  http://orlandodojo.org/
  http://dojorio.org/
Obrigado!
           http://www.flickr.com/photos/eurleif/255241547/
           http://www.flickr.com/photos/dhammza/91435718/
           http://www.flickr.com/photos/krash0387
           http://www.flickr.com/photos/benfrantzdale/208672143/
           http://www.flickr.com/photos/improveit/1574023621/
           http://www.flickr.com/photos/aaroncoyle/972403508
           http://www.flickr.com/photos/talios/3726484920
           http://www.flickr.com/photos/moow/3412079622
           http://www.flickr.com/photos/highwayoflife/2699887178/


@caike
http://caikesouza.com
http://smallactsmanifesto.org

Contenu connexe

Similaire à Refactoring Ruby Code

How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everythingnoelrap
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescriptDavid Furber
 
Object Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonObject Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonPython Ireland
 
Polyglot Programming in the JVM
Polyglot Programming in the JVMPolyglot Programming in the JVM
Polyglot Programming in the JVMAndres Almiray
 
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017 Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017 Codemotion
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Coxlachie
 
tictactoe groovy
tictactoe groovytictactoe groovy
tictactoe groovyPaul King
 
Attributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active recordAttributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active record.toster
 
How to write maintainable code without tests
How to write maintainable code without testsHow to write maintainable code without tests
How to write maintainable code without testsJuti Noppornpitak
 
November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2Kacper Gunia
 
Vision academy classes bcs_bca_bba_sybba_php
Vision academy  classes bcs_bca_bba_sybba_phpVision academy  classes bcs_bca_bba_sybba_php
Vision academy classes bcs_bca_bba_sybba_phpsachin892777
 
RSpock Testing Framework for Ruby
RSpock Testing Framework for RubyRSpock Testing Framework for Ruby
RSpock Testing Framework for RubyBrice Argenson
 
Ruby Language - A quick tour
Ruby Language - A quick tourRuby Language - A quick tour
Ruby Language - A quick touraztack
 
Intermediate SQL with Ecto - LoneStar ElixirConf 2018
Intermediate SQL with Ecto - LoneStar ElixirConf 2018Intermediate SQL with Ecto - LoneStar ElixirConf 2018
Intermediate SQL with Ecto - LoneStar ElixirConf 2018wreckoning
 
Re-Design with Elixir/OTP
Re-Design with Elixir/OTPRe-Design with Elixir/OTP
Re-Design with Elixir/OTPMustafa TURAN
 

Similaire à Refactoring Ruby Code (20)

Refactoring
RefactoringRefactoring
Refactoring
 
Refactoring
RefactoringRefactoring
Refactoring
 
Language supports it
Language supports itLanguage supports it
Language supports it
 
Ruby tricks2
Ruby tricks2Ruby tricks2
Ruby tricks2
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 
Object Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonObject Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in Python
 
Polyglot Programming in the JVM
Polyglot Programming in the JVMPolyglot Programming in the JVM
Polyglot Programming in the JVM
 
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017 Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Cox
 
tictactoe groovy
tictactoe groovytictactoe groovy
tictactoe groovy
 
Attributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active recordAttributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active record
 
How to write maintainable code without tests
How to write maintainable code without testsHow to write maintainable code without tests
How to write maintainable code without tests
 
November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2
 
Vision academy classes bcs_bca_bba_sybba_php
Vision academy  classes bcs_bca_bba_sybba_phpVision academy  classes bcs_bca_bba_sybba_php
Vision academy classes bcs_bca_bba_sybba_php
 
RSpock Testing Framework for Ruby
RSpock Testing Framework for RubyRSpock Testing Framework for Ruby
RSpock Testing Framework for Ruby
 
Ruby Language - A quick tour
Ruby Language - A quick tourRuby Language - A quick tour
Ruby Language - A quick tour
 
Intermediate SQL with Ecto - LoneStar ElixirConf 2018
Intermediate SQL with Ecto - LoneStar ElixirConf 2018Intermediate SQL with Ecto - LoneStar ElixirConf 2018
Intermediate SQL with Ecto - LoneStar ElixirConf 2018
 
Re-Design with Elixir/OTP
Re-Design with Elixir/OTPRe-Design with Elixir/OTP
Re-Design with Elixir/OTP
 

Dernier

Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 

Dernier (20)

Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 

Refactoring Ruby Code