SlideShare une entreprise Scribd logo
1  sur  108
Télécharger pour lire hors ligne
Refactoring
.... porque apenas fazer
funcionar não é o suficiente.

                   @caike
                   caikesouza.com
www.envylabs.com
Orlando Coding Dojo




http://orlandodojo.org
Refatorar é...
realizar mudanças internas em um
programa funcional com o objetivo torná-lo
mais fácil de ser compreendido e mais
barato de ser modificado - sem que haja
mudanças no comportamento externo;
Limpar a casa sem
 mudar a fachada
Métodos
 Ágeis
Refactoring
eXtreme
Programming
Scrum ?
Testes
(Anti-)Patterns
Software
Craftsmanship
Refactoring
"Any fool can write code that
   a computer can understand.
Good programmers write code that
    humans can understand"

          (Martin Fowler)
Refactoring
Benefícios
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
TDD
Red
 Green
Refactor
bugs
TDD
Red
 Green
Refactor
Code Reviews
om
         c o
        e çã
   il izReviews
Code ra
  t e
 U d
  m   o
“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)
Refactoring
Débito Técnico
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
Refactoring
Refactoring
Refactoring
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
class Movie
  def initialize(stars)
    @stars = stars
  end

  def recommended?
    rating() >= 8
  end

  def rating
    (@stars > 5) ? 8 : 1
  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
    more_than_five_stars? ? 8 : 1
  end

  def more_than_five_stars?
    @stars > 5
  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
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)
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_charge(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_charge(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_charge(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_charge(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)
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, params={})
  #   params[:age]
  #   params[:height]
  #   params[:weight]
  #   params[:metric_system]
end
class MountainBike
  def price
    ...
  end
end

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




end
def price
  if @type == :rigid
      (1 + @comission) * @base_price
  end
  if @type == :font_suspension
    (1 + @comission) * @base_price +
    @front_suspension_price
  end
  if @type == :full_suspension
    (1 + @comission) * @base_price+
    @front_suspension_price +
    @rear_suspension_price
  end
  if @type == :ultra_suspension
      ...
  end
end
FECHADAS
para modificações

   ABERTAS
 para extensões
Refactoring
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
def price
  if @type == :rigid
    raise "should not be called"
  end
  if @type == :font_suspension
    (1 + @comission) * @base_price +
    @front_suspension_price
  end
  if @type == :full_suspension
    (1 + @comission) * @base_price+
    @front_suspension_price +
    @rear_suspension_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 == :rigid
    raise "should not be called"
  end
  if @type == :font_suspension
    raise "should not be called"
  end
  if @type == :full_suspension
    raise "should not be called"
  end
end
def price
  if @type == :rigid
    raise "should not be called"
  end
  if @type == :font_suspension
    raise "should not be called"
  end
  if @type == :full_suspension
    raise "should not be called"
  end
end
class RigidMountainBike
  include MountainBike
end

class FrontSuspensionMountainBike
  include MountainBike
end

class FullSuspensionMountainBike
  include MountainBike
end
Já posso ser um
  Programador
   RockStar ?
NÃO
“I’m not a great programmer.
 I’m just a good programmer
     with great habits”

          (Kent Beck)
"People are non-linear,
first-order components in
 software development"
      (Alistair Cockburn)
Refactoring
Refactoring
.... porque apenas fazer
funcionar não é o suficiente.
      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/      @caike
      http://www.flickr.com/photos/aaroncoyle/972403508
      http://www.flickr.com/photos/talios/3726484920
      http://www.flickr.com/photos/moow/3412079622
                                                             caikesouza.com
      http://www.flickr.com/photos/highwayoflife/2699887178/

Contenu connexe

Similaire à Refactoring

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
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Plataformatec
 
Decent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivarsDecent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivarsLeonardo Soto
 
Polyglot Programming in the JVM
Polyglot Programming in the JVMPolyglot Programming in the JVM
Polyglot Programming in the JVMAndres Almiray
 
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
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescriptDavid Furber
 
"Full Stack frameworks or a story about how to reconcile Front (good) and Bac...
"Full Stack frameworks or a story about how to reconcile Front (good) and Bac..."Full Stack frameworks or a story about how to reconcile Front (good) and Bac...
"Full Stack frameworks or a story about how to reconcile Front (good) and Bac...Fwdays
 
Test Driven Development With Python
Test Driven Development With PythonTest Driven Development With Python
Test Driven Development With PythonSiddhi
 
PHP Performance Trivia
PHP Performance TriviaPHP Performance Trivia
PHP Performance TriviaNikita Popov
 
Re-Design with Elixir/OTP
Re-Design with Elixir/OTPRe-Design with Elixir/OTP
Re-Design with Elixir/OTPMustafa TURAN
 
Mutation testing with the mutant gem
Mutation testing with the mutant gemMutation testing with the mutant gem
Mutation testing with the mutant gemDonSchado
 
Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous MerbMatt Todd
 
Dealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter ScottDealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter ScottO'Reilly Media
 
Say Goodbye to Procedural Programming - Nick Sutterer
Say Goodbye to Procedural Programming - Nick SuttererSay Goodbye to Procedural Programming - Nick Sutterer
Say Goodbye to Procedural Programming - Nick SuttererRuby Meditation
 
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
 

Similaire à Refactoring (20)

Refactoring
RefactoringRefactoring
Refactoring
 
Refactoring
RefactoringRefactoring
Refactoring
 
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
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
 
Decent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivarsDecent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivars
 
Ruby tricks2
Ruby tricks2Ruby tricks2
Ruby tricks2
 
Polyglot Programming in the JVM
Polyglot Programming in the JVMPolyglot Programming in the JVM
Polyglot Programming in the JVM
 
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
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 
"Full Stack frameworks or a story about how to reconcile Front (good) and Bac...
"Full Stack frameworks or a story about how to reconcile Front (good) and Bac..."Full Stack frameworks or a story about how to reconcile Front (good) and Bac...
"Full Stack frameworks or a story about how to reconcile Front (good) and Bac...
 
Test Driven Development With Python
Test Driven Development With PythonTest Driven Development With Python
Test Driven Development With Python
 
PHP Performance Trivia
PHP Performance TriviaPHP Performance Trivia
PHP Performance Trivia
 
Re-Design with Elixir/OTP
Re-Design with Elixir/OTPRe-Design with Elixir/OTP
Re-Design with Elixir/OTP
 
Mutation testing with the mutant gem
Mutation testing with the mutant gemMutation testing with the mutant gem
Mutation testing with the mutant gem
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous Merb
 
Dealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter ScottDealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter Scott
 
Say Goodbye to Procedural Programming - Nick Sutterer
Say Goodbye to Procedural Programming - Nick SuttererSay Goodbye to Procedural Programming - Nick Sutterer
Say Goodbye to Procedural Programming - Nick Sutterer
 
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
 
Repair dagstuhl jan2017
Repair dagstuhl jan2017Repair dagstuhl jan2017
Repair dagstuhl jan2017
 

Dernier

100+ ChatGPT Prompts for SEO Optimization
100+ ChatGPT Prompts for SEO Optimization100+ ChatGPT Prompts for SEO Optimization
100+ ChatGPT Prompts for SEO Optimizationarrow10202532yuvraj
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
Governance in SharePoint Premium:What's in the box?
Governance in SharePoint Premium:What's in the box?Governance in SharePoint Premium:What's in the box?
Governance in SharePoint Premium:What's in the box?Juan Carlos Gonzalez
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Commit University
 
IEEE Computer Society’s Strategic Activities and Products including SWEBOK Guide
IEEE Computer Society’s Strategic Activities and Products including SWEBOK GuideIEEE Computer Society’s Strategic Activities and Products including SWEBOK Guide
IEEE Computer Society’s Strategic Activities and Products including SWEBOK GuideHironori Washizaki
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsSafe Software
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1DianaGray10
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemAsko Soukka
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationIES VE
 
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"DianaGray10
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 

Dernier (20)

100+ ChatGPT Prompts for SEO Optimization
100+ ChatGPT Prompts for SEO Optimization100+ ChatGPT Prompts for SEO Optimization
100+ ChatGPT Prompts for SEO Optimization
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
201610817 - edge part1
201610817 - edge part1201610817 - edge part1
201610817 - edge part1
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
Governance in SharePoint Premium:What's in the box?
Governance in SharePoint Premium:What's in the box?Governance in SharePoint Premium:What's in the box?
Governance in SharePoint Premium:What's in the box?
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)
 
IEEE Computer Society’s Strategic Activities and Products including SWEBOK Guide
IEEE Computer Society’s Strategic Activities and Products including SWEBOK GuideIEEE Computer Society’s Strategic Activities and Products including SWEBOK Guide
IEEE Computer Society’s Strategic Activities and Products including SWEBOK Guide
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystem
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
 
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 

Refactoring