Created
July 17, 2022 08:02
-
-
Save rtrv/aeb3d1ca533e1e2c68e2ecfd4d45955b to your computer and use it in GitHub Desktop.
OOP workshop code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Базовые требования | |
# Нужно разработать виртуальный пивной завод. У завода можно запросить нужное количество нужного пива | |
# Базовая объектная структурая завода должна подходить для любого конвейерного производства | |
# Пиво можно выпускать в банках и бутылках | |
# У бутылки должна быть пробка | |
# Любое пиво можно открыть и выпить, у него есть стоимость, которая состоит из себестоимости и стоимости упаковки | |
# Должна быть возможность проанализировать выпущенную заводом продукцию: посчитать общую прибыль, оценить запасы упаковки | |
# Упаковку нужно привозить на завод отдельно и хранить на складе | |
# Бутылки могут быть сданы в переработку и использоваться повторно, банки могут использоваться только один раз | |
# Если банку пытаются использовать повторно, конвейер должен сообщать о замене и использовать другую банку | |
# Проектировать завод по возможности таким образом, чтобы можно было переиспользовать код под любое конвейерное производство | |
require 'forwardable' | |
# Abstract | |
class PackedProduct | |
attr_reader :cost, :package, :empty | |
def initialize | |
def open | |
raise NotImplemented | |
end | |
def open? | |
raise NotImplemented | |
end | |
def empty? | |
empty | |
end | |
end | |
class Beer < PackedProduct | |
attr_reader :cost, :package, :empty | |
extend Forwardable | |
def_delegators :@package, :open?, :open! | |
def initialize | |
@cost = 2 | |
@package = Bottle.new | |
@empty = false | |
end | |
def drink! | |
# raise if empty | |
raise if @empty | |
# raise if closed | |
raise unless open? | |
@empty = true | |
puts "I'm now empty" | |
end | |
end | |
class Package | |
attr_reader :cost, :open | |
def open! | |
raise NotImplemented | |
end | |
def open? | |
raise NotImplemented | |
end | |
end | |
class Bottle < Package | |
def initialize | |
@cap = Bottlecap.new | |
end | |
def open! | |
# raise 'Not openable' | |
@cap = nil | |
end | |
def open? | |
@cap.nil? | |
end | |
end | |
class Bottlecap; end | |
class Can < Package | |
def open! | |
@open = true | |
end | |
def open? | |
@open | |
end | |
end | |
class Kega < Package; end | |
class Container | |
attr_reader :limit | |
def reset_limit | |
some_complex_stuff | |
end | |
private | |
attr_reader :some_value | |
def some_complex_stuff | |
# TODO: Use some_value | |
puts 'Doing complex job...' | |
end | |
end | |
class Factory | |
PRODUCT_CLASS = nil | |
attr_reader :produced_goods | |
def initialize(name:) | |
@name = name | |
@produced_goods = [] | |
end | |
# TODO: why bang? | |
def produce!(quantity:, product_class:) | |
batch = [] | |
quantity.times do | |
batch << product_class.new | |
end | |
@produced_goods += batch | |
batch | |
end | |
end | |
class BeerFactory < Factory | |
PRODUCT_CLASS = Beer | |
def initialize | |
# TODO: | |
@permissions = [] | |
super | |
end | |
def produce!(quantity:) | |
batch = [] | |
quantity.times do | |
batch << PRODUCT_CLASS.new | |
end | |
@produced_goods += batch | |
batch | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment