As a contract, you should provide minimal services, since you will always have to support these services not only in the current version, but in all future versions. This level of indirection allows you to modify algorithms and tune the performance of blocks of code since they were not exposed and were not accessible to outsiders, and thus have no dependencies. Don't hide power Leave functionality to the client Continuing from Lampson's last point, it is difficult to know a priori how something will be used. A common principle in object-oriented design is to provide rich mechanism with little policy . The mechanism are the parts of the system that usually do not change, while the policy are the parts that often do.
User preferences are a simple example of policy.
As another example, mechanisms for Virtual Memory Page Swapping include paging out a frame and paging in a frame, while the policy specifies which page to page out and which ones to prefetch. Invisibility and Correctness Be invisible to the user, or be correct. I remain unconvinced of much of what proponents of the Bazaar method say it can do, but it does have its advantages. And it looks like it will be here to stay for a while. Orthogonal Properties Separate the properties of your system, so that if you modify one property, it does not affect the others.