This book describes an object-oriented design approach that combines the benefits of abstract modeling with the analytic power of formal methods to give designs that can be rigorously validated and assured with automated support. Aimed at software architects, designers, and developers as well as computer scientists, the elements of functional modeling are introduced using numerous examples and exercises, industrial case studies, and experience reports. Industry-strength tools support the text.