У меня очень общий вопрос о дизайне, но я сформулирую его в конкретных терминах на примере.
Предположим, вы работаете над встроенным программным обеспечением для цифрового принтера. Машина имеет 4 печатающих головки (для каждого из цветов C, M, Y, K). Каждая печатающая головка выполняет одну и ту же задачу: извлекает тонер и помещает его на страницу.
Во время выполнения мы могли бы организовать наш API двумя различными способами. Либо мы придерживаемся логического («функционального» или «технологического») дизайна, чтобы клиентское программное обеспечение могло контролировать процесс печати на всех печатающих головках (например, изменять яркость всех цветов одновременно). Или мы придерживаемся физического плана, чтобы клиентское программное обеспечение могло управлять каждой печатающей головкой индивидуально (например, изменять яркость только пурпурного цвета).
Это классическая дилемма в разработке программного обеспечения: мы организуем либо по видам деятельности, либо по архитектуре. По функции или по форме. У меня вопрос: есть ли какие-то твердые критерии для выбора одного над другим? Различные проекты будут выбирать по-разному и оба могут быть правильными в зависимости от их собственной ситуации; так что я не спрашиваю, что лучше, только как выбрать. Например. Мне были бы интересны ваши идеи по поводу слабой связи, ремонтопригодности, наслоения, ролевого проектирования, архитектурных шаблонов проектирования и т. Д.