Сначала прототип, затем позвольте появиться границам интерфейса.
Упреждающий дизайн интерфейса может затруднить кодирование
Попытка спроектировать барьеры абстракции до того, как вы начнете кодировать, может быть хитрой, так как вы рискуете двумя рисками,Во-первых, вы неизбежно создадите некоторые абстракционные барьеры в неправильных местах, и когда вы начнете писать рабочий код (в отличие от кода интерфейса), вы обнаружите, что ваши интерфейсы плохо справляются с вашей задачей, несмотря на то, что они звучат хорошо, если их описывать на естественном языке.Другая проблема заключается в том, что это делает кодирование более трудоемким, поскольку вам приходится совмещать две проблемы в своей голове, а не одну: написание рабочего кода для проблемы, которую вы еще не до конца понимаете, и придерживание интерфейса, который может привести кплохая.
Границы интерфейса возникают из рабочего кода.
Я, конечно, не говорю, что интерфейсы плохие, но их сложно спроектировать правильно, не написав сначала рабочий код.,Когда у вас есть рабочая программа, становится очевидным, какие части должны быть различными экземплярами одной и той же виртуальной функции, какие функции должны совместно использовать ресурсы (и, следовательно, должны быть помещены в один класс) и т. Д.
Prototype,затем нарисуйте только те границы интерфейса, которые вам нужны.
Поэтому я согласен с предложением @ jdv-Jan de Vaan о том, что первое, что нужно сделать, это взорвать самую короткую читаемую программу, которая работает.(Это отличается от самой короткой программы, которая работает. Конечно, даже в самом начале существует некоторый минимальный дизайн интерфейса.) Я хочу добавить, что после этого следует дизайн интерфейса.То есть, получив простой код, вы можете преобразовать его в интерфейсы, чтобы сделать его еще короче и более читабельным.Если вам нужны интерфейсы для переносимости, я бы не стал этого делать, пока у вас не будет кода для двух или более платформ.Тогда границы интерфейса будут возникать естественным (и тестируемым) образом, когда станет ясно, какие функции можно использовать как есть для обоих, а какие должны иметь несколько реализаций, скрытых за интерфейсами.