Skip to content

Instantly share code, notes, and snippets.

@serradura
Last active February 10, 2023 14:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save serradura/821ed63f2dd3afaebe35c412f593ebfa to your computer and use it in GitHub Desktop.
Save serradura/821ed63f2dd3afaebe35c412f593ebfa 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