Skip to content

Instantly share code, notes, and snippets.

@dnovais
Forked from serradura/oop.rb
Created February 10, 2023 14:18
Show Gist options
  • Save dnovais/c73d313a0a06f944e53d463cf31b05f1 to your computer and use it in GitHub Desktop.
Save dnovais/c73d313a0a06f944e53d463cf31b05f1 to your computer and use it in GitHub Desktop.
Código produzido na live "A verdadeira Orientação a Objetos" em 09/02/2023
####################################
# Pilares da Orientação a Objetos: #
####################################
# 👍 Abstração. | >
# 👍 Encapsulamento | > > Composição 🙌
# 👍 Polimorfismo | >
# 👎 Herança
require 'json'
class Person
# attr_accessor :age, :name
attr_reader :age, :name
def initialize(name:, age:)
@age = age
@name = name
end
def say_hi
puts "Hi, my name is #{@name}"
end
end
# ------------------------------
module FormatToJSON
def self.call(person)
{name: person.name, age: person.age}.to_json
end
end
module FormatToHTML
def self.call(person)
"<strong>#{person.name}</strong>"
end
end
module PrintPerson
def self.print(person, format)
puts format.call(person)
end
end
serradura = Person.new(name: 'Serradura', age: 36)
PrintPerson.print(serradura, FormatToHTML)
PrintPerson.print(serradura, FormatToJSON)
puts
Inspect = ->(person) { person.inspect }
PrintPerson.print(serradura, Inspect)
puts
module Format
PrepareText =->(value) { value.upcase }
module ToJSON
def self.call(person)
PrepareText[{name: person.name, age: person.age}.to_json]
end
end
module ToHTML
def self.call(person)
PrepareText["<strong>#{person.name}</strong>"]
end
end
end
PrintPerson.print(person, Format::ToHTML)
PrintPerson.print(person, Format::ToJSON)
# ------------------------------
class BaseFormatter
attr_reader :person
def initialize(person)
@person = person
end
def call
raise NotImplementedError
end
end
class JSONFormatter < BaseFormatter
def call
{name: person.name, age: person.age}.to_json
end
end
class HTMLFormatter < BaseFormatter
def call
"<strong>#{person.name}</strong>"
end
end
module DisplayPerson
def self.call(person, formatter)
puts formatter.new(person).call
end
end
DisplayPerson.call(person, HTMLFormatter)
DisplayPerson.call(person, JSONFormatter)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment