As opposed to what most people believe, portability does not guarantee that you can compile and run the same code on every platform without any modifications. Although it is sometimes possible to write 100% portable code, in practice, this code is too complex and inefficient. A better approach is to separate platform-specific modules from the platform-independent parts of the entire application. GUI components, for instance, tend to be very platform specific, and should be encapsulated in dedicated classes. Conversely, business logic and numeric computations are platform-independent. Therefore, when the application is to be ported, only the GUI modules need to be re-written while the rest of the modules can be reused.