1. API Design for C 1st Edition Martin Reddy -
Downloadable PDF 2025
https://ebookfinal.com/download/api-design-for-c-1st-edition-martin-
reddy/
Visit ebookfinal.com today to download the complete set of
ebooks or textbooks
2. Here are some recommended products that we believe you will be
interested in. You can click the link to download.
RESTful Web API Design with Node js Second Edition Bojinov
https://ebookfinal.com/download/restful-web-api-design-with-node-js-
second-edition-bojinov/
Pipelined Processor Farms Structured Design for Embedded
Parallel Systems 1st Edition Martin Fleury
https://ebookfinal.com/download/pipelined-processor-farms-structured-
design-for-embedded-parallel-systems-1st-edition-martin-fleury/
Understanding and Applying Research Design 1st Edition
Martin Lee Abbott
https://ebookfinal.com/download/understanding-and-applying-research-
design-1st-edition-martin-lee-abbott/
Statistics and Experimental Design for Toxicologists and
Pharmacologists Fourth Edition Shayne C. Gad
https://ebookfinal.com/download/statistics-and-experimental-design-
for-toxicologists-and-pharmacologists-fourth-edition-shayne-c-gad/
3. Design of Aircraft 1st Edition Thomas C. Corke
https://ebookfinal.com/download/design-of-aircraft-1st-edition-thomas-
c-corke/
An Introduction to Continuum Mechanics 2ed. Edition Reddy
J.N.
https://ebookfinal.com/download/an-introduction-to-continuum-
mechanics-2ed-edition-reddy-j-n/
Machine Design 2010th Edition U. C. Jindal
https://ebookfinal.com/download/machine-design-2010th-edition-u-c-
jindal/
Design Theory 2nd Edition Charles C. Lindner
https://ebookfinal.com/download/design-theory-2nd-edition-charles-c-
lindner/
C 3 0 Design Patterns 1st Edition Judith Bishop
https://ebookfinal.com/download/c-3-0-design-patterns-1st-edition-
judith-bishop/
5. API Design for C 1st Edition Martin Reddy Digital
Instant Download
Author(s): Martin Reddy
ISBN(s): 9780123850034, 0123850037
Edition: 1
File Details: PDF, 17.71 MB
Year: 2011
Language: english
7. Acquiring Editor: Todd Green
Editorial Assistant: Robyn Day
Project Manager: André Cuello
Designer: Eric DeCicco
Morgan Kaufmann is an imprint of Elsevier
30 Corporate Drive, Suite 400, Burlington, MA 01803, USA
# 2011 Elsevier, Inc. All rights reserved.
No part of this publication may be reproduced or transmitted in any form or by any means, electronic
or mechanical, including photocopying, recording, or any information storage and retrieval system,
without permission in writing from the publisher. Details on how to seek permission, further
information about the Publisher’s permissions policies and our arrangements with organizations such
as the Copyright Clearance Center and the Copyright Licensing Agency, can be found at our
website: www.elsevier.com/permissions.
This book and the individual contributions contained in it are protected under copyright by the
Publisher (other than as may be noted herein).
Notices
Knowledge and best practice in this field are constantly changing. As new research and experience broaden
our understanding, changes in research methods or professional practices may become necessary. Practitioners
and researchers must always rely on their own experience and knowledge in evaluating and using any
information or methods described herein. In using such information or methods they should be mindful of their
own safety and the safety of others, including parties for whom they have a professional responsibility.
To the fullest extent of the law, neither the Publisher nor the authors, contributors, or editors, assume any liability for
any injury and/or damage to persons or property as a matter of products liability, negligence or otherwise, or from
any use or operation of any methods, products, instructions, or ideas contained in the material herein.
Library of Congress Cataloging-in-Publication Data
Application submitted
British Library Cataloguing-in-Publication Data
A catalogue record for this book is available from the British Library.
ISBN: 978 0 12 385003 4
Printed in the United States of America
11 12 13 14 10 9 8 7 6 5 4 3 2 1
For information on all MK publications visit our website at www.mkp.com
8. Foreword
I should begin by confessing that I do not consider myself a world-class API designer or software
engineer. I do, however, consider myself an expert researcher in the areas of computer graphics
and geometric modeling. It was in this line of work that I first met Martin at Pixar Animation
Studios.
As a graphics researcher I was accustomed to writing mathematically sophisticated papers. I was
also formally trained as a computer scientist at a major university and had written my share of code.
Armed with this background, when I was presented with the opportunity to lead a group of software
engineers working on a new generation of animation software for Pixar, I figured that it couldn’t be
any more difficult than research. After all, research is, by definition, the creation of the unknown,
whereas engineering is the implementation of well-understood subjects. I could not have been more
wrong.
I came to realize that software engineering was, without a doubt, the most difficult challenge
I had ever been presented with. After more years than I care to admit, I eventually gave up and went
back to graphics research.
I can’t tell you how much I would have benefitted from a book such as “API Design for C++.”
Many of the lessons we learned the hard way have been captured by Martin in this insightful,
easy-to-use book. Martin approaches the subject not from the perspective of an academic software
researcher (although he draws heavily from results and insights gained there), but from the perspec-
tive of an in-the-trenches software engineer and manager. He has experienced firsthand the importance
of good software design and has emerged as an articulate voice of what “good” means. In this book
he presents effective strategies for achieving that goal.
I particularly like that Martin is not focusing just on API design, but more broadly on software
life cycles, allowing him to cover topics such as versioning, strategies for backward compatibility,
and branching methodologies.
In short, this book should be of great value to those creating or managing software activities. It is
a comprehensive collection of best practices that have proven themselves time and time again.
Tony DeRose
Senior Scientist and Research Group Lead, Pixar Animation Studios
xv
9. Preface
Writing large applications in C++ is a complex and tricky business. However, designing reusable C++
interfaces that are robust, stable, easy to use, and durable is even more difficult. The best way to suc-
ceed in this endeavor is to adhere to the tenets of good Application Programming Interface (API)
design.
An API presents a logical interface to a software component and hides the internal details
required to implement that component. It offers a high-level abstraction for a module and promotes
code reuse by allowing multiple applications to share the same functionality.
Modern software development has become highly dependent on APIs, from low-level application
frameworks to data format APIs and graphical user interface (GUI) frameworks. In fact, common
software engineering terms such as modular development, code reuse, componentization, dynamic
link library or DLL, software frameworks, distributed computing, and service-oriented architecture
all imply the need for strong API design skills.
Some popular C and C++ APIs that you may already be aware of include the Standard Template
Library (STL), Boost, the Microsoft Windows API (Win32), Microsoft Foundation Classes (MFC),
libtiff, libpng, zlib, libxml++, OpenGL, MySQL++, Trolltech’s Qt, wxWidgets, GTK+, KDE, Sky-
peKit, POSIX pthreads, Intel’s Threading Building Blocks, the Netscape Plugin API, and the
Apache module API. In addition, many of Google’s open-source projects are C++, as is much of
the code on the sourceforge.net, bitbucket.org, and freshmeat.net Web sites.
APIs such as these are used in all facets of software development, from desktop applications, to
mobile computing and embedded systems, to Web development. For example, the Mozilla Firefox
Web browser is built on top of more than 80 dynamic libraries, each of which provides the imple-
mentation for one or more APIs.
Elegant and robust API design is therefore a critical aspect of contemporary software develop-
ment. One important way in which this differs from standard application development is the far
greater need for change management. As we all know, change is an inevitable factor in software
development; new requirements, feature requests, and bug fixes cause software to evolve in ways
that were never anticipated when it was first devised. However, changes to an API that is shared
by hundreds of end-user applications can cause major upheaval and ultimately may cause clients
to abandon an API. The primary goal of good API design is therefore to provide your clients with the
functionality they need while also causing minimal impact to their code ideally zero impact when
you release a new version.
WHY YOU SHOULD READ THIS BOOK
If you write C++ code that another engineer relies upon, you’re an API designer and this book has
been written for you.
Interfaces are the most important code that you write because a problem with your interface is far
more costly to fix than a bug in your implementation. For instance, an interface change may require
all of the applications based on your code to be updated, whereas an implementation-only change
can be integrated transparently and effortlessly into client applications when they adopt the new
xvii
10. API version. Put in more economic terms, a poorly designed interface can seriously reduce the long-
term survival of your code. Learning how to create high-quality interfaces is therefore an essential
engineering skill, and the central focus of this book.
As Michi Henning noted, API design is more important today than it was 20 years ago. This is
because many more APIs have been designed in recent years. These also provide richer and more
complex functionality and are shared by more end-user applications (Henning, 2009). Despite this
fact, no other books currently on the market concentrate on the topic of API design for C++.
It’s worth noting that this book is not meant to be a general C++ programming guide there are
already many good examples of these on the market. I will certainly cover lots of object-oriented
design material and present many handy C++ tips and tricks. However, I will focus on techniques
for representing clean modular interfaces in C++. By corollary, I will not dive as deeply into the
question of how to implement the code behind these interfaces, such as specific algorithm choices
or best practices limited to the code within the curly braces of your function bodies.
However, this book will cover the full breadth of API development, from initial design through
implementation, testing, documentation, release, versioning, maintenance, and deprecation. I will
even cover specialized API topics such as creating scripting and plugin APIs. While many of these
topics are also relevant to software development in general, the focus here will be on the particular
implications for API design. For example, when discussing testing strategies I will concentrate on
automated API testing techniques rather than attempting to include end-user application testing
techniques such as GUI testing, system testing, or manual testing.
In terms of my own credentials to write this book, I have led the development of APIs for research
code shared by several collaborating institutions, in-house animation system APIs that have been used
to make Academy Award-winning movies, and open-source client/server APIs that have been used by
millions of people worldwide. Throughout all of these disparate experiences, I have consistently wit-
nessed the need for high-quality API design. This book therefore presents a practical distillation of the
techniques and strategies of industrial-strength API design that have been drawn from a range of real-
world experiences.
WHO IS THE TARGET AUDIENCE
While this book is not a beginner’s guide to C++, I have made every effort to make the text easy to
read and to explain all terminology and jargon clearly. The book should therefore be valuable to new
programmers who have grasped the fundamentals of C++ and want to advance their design skills, as
well as senior engineers and software architects who are seeking to gain new expertise to comple-
ment their existing talents.
There are three specific groups of readers that I have borne in mind while writing this book.
1. Practicing software engineers and architects. Junior and senior developers who are working on
a specific API project and need pragmatic advice on how to produce the most elegant and
enduring design.
2. Technical managers. Program and product managers who are responsible for producing an API
product and who want to gain greater insight into the technical issues and development processes
of API design.
xviii Preface
11. 3. Students and educators. Computer science and software engineering students who are learning
how to program and are seeking a thorough resource on software design that is informed by prac-
tical experience on large-scale projects.
FOCUSING ON C++
While there are many generic API design methodologies that can be taught skills that apply equally
well to any programming language or environment ultimately an API has to be expressed in a par-
ticular programming language. It is therefore important to understand the language-specific features
that contribute to exemplary API design. This book is therefore focused on the issues of designing
APIs for a single language (C++) rather than diluting the content to make it applicable for all
languages. While readers who wish to develop APIs for other languages, such as Java or C#, may
still gain much general insight from this text, the book is directly targeted at C++ engineers who must
write and maintain APIs for other engineers to consume.
C++ is still one of the most widely used programming languages for large software projects and
tends to be the most popular choice for performance-critical code. As a result, there are many diverse
C and C++ APIs available for you to use in your own applications (some of which I listed earlier).
I will therefore concentrate on aspects of producing good APIs in C++ and include copious source
code examples to illustrate these concepts better. This means that I will deal with C++-specific topics
such as templates, encapsulation, inheritance, namespaces, operators, const correctness, memory
management, use of STL, the pimpl idiom, and so on.
Additionally, this book will be published during an exciting time in the evolution of C++. A new
version of the C++ specification is currently working its way through the ISO/IEC standardization
process. Most C++ compilers currently aim to conform to the standard that was first published in
1998, known as C++98. A later revision of this standard was published in 2003 to correct several
defects. Since that time, the standards committee has been working on a major new version of the
specification. This version is referred to informally as C++0x, until such time that the standard is rati-
fied and the date of publication is known. By the time you read this book, the new standard will
likely have been published. However, at the time of writing, it is still referred to as C++0x.
Nonetheless, C++0x has reached an advanced stage of the standardization process, and many of
the new features can be predicted with relatively high confidence. In fact, some of the major C++
compilers have already started to implement many of the proposed new features. In terms of API
design, several of these new language features can be used to produce more elegant and sturdy inter-
faces. As such, I have endeavored to highlight and explain those areas of C++0x throughout the book.
This book should therefore remain a relevant resource for several years to come.
CONVENTIONS
While it is more traditional to employ the term “user” to mean a person who uses a software appli-
cation, such as a user of Microsoft Word or Mozilla Firefox, in the context of API design I will apply
the term to mean a software developer who is creating an application and is using an API to achieve
xix
Preface
12. this. In other words, I will generally be talking about API users and not application users. The term
“client” will be used synonymously in this regard. Note that the term “client,” in addition to referring
to a human user of your API, can also refer impersonally to other pieces of software that must call
functions in your API.
While there are many file format extensions used to identify C++ source and header files, such as
.cpp, .cc, .cxx, .h, .hh, and .hpp, I will standardize on the use of .cpp and .h throughout this book.
“I will also use the terms module and component” interchangeably to mean a single .cpp and .h file
pair. These are notably not equivalent to a class because a component or module may contain multi-
ple classes. I will use the term library to refer to a physical collection, or package, of components,
that is, library > module/component > class.
The term method, while generally understood in the object-oriented programming community, is
not strictly a C++ term; it originally evolved from the Smalltalk language. The equivalent C++ term is
member function, although some engineers prefer the more specific definition of virtual member
function. Because I am not particularly concerned with the subtleties of these terms in this book, I
will use method and member function interchangeably. Similarly, although the term data member
is the more correct C++ expression, I will treat the term member variable as a synonym.
In terms of typographical conventions, I will use a fixed-width font to typeset all source code
examples, as well as any filenames or language keywords that may appear in the text. Also, I will
prefer upper camel case for all class and function names in the examples that I present, that is,
CamelCase instead of camelCase or snake case, although obviously I will preserve the case for
any external code that I reference, such as std::for each(). I follow the convention of using an
“m” prefix in front of data members, for example, mMemberVar, and “s” in front of static variables,
for example, sStaticVar.
It should be pointed out that the source examples within the book are often only code snippets
and are not meant to show fully functional samples. I will also often strip comments from the exam-
ple code in the book. This is done for reasons of brevity and clarity. In particular, I will often omit
any preprocessor guard statements around a header file. I will assume that the reader is aware that
every C/C++ header should enclose all of its content within guard statements and that it’s good prac-
tice to contain all of your API declarations within a consistent namespace (as covered in Chapters 3
and 6). In other words, it should be assumed that each header file that I present is implicitly sur-
rounded by code, such as the following.
#ifndef MY MODULE H
#define MY MODULE H
// required #include files. . .
namespace apibook {
// API declarations . . .
}
#endif
xx Preface
13. TIP
I will also highlight various API design tips and key concepts throughout the book. These callouts are provided to
let you search quickly for a concept you wish to reread. If you are particularly pressed for time, you could simply
scan the book for these tips and then read the surrounding text to gain greater insight for those topics that interest
you the most.
BOOK WEB SITE
This book also has a supporting Web site, http://APIBook.com/. On this site you can find general
information about the book, as well as supporting material, such as the complete set of source code
examples contained within the text. Feel free to download and play with these samples yourself
they were designed to be as simple as possible, while still being useful and illustrative. I have used
the cross-platform CMake build system to facilitate compiling and linking the examples so they
should work on Windows, Mac OS X, and UNIX operating systems.
I will also publish any information about new revisions of this book and any errata on this Web
site, as well as useful links to other related API resources on the Internet, such as interesting toolkits,
articles, and utilities.
The book Web site also provides access to a utility that I wrote called API Diff. This program
lets you compare two versions of an API and review differences to code or comments in a visual
side-by-side format. You can also generate a report of everything that changed in a particular release
so that your clients know exactly what to look out for. This utility is available for Windows, Mac
OS X, and Linux.
xxi
Preface
14. Acknowledgments
This book has benefited greatly from the technical review and feedback of several of my esteemed
colleagues. I am indebted to them for taking the time to read early versions of the manuscript and
provide thoughtful suggestions for improvement. In particular, I thank Paul Strauss, Eric Gregory,
Rycharde Hawkes, Nick Long, James Chalfant, Brett Levin, Marcus Marr, Jim Humelsine, and Geoff
Levner.
My passion for good API design has been forged through my relationship with many great soft-
ware engineers and managers. As a result of working at several different companies and institutions,
I’ve been exposed to a range of design perspectives, software development philosophies, and
problem-solving approaches. Throughout these varied experiences, I’ve had the privilege to meet
and learn from some uniquely talented individuals. Some of these giants whose shoulders I have
stood upon include:
• SRI International: Bob Bolles, Adam Cheyer, Elizabeth Churchill, David Colleen, Brian Davis,
Michael Eriksen, Jay Feuquay, Marty A. Fischler, Aaron Heller, Lee Iverson, Jason Jenkins, Luc
Julia, Yvan G. Leclerc, Pat Lincoln, Chris Marrin, Ray C. Perrault, and Brian Tierney.
• Pixar Animation Studios: Brad Andalman, David Baraff, Ian Buono, Gordon Cameron, Ed
Catmull, Chris Colby, Bena Currin, Gareth Davis, Tony DeRose, Mike Ferris, Kurt Fleischer,
Sebastian Grassia, Eric Gregory, Tara Hernandez, Paul Isaacs, Oren Jacob, Michael Kass, Chris
King, Brett Levin, Tim Milliron, Alex Mohr, Cory Omand, Eben Osbty, Allan Poore, Chris
Shoeneman, Patrick Schork, Paul Strauss, Kiril Vidimče, Adam Woodbury, David Yu, Dirk
van Gelder, Brad West, and Andy Witkin.
• The Bakery Animation Studio: Sam Assadian, Sebastien Guichou, Arnauld Lamorlette, Thierry
Lauthelier, Benoit Lepage, Geoff Levner, Nick Long, Erwan Maigret, and Bariş Metin.
• Linden Lab: Nat Goodspeed, Andrew de Laix, Howard Look, Brad Kittenbrink, Brian McGroarty,
Adam Moss, Mark Palange, Jim Purbrick, and Kent Quirk.
In particular, I acknowledge the great impact that Yvan G. Leclerc made on my life during my
early years at SRI International. Yvan was my first manager and also a true friend. He taught me
how to be a good manager of people, how to be a rigorous scientist and engineer, and, at the same
time, how to enjoy life to its fullest. It is a great sorrow that incredible individuals such as Yvan
are taken from us too soon.
Many thanks must also go to Morgan Kaufmann Publishers for all of their work reviewing, copy
editing, typesetting, and publishing this book. This work would quite literally not exist without their
backing and energy. In particular, I acknowledge the contribution of Todd Green, Robyn Day, André
Cuello, and Melissa Revell.
Most importantly, I thank my wife, Genevieve M. Vidanes, for encouraging me to write this book
and for putting up with me while I spent many late nights hunched over the keyboard. As this is my
second book, she knew full well how much it would impact our personal life. Nonetheless, she sup-
ported me throughout the whole process, while also knowing exactly when to make me pause and
take a break. Thank you Genevieve for your constant love and support.
xxiii
15. Author Biography
Dr. Martin Reddy is CEO of Code Reddy Inc. He holds a Ph.D. in computer science and has over
15 years of experience in the software industry. During this time, Dr. Reddy has produced more than
40 professional publications, three software patents, and coauthored the book Level of Detail for 3D
Graphics. He is a member of the Association of Computing Machinery (ACM) and the Institute of
Electrical and Electronic Engineers (IEEE).
Dr. Reddy worked for 6 years at Pixar Animation Studios, where he was lead engineer for the
studio’s in-house animation system. This work involved the design and implementation of various
high-performance APIs to support Academy Award-winning and nominated films, such as Finding
Nemo, The Incredibles, Cars, Ratatouille, and Wall-E.
He then took on the role of engineering manager at The Bakery Animation Studio, where he led
the development of the startup studio’s animation software. This included the design and implemen-
tation of many key APIs as well as devising the overall animator workflow and user interface.
Earlier in his career, Dr. Reddy worked for 5 years at SRI International on distributed 3D terrain
visualization technologies, which involved the development of several open source geospatial APIs.
He cofounded a successful effort to create an ISO standard to represent 3D geospatial models on the
Web and was elected as a director of the Web3D Consortium for 2 consecutive years.
Through his consulting company, Dr. Reddy has provided his technical expertise to various soft-
ware companies, including Linden Lab and Planet 9 Studios. The former involved API design and
infrastructure improvements for the open source product Second Life, an online 3D virtual world that
has been used by over 16 million people around the world.
xxv
19. As an example of a well-known API, Microsoft’s Windows API (often referred to as the Win32
API) is a collection of C functions, data types, and constants that enable programmers to write appli-
cations that run on the Windows platform. This includes functions for file handling, process and
thread management, creating graphical user interfaces, talking to networks, and so on.
The Win32 API is an example of plain C API rather than a C++ API. While you can use a C API
directly from a C++ program, a good example of a specific C++ API is the Standard Template Library
(STL). The STL contains a set of container classes, iterators for navigating over the elements in
those containers, and various algorithms that act on those containers (Josuttis, 1999). For instance,
the collection of algorithms includes high-level operations such as std::search(), std::reverse(),
std::sort(), and std::set intersection(). The STL therefore presents a logical interface to
the task of manipulating collections of elements, without exposing any of the internal details for
how each algorithm is implemented.
TIP
An API is a logical interface to a software component that hides the internal details required to implement it.
1.2 WHAT’S DIFFERENT ABOUT API DESIGN?
Interfaces are the most important code that a developer writes. That’s because problems in an inter-
face are far more costly to fix than problems in the associated implementation code. As a result, the
process of developing shared APIs demands more attention than standard application or Graphical
User Interface (GUI) development. Of course, both should involve best design practices; however,
in the case of API development, these are absolutely critical to its success. Specifically, some of
the key differentiating factors of API development include the following.
• An API is an interface designed for developers, in much the same way that a GUI is an inter-
face designed for end users. In fact, it’s been said that an API is a user interface for program-
mers (Arnold, 2005). As such, your API could be used by thousands of developers around the
world, and it will undoubtedly be used in ways that you never intended (Tulach, 2008). You
must anticipate this in your design. A well-designed API can be your organization’s biggest
asset. Conversely, a poor API can create a support nightmare and even turn your users toward
your competitors (Bloch, 2005), just as a buggy or difficult-to-use GUI may force an end user
to switch to a different application.
• Multiple applications can share the same API. Figure 1.1 showed that a single application can
be composed of multiple APIs. However, any one of those APIs could also be reused in sev-
eral other applications. This means that while problems in the code for any given application
will only affect that one application, errors in an API can affect all of the applications that
depend on that functionality.
• You must strive for backward compatibility whenever you change an API. If you make an
incompatible change to your interface, your clients’ code may fail to compile, or worse their
code could compile but behave differently or crash intermittently. Imagine the confusion and
chaos that would arise if the signature of the printf() function in the standard C library was
4 CHAPTER 1 Introduction
20. different for different compilers or platforms. The simple “Hello World” program may not
look so simple any more:
#include <stdio.h>
#ifdef WIN32
#include <windows.h>
#endif
#ifdef cplusplus
#include <iostream>
#endif
int main(int, char *argv[])
{
#if STRICT ANSI
printf("Hello Worldn");
#elif defined( WIN32)
PrintWithFormat("Hello Worldn");
#elif defined( PRINTF DEPRECATED )
fprintf(stdout, "Hello Worldn");
#elif defined( PRINTF VECTOR )
const char *lines[2] {"Hello World", NULL};
printf(lines);
#elif defined( cplusplus)
std::cout << "Hello World" << std::endl;
#else
#error No terminal output API found
#endif
return 0;
}
This may seem like a contrived example, but it’s actually not that extreme. Take a look at the stan-
dard header files that come with your compiler and you will find declarations that are just as convo-
luted and inscrutable, or perhaps worse.
• Due to the backward compatibility requirement, it is critical to have a change control process
in place. During the normal development process, many developers may fix bugs or add new
features to an API. Some of these developers may be junior engineers who do not fully under-
stand all of the aspects of good API design. As a result, it is important to hold an API review
before releasing a new version of the API. This involves one or more senior engineers check-
ing that all changes to the interface are acceptable, have been made for a valid reason, and are
implemented in the best way to maintain backward compatibility. Many open source APIs
also enforce a change request process to gain approval for a change before it is added to
the source code.
• APIs tend to live for a long time. There can be a large upfront cost to produce a good API
because of the extra overhead of planning, design, versioning, and review that is necessary.
However, if done well, the long-term cost can be substantially mitigated because you have
the ability to make radical changes and improvements to your software without disrupting
your clients. That is, your development velocity can be greater due to the increased flexibility
that the API affords you.
5
1.2 What’s different about API design?
22. • Increases longevity. Over time, systems that expose their implementation details tend to
devolve into spaghetti code where every part of the system depends on the internal details
of other parts of the system. As a result, the system becomes fragile, rigid, immobile, and vis-
cous (Martin, 2000). This often results in organizations having to spend significant effort to
evolve the code toward a better design or simply rewrite it from scratch. By investing in good
API design up front and paying the incremental cost to maintain a coherent design, your soft-
ware can survive for longer and cost less to maintain in the long run. I’ll delve much deeper
into this point at the start of Chapter 4.
• Promotes modularization. An API is normally devised to address a specific task or use case.
As such, APIs tend to define a modular grouping of functionality with a coherent focus.
Developing an application on top of a collection of APIs promotes loosely coupled and mod-
ular architectures where the behavior of one module is not dependent on the internal details of
another module.
• Reduces code duplication. Code duplication is one of the cardinal sins of software engineer-
ing and should be stamped out whenever possible. By keeping all of your code’s logic behind
a strict interface that all clients must use, you centralize the behavior in a single place. Doing
so means that you have to update only one place to change the behavior of your API for all of
your clients. This can help remove duplication of implementation code throughout your code
base. In fact, many APIs are created after discovering duplicated code and deciding to consol-
idate it behind a single interface. This is a good thing.
• Removes hardcoded assumptions. Many programs may contain hardcoded values that are
copied throughout the code, for example, using the filename myprogram.log whenever data
are written to a log file. Instead, APIs can be used to provide access to this information with-
out replicating these constant values across the code base. For example, a GetLogFilename()
API call could be used to replace the hardcoded "myprogram.log" string.
• Easier to change the implementation. If you have hidden all of the implementation details
of your module behind its public interface then you can change those implementation details
without affecting any code that depends on the API. For example, you might decide to change
a file parsing routine to use std::string containers instead of allocating, freeing, and reallo-
cating your own char * buffers.
• Easier to optimize. Similarly, with your implementation details hidden successfully, you can
optimize the performance of your API without requiring any changes to your clients’ code.
For example, you could add a caching solution to a method that performs some computation-
ally intensive calculation. This is possible because all attempts to read and write your under-
lying data are performed via your API, so it becomes much easier to know when you must
invalidate your cached result and recompute the new value.
1.3.2 Code Reuse
Code reuse is the use of existing software to build new software. It is one of the holy grails of mod-
ern software development. APIs provide a mechanism to enable code reuse.
In the early years of software development, it was common for a company to have to write all of
the code for any application they produced. If the program needed to read GIF images or parse a text
file, the company would have to write all that code in-house. Nowadays, with the proliferation of
7
1.3 Why should you use APIs?
24. 1.3.3 Parallel Development
Even if you are writing in-house software, your fellow engineers will very likely need to write code
that uses your code. If you use good API design techniques, you can simplify their lives and, by
extension, your own (because you won’t have to answer as many questions about how your code
works or how to use it). This becomes even more important if multiple developers are working in
parallel on code that depends upon each other.
For example, let’s say that you are working on a string encryption algorithm that another devel-
oper wants to use to write data out to a configuration file. One approach would be to have the other
developer wait until you are finished with your work and then he can use it in his file writer module.
However, a far more efficient use of time would be for the two of you to meet early on and agree
upon an appropriate API. Then you can put that API in place with placeholder functionality that your
colleague can start calling immediately, such as
#include <string.h>
class StringEncryptor
{
public:
/// set the key to use for the Encrypt() and Decrypt() calls
void SetKey(const std::string &key);
/// encrypt an input string based upon the current key
std::string Encrypt(const std::string &str) const;
/// decrypt a string using the current key calling
/// Decrypt() on a string returned by Encrypt() will
/// return the original string for the same key.
std::string Decrypt(const std::string &str) const;
};
You can then provide a simple implementation of these functions so that at least the module will
compile and link. For example, the associated .cpp file might look like
void StringEncryptor::SetKey(const std::string &key)
{
}
std::string StringEncryptor::Encrypt(const std::string &str)
{
return str;
}
std::string StringEncryptor::Decrypt(const std::string &str)
{
return str;
}
In this way, your colleague can use this API and proceed with his work without being held up
by your progress. For the time being, your API will not actually encrypt any strings, but that’s just
9
1.3 Why should you use APIs?
25. a minor implementation detail! The important point is that you have a stable interface a contract
that you both agree upon, and that it behaves appropriately, for example, Decrypt(Encrypt
("Hello")) "Hello". When you finish your work and update the .cpp file with the correct
implementation, your colleague’s code will simply work without any further changes required
on his part.
In reality, it’s likely that there will be interface issues that you didn’t anticipate before you started
writing the code and you will probably have to iterate on the API a few times to get it just right.
However, for the most part, the two of you can work in parallel with minimal holdups.
This approach also encourages test-driven, or test-first, development. By stubbing out the API
early on, you can write unit tests to validate the desired functionality and run these continuously
to make sure that you haven’t broken your contract with your colleague.
Scaling this process up to an organizational level, your project could have separate teams that
may be remote from each other, even working to different schedules. By defining each team’s depen-
dencies up front and creating APIs to model these, each team can work independently and with min-
imal knowledge of how the other teams are implementing their work behind the API. This efficient
use of resources, and the corresponding reduction in redundant communication, can correlate to a
significant overall cost saving for an organization.
1.4 WHEN SHOULD YOU AVOID APIS?
Designing and implementing an API usually requires more work than writing normal applica-
tion code. That’s because the purpose of an API is to provide a robust and stable interface for other
developers to use. As such, the level of quality, planning, documentation, testing, support, and
maintenance is far higher for an API than for software that is to be used within a single application.
As a result, if you are writing an internal module that does not require other clients to com-
municate with it, then the extra overhead of creating and supporting a stable public interface
for your module may not be worth the effort, although this is not a reason to write sloppy code. Spend-
ing the extra time to adhere to the principles of API design will not be wasted effort in the long run.
On the flip side of the coin, consider that you are a software developer who wants to use a third-
party API in your application. The previous section discussed a number of reasons why you might
want to reuse external APIs in your software. However, there may be cases where you wish to avoid
using a particular API and pay the cost to implement the code yourself or look for an alternate
solution. For example:
• License restrictions. An API may provide everything that you need functionality-wise, but
the license restrictions may be prohibitive for your needs. For example, if you want to use
an open source package that is distributed under the GNU General Public License (GPL), then
you are required to release any derived works under the GPL also. This means that using this
package in your program would require you to release the entire source code for your appli-
cation, a constraint that may not be acceptable for a commercial application. Other licenses,
such as the GNU Lesser General Public License (LGPL), are more permissive and tend to
be more common for software libraries. Another licensing aspect is that the dollar cost for
a commercial API may be too high for your project or the licensing terms may be too
restrictive, such as requiring a license fee per developer or even per user.
10 CHAPTER 1 Introduction
28. The text on this page is estimated to be only 20.76%
accurate
Viertes; ®ebot. 4. tt^mbtx. 73 R] Vos pareutes iteruin
cugilatc, iit vo.s erga lilieros exhil>oati8 tanquam parentoH, (juia 4.
praweptnin noininat vo.s patres et niatres, tioti tvrann«»s, bubcn et
boftuic^tcr. Ideo si pater et mater es, jo trifft bid^ biä hJort au(^, Si
es consiil jc. Et
29. The text on this page is estimated to be only 22.03%
accurate
74 Stierte«? unb fünfte? ®el)üt. 4. Tcicintict. Rl vel anoillas,
(5^.3 i|t bir ein gcpot aiitf bcm l)al'j, cy tnivb bir nirf)t Qcfc^cncft
tuetbcn, beim fanftU'i auf3icl)CU et non facis, tu ipsa eam perdiilisti.
Hiuc ftcl^ctä fo l)nn bcr 6I)riftenl)eit, boS Icibcr tein [taub ircig,
iuQä er ift. Non e8t levis res, si virgo bene educetur, et fit bona
matcrfamilias, quae postea pie educat libcros. Ideo vos pareutes
bene discite vos uon esse exclusos ^ ex hoc 4. pi-aecepto. Nou est
[931. 17''] iani inopia iu doctoribuß. Habetis enim isto tempore tales,
(juales olim profecto totiis nuindiis iion liabuit. [2?l. 18''] llaoc
praeeepta (^cf)cn fjiii gcc^cii bciu netieftcn, ber un§ gleid^ i[t.
Priora 4 gcl)cn über bie, bic über uiiy finb. 1. est: 'Non oecides Non
occidere est si ne(j[ue lingiia, manu, sij^juo, corde ocoideris. Hoc
praeceptum «o Wotift. 5.2ifi. clare expositum est per ipsum
Christum, Ut Matthaei 5. legis. Maximus thesaurus proximi in terris
est vita ipsius et corjnis. Hoc tnil gott gefiebert ^oben für ein»
iglicf^eu getüalt unb freüel unb mod^t t)^m mit biefeni praecepto
ein mauer [)erumb et dicit: 'Non occides'. Sic dominus curat pro
nobis, tüie er unS einen fd^u^c maä)Z i. e. ne facito ei leibe, sed
alle§ gut§, is bejd^ebige l)^n nidfit an feinem leibe nee vcrbis,
o|)eribus uec corde, (^uia hoc est etiam proximum occidere, tuenn
bu löibber l)f)n einen grotten in corde ^oft, Et quando nioritur vel
t)f)m ubel ger)et, bu l)f}n bie fauft lad^eft^ Si oranes homicidae
lapid[arentur, omnes plateae sanguine fluerent. Id est: noli ei malum
facere aut optare, Sed econtra. Si non facis, ift§ eben [o 20 biet, aU
tl^eteftu ^f)m f droben. Ideo in his praeceptis [teilen bic 6 opera
misericordiae. Si esurit, ciba, si nudus est, operi, si captus, visita ic.
vel causa es mortis ipsius, lüenn bu h}et)ren fonft ipsius periculum,
fo ifjüZ e§, si non jc. Ideo nota bene haec verba i. e. bu folt ^l^m
!etn leibe nod^ fd^oben tf)un, sed gut§ unb forberüd^ fein, bie
opera (> misericordiae finb 25 frei) i)ie ijnnen. Re
31. The text on this page is estimated to be only 17.98%
accurate
76 Sed^ftc-J (Mcl'ot. 4. Tejcmbct. R] unb eilt, iit friic^tbnv
jci) iinb lief) niclirc. (?-3 i|t ein gvo-i trcfflirf) fegen, ben fein
menid)lidi dcrt^ nie l)at an9cfcl)en unb betDOQcn. Vult ergo
(lomimis habt-rt« l)nn 3ud)t o.r|>iis man-? *t Riciby, n solnm be§
tt)erd§ l^albcn, fonbern etiam, jjjQttii. 19,6 bog hu bein l)cr|; nidjt
an ein anbere l)engeft. 'Sit', ininiit, 'una caro', Et lo hoc propter 1.
praeoep[tiun: ileum tinie. Die: tüic tüol iä) lunbc rouitl t)Qbcn über
bie )d)nur ^U t)QUen^ tarnen quia dielt deus: Time ic. Si Caesar
nic^t erfert, ii-'^ tarnen, (pii est super ine k. Ideo die: o deus, da
gratiani, ne eadani unb baö id^ mein cl)e rein l)Qlte i. e. bu folt
leufcS^ leBcn t}nn beinern eficitanb bclibc mit Icibc, tuort, gcbcrben
et l)crlj. Ideo dedit cuilibet t5 snain nxoreni, bie iinbcm uufletigeu
funbe mag idj nidjt nennen ut ^ungfraluen [4
33. fe^n, Non frigida aliqua tradicio. 30 Non furaberi.s. Hoc septimuni
eciam a deo preceptum, non est frigida tradicio. Kt hoc complectitur
in se oranes falhicias, usuram, falfd^e tüi^ax, aüci, bo nil)t ic^
met)nen n^eften betrige. Sict)m groffeer 3unfft bcn bicberei).
2)icbcrcu ift ^n aEen ^anbttnergen. Sed parvi fures suspeuduutnr,
M:igui summo hoiioH' 2212s 2Dct bo rt^t jro Süittembctöf feljn bet
Ijobe fe^n totpp obbtt man non scortctur r 24 über spontaneam
steht corde et ore 2ti qui(8) 3() .S?|itimiini rroi-eptum ro r 32 Omnes
lalliicias complectitur lioc praecojitum ro r 33 Siebe»)) hai ixh{it
ttanbitotxi ro r 33134 Äe^lie /-i« sus|icnilunlm- nnl ,;.
35. defraudaveris, non homiuem solum, sed deum defraudasti, qui zelo
suo te conteret. Si autera observaveris hoc praeceptum, bona
consciencia ditesceris. Vos iuvenes discit« liaec praecepta, si maiores
iioiueriut. 2)en albe ^uube fi)nbt nid^t benbig io mod)en^ .^ucttct
euc^ Dor ber f c^ljnberei) , bo öor toarne '6) euc^. Non pro|)ti!r
me locpior ci divites loquor, h)t)r trollen bei)ner turf looll auöftel)cn,
id) lDl)l bcnnodj elju ^ert fe^n, feo btO el)n betler bift. Sed propter
paupere.s, (piorum iiinlti sinit in hac civitate, quos tu defraudas, Uli
elamant laclirimas in coelum ad deum. 21123 3etlid^ ^anbttoctg
^ott gnug m^t bifem gc^jot jw fc^affcn ro r 28179, 18 Si milii
eingulis annis 100 fl abjt^ljtibeft , 81 egu uelleiii , iiellein einere alibi,
ne oljuluni liic exponere uellcm r 28 bennocf) (nid^t) 29130 8ed bis
quos unt ro 30179, 21 2)ie atmen muffen bie f^^nbe«^ tragen bic
te^d^en fonnenS wofl atoffte^cn ro r «) aibe t)unbe f^nbt nic^t
benbifl ,^10 mad)cn vgl. Unsrc Ausg. Bd. m, 654 zti S. 616,8. Auch
Pouchs Slg. 3 ', 147 1'ic alten fdjetcf mndjc ber Icuffel benbig, alte
t)unbe etc. ; Thiele Nr. 236.
38. .satisfecissent et ueglexissent incuria. Ideo hoc praeceptum in
omnes condiciones sese dilatat omni-scpie condicionis fures sunt
plnrimi, ideo nihil plus ditescunt, pestilencia et hostibus conterentur
tales. 6§ §ol ^un^cr frigcr hiä) tuoll bo^eljmc fudien. Nf)n prohibco,
si quis suam mermlem isto praemio vendere polest, (^ö mag ei)n
iberman ba» feeljne uffä tl)en3crft geben, 30 jy äöetflflerollje Dnb
lofltl^onet ru r 21 lnr iihtr (diues) 22123 C^n bis facies untro aebtn
jum biete machen ßulte «Dlontofle* r 24 cui (pro) 28131 Salomon
Abominacio ent deo pondus dolosa lust« autem deo placet r 29130
Non bin baä untro 30181, 18 tbeloetft Jm betrifle tmt ro ') btottl)e
btjmen ryl. Waruler Hirn Nr. 57 Va kann mehr ah Birnen braten, und
H. Sachn XII, 203 Witt nuff dem hohler sitzen bleiben, Die Hirn in
der hidiel und/reiben. Obige Frmsmig nicht Megt. t)inbet bem Cfen
fi^en ttei Wander s. r. Ofen in inekn liedemarten = mchta tun oder
au.'
41. Summa: !5)U) folft nic^t ubel öon bequem uef)cften reben nod^
gerne ^oeren, ^onbern folft fci)nc fdjanbc ]v beden. Excipiuntur
Potestas mundi, Praedicatores et Parentes. Sicut in quinto praeeepto
exeipitur carnifex trucidans homines, ille contra 5. praeceptum non
facit. Ita parentes caedentcs pueros non faciunt contra prae- 30
ceptum dei, sed ex iussu dei faciunt, quod si intermitterent,
peccarent. Ita potestas cum violencia aliquem puniens non peccat.
Ita in hoc praeeepto Cbcrgfel)t in iudicio consistens non peccat, si
examinat, perpendit maliciam hominum. Xa§ ift l)r auipt, ha'5 fie öon
anbern ^unbcn reben. Ita parentes 26127 iito bis beden unt ro
28129 über Sicut in quinto steht Excepcio 5 praecepti ro 29 Qiii iure
pecrata alinriim tractare possunt rn r 31J34 Ita Ins t)t nnt ro
42. The text on this page is estimated to be only 15.07%
accurate
9ld)tfä bi^ ^rbnfea ÖJebot 7. tf^finbfr RH ^] 2ßenn man§
bQ()in tregt, ha man e-ö ftraffcn fol, hcne jif^itur. Sir, si mal«» afi:it
proxinuis, die Tonsnli, ludici k. Mattli. 1H. No (juis Hinat: ^df tDÜ
««»».i«, li«. niemonb ftraffen. Si malnni proximi 11(111 vis indif-aic
potcstati. fo f(^tt»eigc bei) bir felber [tili, benn tücnn hu c§ mit
beinern jc^cnblidjen, aintigen moul •> in onines donios tregft, fo
madjftuy iiicf)t bcffer, scd erger. Ideo indica, »do bu e§ fagen folt.
Über boS finb auä) aufgenommen bie praeer IVaedicator officio suo
fungens aliorum peecata corripiat, extra haue funcoionem tacere
debet. Summa: 5)lt) folft bie h)art)el)t tior bcm gerid^t bcfennen
iinb 2A fünft nic^t öon bel)nen ne'^cftcn bocfee^ rcbcn. Non
concupisces j)r
44. dicens: äßog mag ic^ be§'^ tüolbc aa boc^ bel)ne magbt bet) btjr
nid^t Bleljben. Ita si vendit agrnm dicens: Cur vendis? si nolles
vendere, non einissem. Interim tarnen suis insidiis eum ad hoc
enmpnlit. Snmma: llü jült iiicmanbc« nid)t nbfpcimig mQd)en,
Bonbern ^me ^um gutten unb frummen bcl)u(nlid) jclju. p]j)ilogns
deealogi. so Atqne haec est brevlssima deealogi exposioio, Nonne
haec satis o|)erum nobis affernnt? non opus esset nos ])ropriis et
electiciis iudulgere 16 Hae] lle(c; 17 1fi Xie e^nem boS fetjne
Qbjpennifl machen ro r 27 emissem r an» enierom 30 mtl ro :itl-i2
Hat openim in decalogo lialiCmuH ro r .'{'J (.ah) iiidiilgiT«
46. The text on this page is estimated to be only 19.33%
accurate
gjj Ifi fiflc 'lvtt(cl. lU. IlCllll>CV. R] [4*1.31''] 10. Deco
ml). Aiulistis bic elften fturfc Hon bcr (5^riftlicf)cii Icie, uvupc
iiyi.32"| (Icinn pi-aerepta. Et luomii vos dilitriiiter, ut atlliortemini
ramiliain, nt onm verhatim (li^itTcnt , Et ind»' dco ohedirent et vohis
dominis et vos (nuxiue deo ül>eraedic'ari de duodecim tidei artieuiis.
Si (|uis velit partiri, plures jc. Sed vos dividite Symboltim pnn bie
t)eiibtftuc!e, nad) bcm ba^ brcl) pcrfon finb: Pater, filius, spiritus
sanetus, (^iiia 'eredo in deiim ]iatiem' JC. bic ein föott finb, Xainod^
Ittogt l)f)r einen fonberlid^en aitidel l)nn feine ftudEc teilen. 1.
articulus docet creationein, 2. redernjitionem, ;1. saiu-tifioationem.
1. (piomodo simus creati cum omnilms ereatiiris, 2. (juomodo simus
redempti, 3. tüie tt)ir folten ^eilig, rein fein et leben unb rein
bleiben. Pueri et rüdes foHenS fo ouffö oller cin= fcltigft lernen:
Hdes habet tres articulos, 1. de patre, 2. de filio, 'S. est de 3 3
articuli Symbuli r 12,13 1. 2. 3. r 14115 3. bis Meibcn unt 15 rein Her
bleiben 76 1. 2. 3. r N) Hacterms iirirauin xaTsyio/ui articulum
tractavimus, quem omnes Parentes, doraini pueris et subditis
propouant sedulo, vosque senes docendo alios docoiores evadetis.
Nam omnibus doctoribus docendo alios doetrina augetur. Igitur
decalogon breviter complexum illis proponite, quia prohibent au et
iubent, misericordiam et penam in sese continent. CREDO IN UNUM
DEUM PATREM. Audistis olim de 12 articulis praedicari fidera, si
omnia essent pracdicanda, plures essent. Nos simplicissLime in .3
articulos secundum personas divinitatis dividimus, deinde lacius sese
spargunt in membra. 25 Primus articulus docet nos, (piomodo simus
creati. Secundus docet, quomodo redempti simus per Christum.
Tercius, quomodo sanctificati simus per spiritum sanctum. Primus
igitur patrem Creatorem, 2. filium redemptorem, 3""' Spiritum
saiKrtnm sanctificatorem. Haec est summa Siml)oli in tres part«s
divisi. m Prima igitur pars: Credo in ununi de um k. i.e. Credere
debeo, quod 23 fidem über si 26 Tres priucipales fidei articuli ro r
Primus unt ro 27 Becuiidug unt ro 2H Tercius unt ro 29(30 Priniu«
OU sauctificatyrem uiU ro 30 Status et diuihiu Öimboli ru r
47. The text on this page is estimated to be only 18.60%
accurate
aet ctfte attifel. 10. Ifjeinbet. 87 R] s[piritii saiido. SCßoS
l)eltc[tu de patre? res|)(niatorem habeam, non ab hominibus.
2)Qruntb lerne tc^, h)oe f)er iä) funime unb tüof)er id) alle bing
^obc. Sequitur Conclusio. Si haec omnia dei dona sunt, merito in dei
honorem 30 uti, Creatori in illis laudem dicerc. 9Bl)r tDurben ml)t
unfeern ougcn, orcn, teben, tceljp unb ünbt ic. nid^t ^o lcl)d)tlid)
feunbigcn, sed illis in gloriam et laudem dei utcrcmur. Haec continct
in sc vcrbum 'Creator Quisqui.s hunc articulum credit, in conspcctu
omnium creaturarurn illum cxcrtx't. Si 20 Creatorem celi et terrae ro
r 26128 Vita bu blnfl unt ro 38 Nos crontur* dei et omnil.us creatnris
per cieum utin.nr ro r 29 über Sequitur »Uht Secundo ro 31132
3)ct:^att.en |ol ä) >)nie bienen loüen bandtcu biib lil-cn r 32 33 In
omnibu» rrc*tiiris aguoscimuH deum rrHiidircm ro r
48. The text on this page is estimated to be only 20.22%
accurate
88 ^f^ f^f*"-" ""»^ itiifilc ^Irliffl. lo. Ii'jcmbi'r. R] «jiii lux-
verbiim ' C'iX'atorein ' iiitelli^iinf.' X:im nrnio illi scrvit. Omnim>
uiembris online |HX'catur in »Icuin mit lucib , finbcill, t)ofc K. 2)iunib
mag unö bcr erftc artirfel luol bcmutigcn et cvfdiretfcn, quin non
credimu^. lain hoc obseivat«-, boö id) • fuife Quffy lüOlt ' Creator' i.
c. crcdo, «|Ikm1 dederit corpus et aniinam, Ö sensus, veste.s,
futtci", lüOUUng, tücib, finb, tiif)C, odEcr. Ex hoc seijuitur, qiiod
debeaui ei servire, obedire, laudarc tl bancfcn. Qui himc erj^o
articuhiin credit, si inspexerit vaccam, «licet: Haue dedit mihi deii.s.
Sic de uxore, liberi.s. 1. articuliis in Summa docct Creationem. '2.
ivdem|>tionem, 3. >>anctiHcati(tnem. Crcationem sie i. e. j^cijft,
boö id) glciibc, baä mir töott flebcii l)ai leib, leben, üernunfft et
omnia, «juaecun(jue habeo. Non a me ipso habeo, ne superbiam.
Ego non possum darf nee servai-e. (iuare dedit et quarc credis, quod
dederit? Ut eoenobia ftifftcft ? Non, sed ut laudes, gratias agas. Muhi
dicmit illa verba 'Ci-edo' 2C. .>eil non intelligunt, (juid sibi velint. Et
in lesum Cliristnm. Aud[istis, (|iiii«l (liviilaiiius Synibohnn in 'S
artLiciilos pro siniplicib[us et pueris. 1. pars est de patre, 2. de filio,
3. de s[piritu sancto. 1. docet Creationem, 2. Redemptionen), 3.
Sanctificationem, [231. 33"] ut sie quisq[ue intelligat, 13 Multi über
dicunt 17 über pars sUht art N] videt Arborem fructus ferentera,
videt deum creatorem. Ego simplicis[sirae exponam. Von docciores
in quolibet verbo potestis excogitare: 'Credo in 20 deum Patrem
omnipotentem'. Haec studiosis relinquo pervestiganda. V08 parentes
siraplieiter Creatorem deum filiis proponite, sicut supra. Si omnes
Uuiversitates audiretis, non audiretis tantum fidei expromerc in hoc
articulo. Ita dieimt: Sd^oc^pcr, Bä^otppn, h)Q§ melier? Tu autem te
creaturam dei onmia a creatore sumeutemque crede gratiasque deo
usu illorum age. Si 25 haec scieris, doccior eris omnibus doctoribus
Universitatum. Ex hac cognicione donorum dei pellitur omuis fidueia,
tinior erga creaturas prae8umpcioque nostri. Et in lesum Christum
füium eins unicum, Dominum nostrum. In hoc articulo simplicissime
agam hoc unicum verbum in illo tractans: 3u 'Dominum nostrum'.
49. Interrogatus : quid sentis in 2. articulo? Responde: Credo lesuiu
Christum dominum meum , (jui mc iibei-avit a mort^', peecato 24l25
Tu bU 81 unt ro 27128 praesurapcioque c aus praesumpsioque 31
Dominum iiusitrum utit ru 3lß2 Hiesiis Christus dominus noster ru r
32189, 1 Credo bin JC. uiil ro
50. The text on this page is estimated to be only 24.30%
accurate
5:er ilDfilc ^ilttifcl. 10. Ititinbtx. gg K](iui<1 (licat, cum
reoer^et Synibohiin. Ego ui>i voc-abiilum 'Creatür iit, ciiiu
iiittnogari< , scias respoiiderL' sie: Ego credo, «juod denn «it
C'reati>r, artis cxpiirnnt. scilicet ita: me liberavit et rcdcmit, 'genitus
a Maria virgine, pa.«isus sub Ponjtio Pila[to' k. Haec omnia ideo
Christus fecit et passus est, ut «loniinus noster fieret nos(jue
redimorot suo proprio corpore et sanguine, ad ijuwl opus erat nasci,
idquc a virgine, ut iiuorrnptus et integer Sathanac regnum 25 (te)
onnii.i 26 pronunciat 28 Humma (Chr) 30 Hanc bU articuli unt ro 31
Quid scqutiilia indii-aiif ru r 32,33 Haec bis pri>i>riu m»j/ ro 33 («ui)
cwrpon
51. The text on this page is estimated to be only 25.64%
accurate
90 ^ft ^rocite "Mrtifel. 10. Xfjcinbct. R] auä) ftucfc, bic
biefcn glauben Qu||trcid^en et ostendunt, quid Christus factus sit,
cjuid (loiniuus uoster feoerit, ut uos libcrarot, tüciv C§ t)'^n
gcftanbcu l^obc, njQÄ er bran geluagt t)Qbe. ['^i. 33^| oo ift
Zugängen: fuit conceptus c spiritu Kuu'to, sine omni peccato jc. ut
nious dominus tieret et me liborarct k. Omnia fecit, ut d(»mimis
mens fieift, quia oportet tarn Sanetus sit, bQ§ bei" » Icufcl fein xcä)i
on t)l)m fahc. Xie [tucfe geigen an, (jualis deus sit et tDo mit erö
eilroiben l)Qbe, (piod vcnio suh eins dominium, nempe per proprium
eins corpus, bo mit üot cr fein fonigreid) jugcrii^tet. Totum
Euangelium ift gcfofft ^i^n bcn artidfct. Nam Euangelium nihil aliud
est quam praedicatio de concepto, nato k. Christo. Discite igitur
apprcliendere hoc verbum lo 'dominum nostrum P^o credere debeo
et credo, (piod Christus sit dominus mens i. e. quod me redemerit,
quia 2. art[icuhis loquitur de hoc: Vicit mortem, peccatum et ab his
me liberavit. Prinuun, cum creatus essem, tjette ic^ lüol allerlei) gut,
leib K. sed serviebam peccato, morti jc. ba !am G^riftuö, qui mortem
passus, ut liberarcr a morte et fierem ipsius filius et i5 ducerer in
iu.sticiam, vitam K. .|)crr fei) ^ie fo Diel al§ erlofer 2Z. £)te anbern
ftucfe geigen, lüoburc^ er fold§e§ ifdbz aufgericljtet unb lüaä er für
ein loft baran gctuagt ^abe: Non per aurum, argentum, equitatum,
sed per seipsum, hoc est: suo proprio corpore. Ipsemet conceptus e
spiritu saneto, natus 2C. lam non phis dicam de hoc articulo, nolo
enim vos obruere. Is 20 est vere Christianus articulus, Quem neque
ludaei, Papistae nee sectarii credunt Qui enim credit per opera se
salvari, non per Christum ic. et econtra. X05 gel)ort l)nn bie onber
prebigt. Audivimus in his 2 particulis, quid a patre, filio habeamus,
nempe a patre creationem, a filio redemptionem. i/2 Cbristua
dominas noster fecerit, quid factus sit, ut nos über factus sit steht 1
2 über dominus noster ateht 2 über ut »te/U 3 5/7 Omnia büi veuio
unt SjlO Totum bvs jc. tmt Quid Euang[elium doceat. r 15ll6 et
ducerer bis vitam über a morte bis ipsius 15 Passus K. r N] posset
deprimere. Igitur unum hoc verbum: 'Dominum nostrum' observate,
52. Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
Let us accompany you on the journey of exploring knowledge and
personal growth!
ebookfinal.com