Проектирование приложения процесс мало того что сложный, неочевидный, так он ещё и не делается по книжкам. Он делается по опыту.
Второй факт, который не стоит забывать - архитектура пишется под приложение, т.е. пока у вас два класса и одна вьюшка, вам не нужна архитектура. А в процессе роста приложения будет нарабатываться опыт, выявляться слабые места, прочая и прочая. В итоге, после 2-3 более менее серьезных приложений вы сможете для себя сформировать основные признаки неплохой архитектуры.
как правильно и где использовать интерфейсы, абстрактные классы и прочее ООП?
Имхо:
1. Интерфейсы можно использовать везде где хочется. Интерфейсы нужно использовать там, где планируется расширение\возможность замены модулей и тп
2. Абстрактный класс отличается только тем, что его нельзя создать. Оно вам надо в таком виде? Делаете обычный класс, в какой то момент нужно расшить его на разные классы? Делаете абстрактным, пилите наследников, поднимаете компилируемость.
3. Прочее ООП там, где вам не нравится ваш же код =)