Object-oriented design and programming
| Course length: | 3 days |
| Dates/Locations: | see course schedule |
| Price: | € 1425,– (excluding VAT) |
| Included: all course materials, lunch, coffee, tea, soda, and snacks | |
| Registration: | Online registration form |
This course can also be given in-house. Contact us for more information.
Target audience
You are a programmer or a beginning software architect with at least one year of experience in a language that supports object orientation, such as Delphi, Java, C++, or C#. You understand the general concepts of object orientation, and you are familiar with the basic OO-supporting mechanisms in your favourite programming language.
However, you discovered that in practice, it can be hard to subdivide a system into a set of classes. Where should you put the data and the functions? And how should these classes relate and interact? At times, you wonder if object orientation isn't making software development more complex, instead of less. You may have written several large classes that do too much. Or many small classes that hardly do anything. Or both. Either way, it didn't feel as if you had a grip on complexity. You may have used some dirty tricks, such as exposing the inner parts of a class to another class in some clever way, just to get things to work, but it didn't feel right. You suspect that object-oriented design and programming should't have to be this way, but you are somewhat lost.
Don't worry; this is natural. It is actually very valuable to realise, based on practical experience, that these kinds of problems exist. It means that you are ready to move to the next level in software design. You just need some very concrete guidelines and heuristics for applying object orientation in a useful way in your day-to-day work (which for most people is a little bit more complicated than the ubiquitous ATM machine with just the three functions `check_balance()', `withdraw()', and `deposit()').
Contact us if you are unsure if this is the right course for you.
What you will learn
You will learn concrete heuristics, applicable to real-world problems, for decomposing a system into a set of classes, and for choosing the right mechanisms for making these classes work together. You will see the importance of interfaces, and you will learn how to keep them coherent and as small as possible–but not smaller. You will understand that while code reuse is a good thing, inheritance is usually not the mechanisms of choice for reuse of implementation. And, of course, you will see for what type of reuse inheritance is appropriate. You will learn how polymorphism helps you to make your design flexible, and even allows for switching between alternative implementations during runtime. You will learn how to keep dependencies between classes minimal, so that the impact of changing requirements or environment is minimised. Your experience that system design tends to degrade when the system grow will be confirmed, but you will learn to identify the signs and symptoms of design problems early on, and you will see how refactoring gets you back on track.
Course format
The balance between theory and practice in this course is about 70% to 30%. In the practical assignments you will be asked to formulate design alternatives for a given problem, and to evaluate the pros and cons of the alternatives. These are precisely the kind of problems that are hard in practice. Some of the assignments are done individually, others in pairs.
The group size is at most 12 persons, so that the difference in experience between participants will not be too large, and such that we can cater to the individual needs and learning goals of all participants.
If all participants speak Dutch, the course is given in Dutch; otherwise, the course is given in English. All course materials are in English.
As all other 59bits courses, this course is intensive and high-paced, but with sufficient smaller and larger breaks to rejuvenate, and to enable you to to process and retain all course content.
Please make sure to read our general course information.
Course topics/keywords
The following list of topics is not exhaustive, and is meant to give you an impression of what you can expect:
- Brief recap: classes and objects, messages and methods, class methods/class data
- Encapsulation: what's the big deal?
- Types of relationships (uses, contains, inheritance, association): how do you choose between them?
- Abstraction, inheritance, polymorphism: when and how does your design benefit?
- Coupling and cohesion: why do these concepts matter?
- SOLID principles (Single responsibility, Open/closed, Liskov substitution, Interface segregation, Dependency inversion): why should you care?
- Refactoring: how do you maintain a sound design when the system grows and requirements change?