Доклад о базовых принципах построения ООП приложений на примере ruby
Видео доклада можно посмотреть по ссылке
https://www.youtube.com/watch?v=42BP2s5aUSs
4. /evrone.
ХОРОШО ПОДДЕРЖИВАЕМЫЙ КОД
▸ Изменения не имеют неожиданных побочных эффектов
▸ Незначительные изменения в требованиях несут незначительные
изменения в коде
▸ Код легко поддается повторному использованию
9. /evrone.
SINGLE RESPONSIBILITY PRINCIPLE
▸ Делает бороду более шелковистой
▸ Классы и методы становятся небольшими и легко читаемыми
▸ SRP позволяет строить более четкую архитектуру классов
▸ Код легче тестировать
10. /evrone.
SINGLE RESPONSIBILITY PRINCIPLE
О чем говорит принцип единственной обязанности?
▸ Loose coupling / High cohension
▸ Класс должен иметь одну причину для изменения. Эта причина и
называется ответственностью
12. /evrone.
SINGLE RESPONSIBILITY PRINCIPLE
class Video
after_save :deliver_published, if: -> { cond. }
private
def deliver_published
VideoMailer.deliver_video_published(self)
end
end
class VideosController
def publish
video.update_attribute(:published, true)
VideoMailer.deliver_video_published(video)
end
end
13. /evrone.
SINGLE RESPONSIBILITY PRINCIPLE
class VideosController
def publish
VideoPublisher.new(video).publish
end
end
class VideoPublisher
….
def publish
video.update_attribute(:published, true)
VideoMailer.deliver_video_published(video)
end
end
15. /evrone.
OPEN / CLOSED PRINCIPLE
▸ Классы должны быть открыты для расширения
▸ Классы должны быть закрыты для модификации
16. /evrone.
OPEN / CLOSED PRINCIPLE
class FileConverter
attr_reader :file
def initialize(file)
@file = file
end
…
def convert!
case file.format
when :image
convert_image
when :video
convert_video
end
end
17. /evrone.
OPEN / CLOSED PRINCIPLE
class FileConverter
attr_reader :file, converter
def initialize(file, converter)
@file = file
@converter = converter
end
…
def convert!
converter.convert(file)
end
18. /evrone.
OPEN / CLOSED PRINCIPLE
class ImageConverter
def convert(image)
end
end
class VideoConverter
def convert(image)
end
end
20. /evrone.
LISKOV SUBSTITUTION PRINCIPLE
“Пусть q(x) бла бла бла x бла бла бла T. Тогда q(y)
бла бла бла y бла бла бла S, где S является
подтипом типа T.” -
формальное описание принципа подстановки Барбары Лисков
25. /evrone.
INTERFACE SEGREGATION PRINCIPLE
class Video
def publish; end
def delete; end
end
class VideoPublisher
extend Forwardable
def_delegators :@video, :publish
def initialize(video); @video = video; end
end
VideoPublisher.new(video).publish # => true
VideoPublisher.new(video).delete #=> NoMethorError
30. /evrone.
DRY
Когда DRY goes wrong
1. Программист А видит дублирование кода и выносит его в отдельный
метод. Это создает новую абстракцию.
2. Приходят новые требования, которые почти подходят этой
абстракции.
3. Программист Б решает сохранить предыдущую абстракцию, добавив
новый параметр методу и условие.
4. Так продолжается, пока абстракция становится не поддерживаемой.
32. /evrone.
LAW OF DEMETER
Метод объекта должен вызывать только методы следующих объектов:
▸ самого себя;
▸ его параметров;
▸ объектов, которые он создает;
▸ компонентов объекта.
33. /evrone.
LAW OF DEMETER
Аналогия от Peter Van Rooijen:
▸ You can play with yourself.
▸ You can play with your own toys (but you can’t take them apart),
▸ You can play with toys that were given to you.
▸ And you can play with toys you’ve made yourself.