должна быть сильно ограниченной. • Принцип закрытости к изменению и открытости к расширению. Кратко: больше, но не иначе. • Принцип подстановки Барбары Лисков - согласно ему, когда B < A, экземпляры класса B должны быть способны заменить экземпляры класса A, то есть сущности типа B не ломают унаследованный интерфейс. Частный случай O/C принципа. • Принцип разделения интерфейсов - согласно этому принципу множество простых интерфейсов лучше, чем один сложный. Частный случай SR принципа. • Принцип инверсии зависимостей, согласно которому вышележащие слои не должны зависеть от лежащих ниже.
суммы его частей. - Аристотель. • Система - это её компоненты и логика над ними. - me. • Компоненты ничего не знают друг о друге, как шестерни в часах не знают ничего о других шестернях. • Система организует компоненты и описывает взаимодействие между ними. • Система играет роль композиции и абстракции. Компоненты системы - детали, система - черный ящик.
ПО, которая не позволяет в адекватные сроки поставлять запрашиваемую функциональность. Кроме того, при рефакторинге ассоциаций, весь код, что их использует идет в корзину. Ошибки в модели предметной области и архитектуре приводят к бесполезной работе и регрессии.
напрямую не ссылаются друг на друга и ничего о существовании друг друга не знают. • Для связывания сущностей используются ассоциации. • Ассоциации помещаются в агрегаты, которые являются системами над сущностями, а сущности - их компонентами.
end class Order < ActiveRecord::Base belongs_to :customer has_many :items, class_name: “OrderItem” end class OrderItem < ActiveRecord::Base belongs_to :order belongs_to :product end
как и без OrderItem’ов. • По этой причине Order не является сущностью, но является купированной ассоциацией между Customer и Product. • Необходимости в Order нет. Добавлением товаров в корзину Customer лишь устанавливает ассоциацию между собой и товарами. Он их желает, а они желаем им.
:ordered_products end class Delivery < ActiveRecord::Base has_many :ordered_products end class OrderedProduct < ActiveRecord::Base belongs_to :order belongs_to :product belongs_to :payment belongs_to :delivery end
имеет ничего общего с оплатой и доставкой. • При использовании реляционных баз данных payment_id и delivery_id у OrderedProduct будут помечены пустыми (NULL).
с доставкой - это передача товара одного участника процесса доставки другому. Физически товар может не перемещаться. Пускай доставка состоит из: • Packaging • Shipment • Transport • Unloading • Commitment
такой агрегации. Delivery - избыточная сущность. Сам процесс описывается ассоциациями. class Delivery < ActiveRecord::Base belongs_to :paid_ordered_product end
ActiveRecord::Base belongs_to :packaged_ordered_product end class TransportedOrderedProduct < ActiveRecord::Base belongs_to :shipped_ordered_product end class UnloadedOrderedProduct < ActiveRecord::Base belongs_to :transported_ordered_product end class CommittedOrderedProduct < ActiveRecord::Base belongs_to :unloaded_ordered_product end
одновременно PRIMARY KEY и FOREIGN KEY ссылающимся на PaidOrderedProduct и OrderedProduct. • shipped_ordered_products.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY ссылающимся на PackagedOrderedProduct, PaidOrderedProduct и OrderedProduct. • transported_ordered_products.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY ссылающимся на ShippedOrderedProduct, PackagedOrderedProduct, PaidOrderedProduct и OrderedProduct. • outloaded_ordered_products.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY ссылающимся на TransportedOrderedProduct, ShippedOrderedProduct, PackagedOrderedProduct, PaidOrderedProduct и OrderedProduct. • commited_ordered_product.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY ссылающимся на OutloadedOrderedProduct, TransportedOrderedProduct, ShippedOrderedProduct, PackagedOrderedProducts, PaidOrderedProduct и OrderedProduct.
тестов описываем правильное поведение системы. Тесты падают. • Экспериментируем с решением проблемы (пишем много грязного кода). Тесты становятся зелеными. • Рефакторим код, который исправляет поведение системы. Тесты остаются зелеными.
described_class } describe “.new” do context “when good args” do it “returns something” do … end end context “when bad args” do it “raises ArgumentError” do … end end end end describe “instance” do subject { described_class.new … } … end end