Мы пробовали писать так, как рекомендует товарищ Costic. Мой коллега умышленно добавлял уровени абстракции везде, где ему
только показалось, что это может хоть когда-нибудь пригодиться. Я удивился. А он пояснил (не дословно, смысл): "Я не
знаю, как потом я буду развивать этот код дальше. Поэтому
предусматриваю эти абстракции, чтобы можно было удобно вмешаться на
любом уровне." На моё возражение, что, быстродействие может
пострадать, он ответил: "Какое у нас время цикла? Сколько у меня тактов? ... У нас достаточный запас, пожалуй, пару порядков. В крайнем случае, возьмём контроллер по-мощнее".
И его подход оказался очень эффективен с точки зрения разработки. То, что для обычного подхода, могло оказаться "костылями", отлично ложилось на заранее предусмотренные уровни абстракций.
Да, с первого взгляда невозможно понять, что делает код, потому, что его не выложить на одну страницу, не вытянуть в один цельный текст. Чтобы понять как оно работает, нужно ознакомится с документацией - иначе человеку почти невозможно выудить информацию из, казалось бы, бессвязного кода. Так что тут нужно признать, лишние абстракции могут и затруднять чтение программы. Зато компилятор отлично справляется. При максимальной оптимизации на скорость, с включённой LTO, разница в эффективности машинного кода исчезающе мала для бизнес-логики.