I mentor an FRC (FirstFIRST Robotics Competition) team, and they program in java.
The team members who work programming the robot are using an extension1 library which they themselves write.
The library that they write doesn't exactly follow good design concepts. for example, instead of having an interface for describing the functionality of a moving subsystem (a robotic forklift, for instance), they have a class that extends a subsystem, and it contains that functionality.
This is one example, and there are quite a few other examples. I say this to explain that they have quite a bit of code already written, and it would be difficult to make it more abstract and write it with a higher level of design.
So my question is how can I approach the subject, and encourage the students to want to learn and use higher levels of abstractions?
By "approach", I mean bring up the matter, without making it sound as though I think they have to do it, or that their code "won't ever be good unless they do it".
The students can learn it (i.e. they are able and capable of learning those concepts). This question isn't about how to teach it, but rather how to encourage the students to want to learn and apply those concepts
A clarification: I am not their teacher, I am a mentor. I do not teach them, but rather I help them learn (it's informal)
Proper design and abstraction makes code, especially libraries, easier to maintain and easier to use, and also prevents some types of bugs and errors.
That is one of the main points of design patterns, as well as a "side-effect" of following SOLID principles.
1Without going into too much details, I'll say that there is a supplied library for programming the robot, and the team is writing an extension of that library.