0% found this document useful (0 votes)
8 views

Practical C++ Design: From Programming to Architecture Adam B. Singer instant download

The document provides information about the book 'Practical C++ Design: From Programming to Architecture' by Adam B. Singer, including links to download the first and second editions. It outlines the book's focus on C++ programming and architectural design principles, along with various topics covered in the chapters. Additionally, it mentions other related titles available for download on the same platform.

Uploaded by

dariszjaxa
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views

Practical C++ Design: From Programming to Architecture Adam B. Singer instant download

The document provides information about the book 'Practical C++ Design: From Programming to Architecture' by Adam B. Singer, including links to download the first and second editions. It outlines the book's focus on C++ programming and architectural design principles, along with various topics covered in the chapters. Additionally, it mentions other related titles available for download on the same platform.

Uploaded by

dariszjaxa
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 41

Practical C++ Design: From Programming to

Architecture Adam B. Singer download

https://ebookmeta.com/product/practical-c-design-from-
programming-to-architecture-adam-b-singer/

Download more ebook from https://ebookmeta.com


We believe these products will be a great fit for you. Click
the link to download now, or visit ebookmeta.com
to discover even more!

Practical C++ Design: From Programming To Architecture


2nd Edition Adam B. Singer

https://ebookmeta.com/product/practical-c-design-from-
programming-to-architecture-2nd-edition-adam-b-singer/

Practical C++ Design: From Programming to Architecture


1st Edition Adam B. Singer

https://ebookmeta.com/product/practical-c-design-from-
programming-to-architecture-1st-edition-adam-b-singer/

Mnemonics for Radiologists and FRCR 2B Viva Preparation


A Systematic Approach Aug 15 2013 _ 1908911956 _ CRC
Press 1st Edition Yoong

https://ebookmeta.com/product/mnemonics-for-radiologists-and-
frcr-2b-viva-preparation-a-systematic-approach-
aug-15-2013-_-1908911956-_-crc-press-1st-edition-yoong/

The Dark Side of Social Media Psychological Managerial


and Societal Perspectives 1st Edition Pavica Sheldon

https://ebookmeta.com/product/the-dark-side-of-social-media-
psychological-managerial-and-societal-perspectives-1st-edition-
pavica-sheldon/
Forensic Mental Health 2nd Edition Michele P. Bratina

https://ebookmeta.com/product/forensic-mental-health-2nd-edition-
michele-p-bratina/

Minor Emergencies Philip M. Buttaravoli

https://ebookmeta.com/product/minor-emergencies-philip-m-
buttaravoli/

In the Wake of the Mongols The Making of a New Social


Order in North China 1200 1600 27th Edition Jinping
Wang

https://ebookmeta.com/product/in-the-wake-of-the-mongols-the-
making-of-a-new-social-order-in-north-china-1200-1600-27th-
edition-jinping-wang/

The Road Not Taken A Selection of Robert Frost s Poems


Frost

https://ebookmeta.com/product/the-road-not-taken-a-selection-of-
robert-frost-s-poems-frost/

United States Anna Obiols

https://ebookmeta.com/product/united-states-anna-obiols/
CompTIA A Complete Practice Tests Exam Core 1 220 1001
and Exam Core 2 220 1002 2nd Edition Jeff T Parker
Quentin Docter

https://ebookmeta.com/product/comptia-a-complete-practice-tests-
exam-core-1-220-1001-and-exam-core-2-220-1002-2nd-edition-jeff-t-
parker-quentin-docter/
Practical
C++ Design
From Programming to Architecture

Second Edition

Adam B. Singer
Practical C++ Design
From Programming to Architecture
Second Edition

Adam B. Singer
Practical C++ Design: From Programming to Architecture
Adam B. Singer
The Woodlands, TX, USA

ISBN-13 (pbk): 978-1-4842-7406-4 ISBN-13 (electronic): 978-1-4842-7407-1


https://doi.org/10.1007/978-1-4842-7407-1

Copyright © 2022 by Adam Singer


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Steve Anglin
Development Editor: Matthew Moodie
Coordinating Editor: Mark Powers
Cover designed by eStudioCalamar
Cover image by Jeremy Zero on Unsplash (www.unsplash.com)
Distributed to the book trade worldwide by Apress Media, LLC, 1 New York Plaza, New York, NY 10004,
U.S.A. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@springer-sbm.com, or visit www.
springeronline.com. Apress Media, LLC is a California LLC and the sole member (owner) is Springer Science +
Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a Delaware corporation.
For information on translations, please e-mail booktranslations@springernature.com; for reprint,
paperback, or audio rights, please e-mail bookpermissions@springernature.com.
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub via the book’s product page, located at www.apress.com/9781484274064. For more
detailed information, please visit http://www.apress.com/source-­code.
Printed on acid-free paper
For Terri, Caroline, and Rebecca.
Table of Contents
About the Author����������������������������������������������������������������������������������������������������� xi

About the Technical Reviewer������������������������������������������������������������������������������� xiii


Preface��������������������������������������������������������������������������������������������������������������������xv

Chapter 1: Defining the Case Study�������������������������������������������������������������������������� 1


1.1 A Brief Introduction����������������������������������������������������������������������������������������������������������������� 1
1.2 A Few Words About Requirements������������������������������������������������������������������������������������������ 2
1.3 Reverse Polish Notation (RPN)������������������������������������������������������������������������������������������������ 3
1.4 The Calculator’s Requirements����������������������������������������������������������������������������������������������� 5
1.5 The Source Code��������������������������������������������������������������������������������������������������������������������� 6

Chapter 2: Decomposition���������������������������������������������������������������������������������������� 9
2.1 The Elements of a Good Decomposition�������������������������������������������������������������������������������� 10
2.2 Selecting an Architecture������������������������������������������������������������������������������������������������������ 12
2.2.1 Multitiered Architecture������������������������������������������������������������������������������������������������ 13
2.2.2 Model-View-Controller (MVC) Architecture������������������������������������������������������������������� 14
2.2.3 Architectural Patterns Applied to the Calculator����������������������������������������������������������� 16
2.2.4 C
 hoosing the Calculator’s Architecture������������������������������������������������������������������������ 17
2.3 I nterfaces������������������������������������������������������������������������������������������������������������������������������ 17
2.3.1 C
 alculator Use Cases���������������������������������������������������������������������������������������������������� 18
2.3.2 A
 nalysis of Use Cases��������������������������������������������������������������������������������������������������� 21
2.3.3 A Quick Note on Actual Implementation����������������������������������������������������������������������� 28
2.4 Assessment of Our Current Design��������������������������������������������������������������������������������������� 29
2.5 Implementing Our Design Using C++20 Modules����������������������������������������������������������������� 29
2.5.1 W
 hy Modules?�������������������������������������������������������������������������������������������������������������� 29
2.5.2 U
 sing Legacy Headers�������������������������������������������������������������������������������������������������� 33

v
Table of Contents

2.5.3 Source Code Organization Prior to C++20������������������������������������������������������������������� 35


2.5.4 Source Code Organization Using C++20 Modules������������������������������������������������������� 38
2.5.5 Modules and pdCalc����������������������������������������������������������������������������������������������������� 43
2.6 Next Steps����������������������������������������������������������������������������������������������������������������������������� 47

Chapter 3: The Stack���������������������������������������������������������������������������������������������� 49


3.1 Decomposition of the Stack Module������������������������������������������������������������������������������������� 49
3.2 The Stack Class��������������������������������������������������������������������������������������������������������������������� 52
3.2.1 The Singleton Pattern��������������������������������������������������������������������������������������������������� 52
3.2.2 The Stack Module As a Singleton Class������������������������������������������������������������������������ 54
3.3 A
 dding Events����������������������������������������������������������������������������������������������������������������������� 56
3.3.1 T he Observer Pattern���������������������������������������������������������������������������������������������������� 57
3.3.2 The Stack As an Event Publisher���������������������������������������������������������������������������������� 75
3.3.3 The Complete Stack Module Interface�������������������������������������������������������������������������� 76
3.4 A
 Quick Note on Testing�������������������������������������������������������������������������������������������������������� 77

Chapter 4: The Command Dispatcher��������������������������������������������������������������������� 79


4.1 Decomposition of the Command Dispatcher������������������������������������������������������������������������� 79
4.2 The Command Class������������������������������������������������������������������������������������������������������������� 80
4.2.1 The Command Pattern�������������������������������������������������������������������������������������������������� 80
4.2.2 More on Implementing Undo/Redo������������������������������������������������������������������������������� 81
4.2.3 The Command Pattern Applied to the Calculator���������������������������������������������������������� 83
4.3 T he Command Factory�������������������������������������������������������������������������������������������������������� 103
4.3.1 T he CommandFactory Class��������������������������������������������������������������������������������������� 103
4.3.2 R
 egistering Core Commands�������������������������������������������������������������������������������������� 111
4.4 T he Command Manager������������������������������������������������������������������������������������������������������ 112
4.4.1 T he Interface��������������������������������������������������������������������������������������������������������������� 112
4.4.2 Implementing Undo and Redo������������������������������������������������������������������������������������ 113
4.5 T he Command Interpreter��������������������������������������������������������������������������������������������������� 115
4.5.1 T he Interface��������������������������������������������������������������������������������������������������������������� 116
4.5.2 I mplementation Details���������������������������������������������������������������������������������������������� 123
4.6 R
 evisiting Earlier Decisions������������������������������������������������������������������������������������������������ 127

vi
Table of Contents

Chapter 5: The Command Line Interface�������������������������������������������������������������� 129


5.1 The User Interface Abstraction�������������������������������������������������������������������������������������������� 129
5.1.1 The Abstract Interface������������������������������������������������������������������������������������������������ 130
5.1.2 User Interface Events������������������������������������������������������������������������������������������������� 133
5.2 The Concrete CLI Class������������������������������������������������������������������������������������������������������� 137
5.2.1 Requirements������������������������������������������������������������������������������������������������������������� 137
5.2.2 The CLI Design������������������������������������������������������������������������������������������������������������ 139
5.3 Tying It Together: A Working Program��������������������������������������������������������������������������������� 153

Chapter 6: The Graphical User Interface��������������������������������������������������������������� 155


6.1 Requirements���������������������������������������������������������������������������������������������������������������������� 155
6.2 Building GUIs����������������������������������������������������������������������������������������������������������������������� 159
6.2.1 Building GUIs in IDEs�������������������������������������������������������������������������������������������������� 159
6.2.2 Building GUIs in Code������������������������������������������������������������������������������������������������� 160
6.2.3 Which GUI Building Method Is Better?������������������������������������������������������������������������ 161
6.3 Modularization�������������������������������������������������������������������������������������������������������������������� 162
6.3.1 T he CommandButton Abstraction������������������������������������������������������������������������������� 163
6.3.2 G
 etting Input��������������������������������������������������������������������������������������������������������������� 169
6.3.3 T he Display����������������������������������������������������������������������������������������������������������������� 172
6.3.4 T he Model������������������������������������������������������������������������������������������������������������������� 176
6.3.5 T he Display Redux������������������������������������������������������������������������������������������������������ 178
6.3.6 Tying It Together: The Main Window��������������������������������������������������������������������������� 179
6.3.7 L ook-and-Feel������������������������������������������������������������������������������������������������������������ 181
6.4 A
 Working Program������������������������������������������������������������������������������������������������������������� 182
6.5 A
 Microsoft Windows Build Note����������������������������������������������������������������������������������������� 183

Chapter 7: Plugins������������������������������������������������������������������������������������������������ 185


7.1 What Is a Plugin?���������������������������������������������������������������������������������������������������������������� 185
7.1.1 Rules For C++ Plugins����������������������������������������������������������������������������������������������� 186
7.2 Problem 1: The Plugin Interface������������������������������������������������������������������������������������������ 189
7.2.1 The Interface for Discovering Commands������������������������������������������������������������������ 189
7.2.2 The Interface for Adding New GUI Buttons����������������������������������������������������������������� 195

vii
Table of Contents

7.2.3 Plugin Allocation and Deallocation����������������������������������������������������������������������������� 196


7.2.4 The Plugin Command Interface���������������������������������������������������������������������������������� 197
7.2.5 API Versioning������������������������������������������������������������������������������������������������������������� 200
7.2.6 Making the Stack Available���������������������������������������������������������������������������������������� 201
7.3 Problem 2: Loading Plugins������������������������������������������������������������������������������������������������ 203
7.3.1Platform-Specific Plugin Loading�������������������������������������������������������������������������������� 203
7.3.2 Loading, Using, and Closing a Shared Library������������������������������������������������������������ 203
7.3.3 A Design for Multiplatform Code�������������������������������������������������������������������������������� 206
7.4 Problem 3: Retrofitting pdCalc�������������������������������������������������������������������������������������������� 218
7.4.1 I njecting Commands��������������������������������������������������������������������������������������������������� 218
7.4.2 Adding Plugin Buttons to the GUI�������������������������������������������������������������������������������� 219
7.5 I ncorporating Plugins���������������������������������������������������������������������������������������������������������� 220
7.5.1 L oading Plugins���������������������������������������������������������������������������������������������������������� 220
7.5.2 I njecting Functionality������������������������������������������������������������������������������������������������ 222
7.6 A
 Concrete Plugin���������������������������������������������������������������������������������������������������������������� 224
7.6.1 P lugin Interface���������������������������������������������������������������������������������������������������������� 224
7.6.2 Source Code Dependency Inversion��������������������������������������������������������������������������� 226
7.6.3 I mplementing HyperbolicLnPlugin’s Functionality������������������������������������������������������ 227
7.7 N
 ext Steps��������������������������������������������������������������������������������������������������������������������������� 230

Chapter 8: New Requirements������������������������������������������������������������������������������ 231


8.1 Fully Designed New Features��������������������������������������������������������������������������������������������� 231
8.1.1 Batch Operation���������������������������������������������������������������������������������������������������������� 232
8.1.2 Stored Procedures������������������������������������������������������������������������������������������������������ 233
8.2 Designs Toward a More Useful Calculator��������������������������������������������������������������������������� 249
8.2.1 Complex Numbers������������������������������������������������������������������������������������������������������ 250
8.2.2 Variables��������������������������������������������������������������������������������������������������������������������� 254
8.3 Some Interesting Extensions for Self-Exploration��������������������������������������������������������������� 259
8.3.1 H
 igh DPI Scaling��������������������������������������������������������������������������������������������������������� 259
8.3.2 D
 ynamic Skinning������������������������������������������������������������������������������������������������������� 259
8.3.3 F low Control��������������������������������������������������������������������������������������������������������������� 260
8.3.4 A
 n Alternative GUI Layout������������������������������������������������������������������������������������������� 260
8.3.5 A
 Graphing Calculator������������������������������������������������������������������������������������������������� 260

viii
Table of Contents

8.3.6 A Plugin Management System������������������������������������������������������������������������������������ 261


8.3.7 A Mobile Device Interface������������������������������������������������������������������������������������������� 261
8.3.8 pdCalc in the Cloud���������������������������������������������������������������������������������������������������� 261

Appendix A: Acquiring, Building, and Executing pdCalc��������������������������������������� 263


A.1 Getting the Source Code����������������������������������������������������������������������������������������������������� 263
A.2 Dependencies��������������������������������������������������������������������������������������������������������������������� 264
A.3 Building pdCalc������������������������������������������������������������������������������������������������������������������� 265
A.3.1 Using Qt Creator��������������������������������������������������������������������������������������������������������� 266
A.3.2 Using the Command Line������������������������������������������������������������������������������������������� 267
A.4 Executing pdCalc���������������������������������������������������������������������������������������������������������������� 269
A.4.1 Using Qt Creator��������������������������������������������������������������������������������������������������������� 269
A.4.2 Using the Command Line������������������������������������������������������������������������������������������� 269
A.5 Troubleshooting������������������������������������������������������������������������������������������������������������������ 270

Appendix B: Organization of the Source Code������������������������������������������������������ 271


B.1 The src Directory����������������������������������������������������������������������������������������������������������������� 271
B.1.1 The 3rdParty Directory����������������������������������������������������������������������������������������������� 272
B.1.2 The app/pdCalc Directory������������������������������������������������������������������������������������������� 272
B.1.3 The app/pdCalc-simple-cli Directory�������������������������������������������������������������������������� 272
B.1.4 The app/pdCalc-simple-gui Directory������������������������������������������������������������������������ 272
B.1.5 The utilities Directory������������������������������������������������������������������������������������������������� 272
B.1.6 The backend Directory����������������������������������������������������������������������������������������������� 273
B.1.7 The ui Directory���������������������������������������������������������������������������������������������������������� 274
B.1.8 The plugins Directory������������������������������������������������������������������������������������������������� 275
B.2 The test Directory���������������������������������������������������������������������������������������������������������������� 275
B.2.1 The testDriver Directory��������������������������������������������������������������������������������������������� 276
B.2.2 The utilitiesTest Directory������������������������������������������������������������������������������������������� 276
B.2.3 The backendTest Directory����������������������������������������������������������������������������������������� 276
B.2.4 The uiTest Directory���������������������������������������������������������������������������������������������������� 277
B.2.5 The pluginsTest Directory������������������������������������������������������������������������������������������� 277

References������������������������������������������������������������������������������������������������������������ 279

Index��������������������������������������������������������������������������������������������������������������������� 283

ix
About the Author
Adam B. Singer graduated first in his class at the Georgia Institute of Technology in
1999 with a bachelor’s degree in chemical engineering. He subsequently attended
the Massachusetts Institute of Technology (MIT) on a National Defense Science and
Engineering Graduate Fellowship. He graduated from MIT with a Ph.D. in chemical
engineering in 2004 after defending his thesis titled “Global Dynamic Optimization.”
Since graduation, Adam has been employed by ExxonMobil1 in various Upstream
organizations, including research, information technology, and digital transformation.
He has held both technical and managerial roles in software development, design, and
project management in areas such as mathematical optimization, reservoir modeling
and simulation, decision support under uncertainty, basin modeling, well log modeling,
process stratigraphy, geoscience platform architecture, and data science. He has also
served on and chaired committees designing in-house training in the areas of technical
software development and computational and applied mathematics. He is currently the
Senior Principal Digital Architect for ExxonMobil.
Adam additionally held the title of adjunct assistant professor in the Department of
Computational and Applied Mathematics at Rice University from 2007 to 2012. In 2006
and 2007, he taught a graduate-level course, CAAM 520, on computational science.
The course focused on the design and implementation of high-performance parallel
programs.

1
 The advice, information, and conclusions discussed in this book are those of the author and
have not been endorsed by, or reflect the opinions or practices of, ExxonMobil Corporation or its
affiliates.

xi
About the Technical Reviewer
German Gonzalez-Morris is a software architect/engineer working with C/C++,
Java, and different application containers, in particular with WebLogic Server.
He has developed various applications using JEE, Spring, and Python. His areas
of expertise also include OOP, Java/JEE, Python, design patterns, algorithms, Spring
Core/MVC/security, and microservices. German has worked with performance
messaging, RESTful API, and transactional systems. For more information about him,
visit ­www.linkedin.com/in/german-­gonzalez-­morris.

xiii
Preface
Motivation of the Author
Throughout my career, I have mentored both students and fellow employees in
programming, and many of them have suggested that I write my thoughts down in book
form. However, I have typically responded with the rebuttal that I felt I had nothing novel
to present. Being a largely self-taught programmer, I have always been able to rattle off
a long list of books from which I have derived most of my knowledge. Therefore, what
could I write about that has not already been said?
I came to realize, however, that the majority of books that I had encountered
tended to focus only on pieces of design or implementation rather than taking a holistic
approach. For example, if one wants to learn the C++ language, Stroustrup [30] or
Lippman and Lajoie [19] are excellent references. For learning C++ best practices, one
need only read the books by Sutter [31, 32, 33], Sutter and Alexandrescu [34], or Meyers
[22, 21, 23]. Of course, learning to program extends well beyond C++. For data structures
and algorithms, there are always the classics by Knuth [15, 16, 17] or the more accessible
and concise book by Cormen et al. [10]. To learn object-oriented analysis and design,
the book by Booch et al. [8] is an excellent reference. Of course, design patterns can be
learned from Gamma et al. [11], and general programming practices can be learned from
many books such as those by McConnell [20], Spinellis [29], or Kernighan and Pike [14].
Certainly, the deeper the specialty one seeks, the more esoteric the book one can
find (and should eventually read). This book is not such a book. Rather, I have striven to
write a book that operates from the premise that the reader already possesses a working
knowledge of the information encased in works such as the aforementioned titles. In this
book, I instead attempt to ground the reader’s theoretical knowledge of design through
practice using a single case study.

xv
Preface

Target Audience
As mentioned previously, the goal of this book is not to present any specific topic
but rather to explore the interrelationship of often compartmentalized subjects. The
successful combination of these components to form a cohesive, maintainable, elegant
piece of software is, in essence, design. As such, this book is intended to target practicing
professionals, in particular those who have several years of development experience but
who do not yet possess sufficient experience to architect independently a large software
project.
Because my intent is to emphasize utilization of one’s existing knowledge effectively
to design software, I make little effort to explain individual topics in great depth. I believe
too many books classified as intermediate to advanced fail because the author devotes
too much content describing prerequisites. The result is a massive tome filled with
unnecessary detail for the advanced reader, while the beginner is left with a long and
complicated exposition that is still inaccessible because the beginner does not possess
sufficient knowledge or experience to grasp the subject regardless of the amount of detail
devoted to the description. I have, therefore, aimed for conciseness over completeness.
Often, I simply refer the reader to relevant material rather than myself describe a
background topic in great detail. While this strategy may indeed make this book difficult
for beginners, I hope experienced professionals appreciate both the brevity of the book
and its tone, which assumes the reader is competent at their craft.

Structure of the Book


Learning most tasks in programming requires hands-on experience and repetition;
design is no exception. My opinion is that design is best learned through a combination
of self-exploration and mentoring from an expert. For this reason, I have chosen to
organize this book as a study in design through the detailed working of a case study.
Instead of discussing design elements in the abstract, we will instead examine the
concrete application of design principles as they relate to the design and construction
of a simplistic (but not too simplistic) software project. Importantly, we will not only
examine successful results that led to the final implementation, but we will also spend
time considering alternatives, some of which are viable and others which are not. Where
multiple solutions may suffice, choosing one over the other is often either a matter of
context or just taste. Regardless, experience is usually the arbiter of such decisions, and

xvi
Preface

hopefully this book will enable the reader to learn from the author’s experiences without
having to repeat his mistakes. That is, I hope I have created a book that can serve as a
self-contained master class in design.

The Case Study


To this point, I have not yet mentioned the subject of the case study central to this
book. In my opinion, an ideal problem would be one that is not too daunting and yet
not so trivial that it needs no design. Additionally, the domain of the problem should
be readily understandable to any reader. For this reason, I have chosen to implement a
stack-based, Reverse Polish Notation (RPN) calculator that I named pdCalc, short for
practical design calculator. Functionally, pdCalc was inspired by the HP48S calculator,
an old favorite calculator of mine from high school and college (which still sits on my
desk today). I cannot imagine any reader being unfamiliar with the basic operations of
a calculator, and making the calculator use RPN adds a little twist that I hope will make
the project interesting. If your sole objective were to code a simple calculator with basic
functionality, admittedly, the design of pdCalc is overkill, and more code is written from
scratch than is strictly necessary. Remember, pdCalc’s primary purpose is to serve as an
instructional tool – a reduced-size representation of a real project. That pdCalc happens
to be a functioning RPN calculator is a secondary objective.

Language Selection
Design as an abstract concept can be taught in the absence of a particular programming
language. However, once committed to a concrete example, a specific language must
be chosen for the implementation. I decided to write the case study exclusively using
C++. While every line of the program does not appear in the text, all of the source code
is available for the reader to examine. Despite this book’s primary focus on design,
reading the source code is a good way to learn how implementation details in a specific
language enable or, at least, facilitate a chosen design. The source code also serves as
a high-quality (I hope) exemplar of a modern C++ implementation of a complete user
application. I highly recommend reading and modifying the source code in conjunction
with reading the text.
The decision to use C++ does not imply that C++ is the best choice for all programs,
and, in fact, it may not even be the best choice for the program examined in this book.
However, to ground the abstraction, a concrete language had to be selected. I chose
xvii
Preface

C++ because it is standardized, widely deployed, and available at zero cost on many
platforms. Selfishly, I also chose C++ because it is my most proficient language. While I
could, perhaps, have chosen another language meeting the aforementioned objective
criteria (e.g., Python), the resulting code would probably have been functional but
nonidiomatic due to my relative lack of expertise.
During the writing of the first edition of this book, C++0x was ratified as C++11
and then updated as C++14. C++11, with smart pointers, move semantics, lambdas,
variadic templates, and a host of other new features, fundamentally changed how
one could express a design in the C++ language. My objective at the time was to avoid
incorporating modern C++ features where they were inappropriate just to demonstrate
usage. Instead, I sought to highlight how these new language elements could be used
effectively in the design of a large-scale program. Hopefully, I achieved my objective.
Design and architecture have not changed significantly since the publication of
the first edition of this book, so why write a second edition? If this were an abstract
design book, such an update would be unnecessary. However, since the publication
of the first edition, C++17 and C++20 were both ratified. Because the book’s case study
is accompanied by a complete implementation, expressing a concrete design using
C++ has evolved with new language developments. While C++17 added several new
implementation features, none of these features substantially impacted the ability to
express designs in the language. C++20, on the other hand, is different.
C++20, maybe even more so than C++11, fundamentally changes how designs may
be expressed in C++. In particular, four new major language features were added: ranges,
coroutines, concepts, and modules, all of which make, at least, a brief appearance in
the case study. The ranges library does not fundamentally alter program design. It does,
however, fundamentally change the way algorithms can be implemented, especially
with the better integration of the functional programming paradigm as enabled through
views. Coroutines add cooperative multitasking to the C++ language. We will see that
even in a single-threaded program such as the one described in this book, coroutines
can be used to express an idea from the first edition differently. Concepts change the
way generic programs are constructed. This book’s design does not make extensive
use of templates; therefore, concepts make only the briefest of appearances. Lastly,
C++20 finally brings modularization to C++ as a formal language construct. This change
drastically impacts how code can be organized, including, in many instances, completely
eliminating the need for header files. We will explore the usage of C++ modules, and
their interaction with dynamically linked libraries, in some depth.

xviii
Other documents randomly have
different content
Kun hän heräsi, oli taaskin yö. Hän oli varmaankin nukkunut
kahdeksan tai kymmenen tuntia. Ensi hetkessä hän ei tiennyt, missä
hän oli, mutta vähitellen silmä tottui pimeyteen ja hän muisti
paenneensa orjuudesta.

Hän muisti myös kaiken muun: tuskallisen ikeen ja Tifumin


armottomat iskut. Hän nousi kiireesti jatkaakseen matkaansa.

Mutta ulkopuolelta kuuluvat hiljaiset, pehmeät askeleet


pelästyttivät hänet. Mitähän se saattoi olla? Samassa kajahti naurava
ääni, joka sai Selimin veren jähmettymään. Hän tointui kuitenkin
pian. Sehän oli vain hyeena, joka oli vainunnut saalista. Moto oli
kertonut tästä hirvittävästä äänestä, eikä Selim pelännyt enää.

Mutta pian sen jälkeen kuului kumea karjahdus — toinen, kolmas


— kunnes Selimin korvat olivat mennä lukkoon. Tuo ääni oli metsän
pelätyn kuninkaan. Ei ole olemassa mitään valtavampaa kuin sen
karjunta.

"Se on jalopeura!" tuumi Selim, kun ensimmäinen pelästys oli


hiukan laantunut. Hän oli usein toivonut saavansa nähdä jalopeuran,
mutta nyt hän ymmärsi, että oli viisainta pysyä paikallaan.

Hänellä oli ladattu pyssy kädessään, eikä puuhun johtava kolo ollut
niin suuri, että eläin olisi voinut tunkeutua siitä sisään.

Jalopeura oli vainunnut saaliin ja lähestyi nyt puuta karjuen ja


vilkuillen hehkuvin silmin joka puolelle, ja pian se olikin keksinyt, että
saalis oli puun sisässä. Selim peräytyi aukolta, ja samassa suuri eläin
hyppäsi puuta vasten raastaen käpälillään kuorta, ikäänkuin se olisi
päättänyt tunkeutua sen läpi. Sydän kurkussa poika tähtäsi
petoeläimen päähän, laukaisi — ja jalopeura kaatui maahan.
Selim ei uskaltanut kuitenkaan lähteä piilostaan, ennenkuin päivä
alkoi valjeta. Kauan hän kuunteli ulkoa tulevia ääniä, mutta kun
kaikki oli hiljaista, käsitti hän, että jalopeura oli kuollut, ja sitten hän
paneutui jälleen maata.

Hänen herätessään oli aivan valoisaa. Puun juurella makasi


jalopeura kuolleena. Selim kiipesi maahan ja katseli kuolleen pedon
ruumista. Vakavat ajatukset valtasivat hänen mielensä. Hän ajatteli,
miten väkevä ja ylväs tuo suuri eläin oli ollut edellisenä iltana
samoillessaan metsässä. Ja nyt, miten heikko se oli! Lapsikin olisi
voinut leikitellä sen harjalla ja hampailla.

"Jospa kaikki viholliseni kaatuisivat yhtä helposti kuin sinä", tuumi


Selim mielessään. "Sääli vain että olet saastainen, sillä olen hirveän
nälkäinen. Mutta sinua en saa syödä."

Sitten Selim jatkoi jälleen matkaansa etsien joka puolelta


metsänriistaa, voidakseen tyydyttää nälkäänsä. Hän oli ollut
kolmekymmentäkuusi tuntia ruuatta, ja kasvuiässä olevalle pojalle se
on pitkä aika.

Villejä hedelmäpuita ei ollut, ei metsäpersikoita eikä villejä


luumuja. Ko-virta näytti jakavan sen eteläpuolella olevat suuret
tasangot kahteen aivan erilaiseen alueeseen. Puut tässä osassa
lounais-Uroria, missä Selim nyt kulki, olivat parhaasta päästä
rakennuspuita. Jos Selim olisi tuntenut aarniometsiä paremmin olisi
hän löytänyt joukoittain syötäviä juuria. Mutta sitä hän ei
ymmärtänyt eikä niinollen tutkinut maata, vaan kulki alakuloisin
mielin eteenpäin. Auringon laskiessa hän näki pienen antiloopin, ja
rukoillen metsäonnea nosti pyssyn poskelleen. Pieni eläin kaatui
verissään maahan, ja Selim kiiruhti sen luo, nylki elukan, leikkasi
siitä lihaiset osat ja kantoi ne puuhun, jossa hän aikoi viettää yönsä.
Koottuaan kuivia oksia ja sytytettyään tulen hän paistoi lihapalat ja
söi ahnaasti pahimpaan nälkäänsä. Sitten hän pani maata.

Aamulla hän söi jälleen, otti mukaansa lopun ruuan ja jatkoi


matkaansa. Koska hän tunsi olevansa hyvissä voimin, kulki hän
varsin pitkän matkan. Illalla hän otti jälleen eväänsä esille, ja vaikka
hän huomasikin, että liha alkoi pahentua — hän ei ollut malttanut
kylliksi paistaa sitä edellisenä iltana — söi hän kuitenkin hyvällä
halulla. Mutta seuraavana aamuna se oli täynnä matoja, ja Selimin
oli pakko heittää se pois.

Aamupuolen päivää Selim vaelsi jälleen ja lepäsi kuumimman ajan.


Hän oli heikkona nälästä ja janosta, mutta kulki sittenkin muutamia
tunteja ikäpuolella, kunnes ei jaksanut enää, vaan sammutti
nälkänsä unella.

Kun Selim seuraavana aamuna jatkoi matkaansa, oli metsä


tavattoman hiljainen. Hän ei nähnyt ainoatakaan elävää olentoa, vain
joitakin haukkoja kierteli puiden yläpuolella. Hän laahasi tunnin
toisensa jälkeen väsyneitä jalkojaan eteenpäin, kunnes aurinko laski
taivaanrantaan. Vettä hän ei myöskään ollut nähnyt koko päivänä, ja
jano kiusasi häntä suuresti.

Taaskin koitti uusi päivä. Nälkä ja jano oli heikontanut Selimin


voimat ja tarmon. Jos hän olisi tiennyt, että watutakylän pellot olivat
parin tunnin matkan päässä, ja että tie, jota myöten Ferodian
karavaani kaksi päivää aikaisemmin oli kulkenut, oli vain penikulman
päässä hänestä! Mutta suuren metsän siimeksessä, joka ympäröi
häntä joka taholta, hän ei tiennyt mitään. Kunpa hän vain olisi
jaksanut kiivetä jonkun korkean puun latvaan, niin hän olisi nähnyt,
minne käsin hänen olisi pitänyt vaeltaa. Mutta hän saattoi tuskin
erottaa taivasta, niin tiheät olivat puiden latvat ja niin kiinteästi
toisiinsa kietoutuneet.

Väsyneen, nälkäisen ja janoisen Selimin mielestä metsä oli aivan


loputon. Hän tuijotti eteensä toivoen, että se alkaisi harventua ja etsi
silmillään joka puolelta eläviä olentoja, joko nelijalkaisia tai lintuja.
Hän katseli ylöspäin nähdäkseen edes vilahdukselta sinistä taivasta.

Jos hän olisi ollut tottuneempi matkustamaan Afrikassa, olisi hän


tiennyt, että hän olisi löytänyt joka notkosta vettä, jos hän vain olisi
kaivanut kepillä syvälle maan sisään, ja että kaikkialla löytyi juuria,
joilla voi sammuttaa nälkänsä. Mutta hän ei tiennyt mitään tästä
kaikesta. Siksi hän kulutti kalliit hetkensä lepoon ja hyökkäsi sitten
taas hermostuneesti eteenpäin, kunnes nälkäinen ruumis ei kestänyt
enää ja hänen jalkansa uupuivat. Hän kaatui maahan, nousi taas
ylös, mutta jäi lopulta tunnottomana makaamaan. Poika parka, hän
sai kalliisti maksaa isänsä halun kartuttaa rikkauksiaan vaihtamalla
ihmisolentoja kangaspakkoihin ja lasihelmiin!

Pyörtymiskohtauksen jälkeen, jota kesti muutamia minuutteja, hän


koetti nousta istumaan, mutta ei jaksanut vaan kaatui selälleen.
Maatessaan pitkänään katse kiintyneenä ylöspäin, hän ajatteli niitä
iloja, joista hänen oli täytynyt luopua, ja mitä enemmän ruumis
kärsi, sitä halukkaammin ajatukset liitelivät entisissä iloissa.
Ääneensä valittaen hän sanoi:

"Oi, jospa vielä kerran saisin nähdä meren, jospa saisin nähdä
valkean rannan, jossa leikittelin Abdullahin ja toisten toverieni
kanssa, ennenkuin heittäydyimme uimaan mereen! Muistan, miten
me kotona keräännyimme mangopuun alle, miten sen hedelmät
riippuivat kultaisina ja purppuranpunaisina ja miten iltatuuli liikutteli
lehtiä, taivutti kuninkaallisen kokospalmun latvaa ja tuoksuvaa
kaneelipuuta ja kohotteli räikeänvihreän appelsiinipuun oksia, jonka
hedelmät olivat kuin palsamia sielulleni. Jospa minulla olisi nyt yksi
ainoakin appelsiini! Muistan sokeriruo'on ambranväriset varret ja sen
ihanan mehun, kokospähkinöiden virvoittavan maidon, loistavan
granaattiomenan suloisine tuoksuineen ja makuineen, keltaiset
sitruunat, jotka poistavat kuumeen ja janon sekä meloonit, joiden
tummanvihreän kuoren sisäpuolella on niin ihania aarteita. Oi,
Sansibar, paratiisi maan päällä! Amer ben Osmanin onneton poika
näkee sen puiden ja kukkien, talojen ja puutarhojen tulevan yhä
lähemmäksi."

Väristen hän katseli ympärilleen suuressa, hiljaisessa


aarniometsässä, jonka ilma oli tukehduttaa hänet.

"Ilma on täällä varmaankin myrkyllistä", jatkoi hän


kuumehoureissaan. "Jättiläispuut kaatuvat mädäntyneinä maahan ja
tuhannet hyönteiset asettuvat niihin, taittuneita oksia putoaa alas ja
mädäntyneet lehdet löyhkäävät pahalta. Kuulen kaukaa nälkäisen
jalopeuran karjuvan. Ehkäpä se vainuaa arabialaispoika parkaa, ja
vieläkin kamalammalta tuntuu korvissani leopardin ääni ja hyeenan
nauru."

Katkerin mielin Selim pahoitteli, että oli koskaan syntynyt, ja


ajatuksissaan hän kävi läpi viime aikojen kärsimykset.

"Minä näin jalon isäni kaatuvan ja itse jäin yksin — minä itkin
ensin suurta suruani, sitten kärsin kaikki helvetin tuskat ja lopulta
toivoin, etten koskaan olisi nähnyt päivän valoa. Oi, noita hirveitä
marssipäiviä, joista ei tuntunut tulevan koskaan loppua, kun jano
kalvoi ruumistani eivätkä väsyneet jäsenet totelleet tahtoani."
Houreissaan hän näki edessään kuolleet, jotka oli jätetty tielle ja
makasivat siinä avoimin, jäykin silmin, ja kuolemankauhu valtasi
hänet, kun hän kuvitteli näkevänsä oman hautansa tämän metsän
korkean, vihreän holvin alla.

"Ei kukaan sure Selimin kuolemaa", valitti hän, "äitini ja palvelijani


eivät pese kuollutta ruumistani eivätkä kääri minua valkoisiin
kääreliinoihin, ja pyhä imani ei lue rukouksia kuolleen sieluni
pelastukseksi."

Mutta tätä kuolemanpelkoa ei kestänyt kauan. Hänen ajatuksensa


alkoivat sumentua, mutta hän kykeni vielä lausumaan kuoleman
tervetulleeksi ja kuiskaamaan jäähyväiset synnyinsaarelleen ja sille
kauniille maalle, joka oli tuottanut hänelle niin paljon kärsimyksiä.
Hänen viimeiset sanansa kuuluivat: "Minä tulen, rakas isäni!"
SEITSEMÄS LUKU

Ferodian riemukulku. — Katalambula ottaa hänet vastaan. —


Abdullah lahjoitetaan Kalululle. — Tapaa Simban ja Moton. —
Kalulu suunnittelee Selimin etsimistä. — Pyssy löydetään. — Selim
löydetään. — Hänet tuodaan tajuttomana kylään. — Toipuminen. —
Kalulun ja Selimin ystävyys.

Kahdentenakymmenentenäyhdeksäntenä päivänä Kwikurun


taistelun jälkeen saapui Ferodia riemukulussa Katalambulan kylään.
Edellisenä iltana olivat sanantuojat ilmoittaneet voitokkaan päällikön
tulon, ja kun seuraavan päivän aamupuolella näkyi suuri tomupilvi,
joka osoitti, missä sotajoukko kulki, kohotettiin iloisia huutoja.

Jo paljoa ennen kuin Ferodian etujoukko tuli näkyviin viljapeltojen


keskeltä, oli Katalambulan kylän portille kerääntynyt sotilaiden
omaisia. Kahdentuhannen ihmisen kurkusta kajahti yhtä aikaa
riemuhuuto "lu-lu-lu", neljätuhatta kättä taputti innokkaasti,
neljätuhatta ruskeaa ja mustaa jalkaa hyppi ilmaisten omistajainsa
iloa.

Rumpujen rämistessä Ferodia lähestyi. Ei kukaan sivistynyt


kuningas olisi voinut käyttäytyä sen arvokkaammin kuin hän. Hän
astui kuin jalopeura, hän nojasi käsivartensa kahden solakan
nuorukaisen olkapäihin, hän kantoi päätään ylpeästi pystyssä. Hänen
edellään astui kaksisataa valittua sotilasta, joiden päitä koristivat
liehuvat höyhentöyhdöt ja jotka asettuivat Katalambulan majan
ulkopuolelle. Sitten saapui Ferodia itse, ja hänen jäljessään taaskin
kaksisataa sotilasta. Kunkin sotilaan kasvoja ympäröi seepranharja,
ja tässä mustassa, jäykässä jouhikoristeessaan he näyttivät vielä
entistäänkin sotilaallisemmilta. Sitten seurasi täysikasvuisten vankien
joukko kaksikymmenhenkisissä ryhmissä kantaen Ferodian
sotasaalista, ja viimeisenä tulivat vangitut pojat johtajanaan
Abdullah, jonka valkea iho veti kaikkien silmät puoleensa. Viisisataa
sotilasta muodosti jälkijoukon.

Sotilaat asettuivat neliöön, ja vangit kantoivat ennenmainitun


suuren puun ympärille tavarapakkansa. Katalambula lepäsi penkillä,
joka päivän kunniaksi oli koristettu jalopeuran ja leopardin nahoilla,
ja hänellä oli kädessään lyhyt sauva, johon oli kiinnitetty
kirahvinhäntä. Sillä hän huiskutti pois kärpäsiä.

Uteliaat joukot olivat kiivenneet aitaukselle sekä majojen katoille,


ja Ferodia seisoi yksin piirin keskellä suuren saaliinsa vieressä. Hän,
samoinkuin kaikki muutkin, odotti, mitä Katalambula sanoisi.

"Me olemme ikävöineet sinua, Ferodia", sanoi nyt vanhus


lempeällä äänellä. "Me olemme kuulleet kerrottavan suuresta
voitostasi, miten sinä ja watutasotilaat voititte arabialaiset kauppiaat.
Kerro, olemme valmiit kuulemaan."

"Oi, Katalambula ja heimomme vanhimmat", Ferodia vastasi,


"minut lähetettiin viemään lahjoja Katalambulan ystäville,
waroripäälliköille, ja olin jo paluumatkalla kotiin, kun Olimali lähetti
minulle sanan, että arabit — kauppiaat meren rannalta olivat tulleet
hänen maahansa äärettömiä kangas- ja helmi-varastoja mukanaan.
Hän sanoi, että samaiset miehet olivat murhanneet Mostanan."

"Eiaa, eiaa!" huusivat päälliköt Kalukin yhtyessä heihin, ja Ferodia


jatkoi:

"Kun kuulin Olimalin kutsun, olin kuin nälkäinen jalopeura, joka


vainuu saalista. Sanoin ääneen: 'Kas, Malungu jumala on antanut
arabit käsiini, minä kostan Mostanan kuoleman, minä valmistan
taikajuoman heidän ruumiistaan, ja heidän päillään koristan Olimalin
portin pielet.'"

"Eiaa, eiaa!" huusi kansa.

"Aamulla olivat watutasotilaat valmiit taisteluun. He kuulivat


Olimalin torven toitotukset ja arabien pyssyjen laukaukset, ja minun
käskystäni he nousivat yhtenä miehenä. Me piiritimme vihollisen
Olimalin kylään, meidän nuolemme kaatoivat kasoittain heitä, ja me
otimme useita satoja miehiä ja nuorukaisia orjiksi ja toimme heidät
tänne. Me anastimme pyssyjä, kuulia ja ruutia, me keräsimme
rikkauksia: hienoja kankaita ja helmiä. Toisen puolen saaliista sai
Olimali ja kaikki watutasotilaat ovat saaneet osansa, päälliköt
omansa ja Ferodia omansa. Viisikymmentä orjaa ja kaksi
arabialaispoikaa on kuollut matkalla, ja yksi valkea poika karkasi
metsään kuollakseen siellä. Meillä on jäljellä kaksisataa
täysikasvuista orjaa ja seitsemäntoista poikaa, joista yksi on
arabialaisen päällikön poika. Kankaat, helmet ja muu saalis on tässä
jalkojenne juuressa. Minä olen puhunut, oi Katalambula ja te
heimomme vanhimmat."

"Eiaa, eiaa!" huusi kansa taputtaen käsiään.


"Oi, Ferodia, suuri päällikkö ja sotilas", vastasi Katalambula, "sinä
olet minun oikea käteni, sinä olet jalopeura taistelussa. Kuka voisi
sinut voittaa?"

Sen jälkeen kuningas Katalambula lähti katsomaan orjia, ja


Ferodia kehui heidän etujaan. He saapuivat myös poikien ryhmän
luo, ja nähdessään Abdullahin kuningas uteliaasti koetti sormellaan
hänen valkeaa ihoaan, mutta veti sormensa heti pois nauraen omalle
pelolleen. Mutta Ferodian kehoituksesta hän siveli pojan alastonta
selkää ihmetellen hipiän pehmeyttä, ja tunnusteli hänen sileää
tukkaansa.

"Mitä me teemme hänelle?" kuningas kysyi.

"Kuningas saa sen itse päättää", vastasi Ferodia mielistellen.

"Siinä tapauksessa minä lahjotan hänet Kalululle", päätti


Katalambula nopeasti, "mutta minä luulin, että sinulla olisi ollut
kolme tai neljä valkeaa poikaa."

"Ainoastaan kolme valkeaa. Yksi heistä kuoli matkalla ja suurin


karkasi viiden päivämatkan päässä täältä."

"Miksi hän karkasi?"

"Siksi että hän oli aasi", vastasi Ferodia katkerasti. "En ole koskaan
nähnyt niin röyhkeää poikaa. Suu hänellä oli täynnä sanoja, mutta
hänen selkänsä ei kyennyt työhön, ja siksi hän karkasi. Mutta
rohkeutta hänellä oli kahden sotilaan edestä, ja aikaa myöten
hänestä olisi tullut komea orja."

"Kenestä sinä puhut, Ferodia?" kysyi Kalulu, joka oli tullut lähelle.
"Ole vaiti poika", sanoi Katalambula. "Sukulaisesi Ferodia on
lahjoittanut sinulle tämän pienen valkean orjan leikkitoveriksi. Avaa
hänen siteensä ja opeta hänet sotilaaksi."

"Ei, annahan Ferodian vastata", Kalulu sanoi. "Kuka karkasi?"

"Nuori arabialainen orja, sinun ikäisesi poika", vastasi Ferodia


vastahakoisesti. "Hän oli erään päällikön poika, ja luulenpa melkein,
että Tifum julmuudellaan sai hänet karkaamaan."

"Tifum Byah ei ole lempeäkätinen, eikä ole kumma että poika


karkasi!" sanoi Kalulu. "Siitä voimme puhua myöhemmin. Nyt otan
valkean orjan mukaani ja annan hänelle ruokaa."

Tarkasti Abdullahia katsellen Kalulu leikkasi poikki hänen siteensä


ja käski ihmettelevän arabialaispojan seurata mukanaan. Ja tultuaan
huoneeseensa hän tarkasteli häntä jälleen, asettui seisomaan selin
häntä vasten ja koetti kädellään, kumpi heistä oli pitempi ja hymyili
sitten hänelle.

"Ymmärrätkö kitutankieltä?" Abdullah pudisti päätään, ja Kalulu


kiiruhti hakemaan hänelle ruokaa, paistettua lihaa, riisiä ja
maissipuuroa. Kädenliikkein hän ilmaisi Abdullahille, että ruoka oli
tarkoitettu hänelle, ja arabialaispoika käytti heti hyväkseen uuden
herransa hyvyyttä.

Kalulu katseli Abdullahin syöntiä, sitten hän kiiruhti pois ja palasi


takaisin mukanaan kaksi miestä, jotka nähdessään Abdullah lakkasi
syömästä.

"Simba! Moto! Miten te tulitte tänne?"

"Abdullah, poika parka!"


Hän hyppäsi pystyyn, syleili Simbaa ja sitten Motoa ja suuteli heitä
itkien ilosta, Kalulun hyväntahtoisesti katsellessa heitä.

"Oi, minä en ole yksin, minulla on vielä ystäviä", nyyhkytti poika,


ja Simba kysyi innokkaasti, minne toiset olivat joutuneet.

"Kova onni on vainonnut meitä siitä saakka kun tulimme Uroriin",


sanoi Abdullah surullisena. "Isa kuoli isoonrokkoon pari päivää sen
jälkeen, kun lähdimme Kwikurusta. Vähän myöhemmin sairastui
pikku veljeni Mussoud samaan tautiin ja kuoli ja Selim —"

"Niin, missä on Selim?" Moto kysyi.

"Samana yönä kun Mussoud kuoli, pakeni Selim metsään, sillä


Tifum löi häntä ja meitä kaikkia. Minä en voinut seurata hänen
mukanaan Mussoudin vuoksi, mutta minä rukoilin Allahia hänen
puolestaan. Kun heräsin aamulla, oli Selim poissa. Ja minä luulen,
että hän otti pyssyn ja pari keihästä mukanaan, sillä neekerit pitivät
suurta melua niistä."

"Pakeniko hän metsään?" kysyivät Simba ja Moto ihmeissään.


"Sanoiko hän, mitä tietä hän aikoi kulkea?"

"Hän sanoi aikovansa koettaa päästä Sansibariin, mutta juuri


ennen nukkumistani kuulin hänen mutisevan jotakin Simbasta ja
Motosta ja Katalambulasta, vaikka en tiedä, näinkö vain unta."

"Niin, se kuuluu hyvin uskottavalta", sanoi Moto, "hän muisti


varmaan, mitä me olimme puhuneet. Eikö hän sanonut, aikoiko hän
paeta pohjoiseen vai etelään?"

"Hänen täytyi lähteä etelään", vastasi Abdullah varmasti, "sillä leiri


oli tien eteläpuolella, ja me olimme sen eteläisimmässä päässä.
Hänen oli helpointa paeta huomaamatta sille taholle."

"Miten monta päivää sitten Selim karkasi?" kysyi Moto edelleen.

"Kuusi tai seitsemän päivää. En muista tarkalleen."

Tämän keskustelun aikana oli Kalulu tarkastellut puhujia, ja kun


hän huomasi levottoman ilmeen Moton kasvoilla, kysyi hän, mitä oli
tapahtunut, ja sai tietää, että Moton nuori herra oli paennut
aarniometsään ja että Simba ja Moto olivat hänen tähtensä tulleet
Katalambulan ja Kalulun luo.

Nuorukainen kysyi heti, mitä he aikoivat tehdä, ja lupasi auttaa


heitä kaikin tavoin.

Simba ja Moto neuvottelivat hetken aikaa ja sanoivat sitten


Kalululle, että he aikoivat lähteä Selimiä etsimään, ja tämä vakuutti
uudelleen auttavansa heitä.

"Minä pidän arabialaisista", hän sanoi. "Setäni lahjoitti minulle jo


tämän valkean pojan, ja minä luulen, että hän antaa toisenkin
minulle, mutta sinä, Moto, saat heidät molemmat, jos vain haluat."

Moto käänsi nämä sanat Simballe, jonka suunnitelma oli jo valmis.

"Sano nuorelle päällikölle, että hän pyytäisi Katalambulalta


viisikymmentä miestä sen tekosyyn nojalla, että metsässä on muka
norsuja. Sitten me voimme lähteä heti matkaan ja panna toimeen
ajot. Siten joko löydämme hänet tai kuulemme hänestä tai
pelastamme hänet niiden käsistä, jotka ovat anastaneet hänet."

Kalulu oli heti valmis täyttämään lupauksensa, ja puolen tunnin


kuluttua hän ilmoitti Motolle, että viisikymmentä miestä oli
lähtövalmiina, mutta että heidän mielestään oli outoa lähteä
metsästämään ilman taikurin apua.

"Minä sanoin heille, että me turvautuisimme taikurin apuun


huomenna", jatkoi hän. "Tulkaa heti paikalla, minäkin tahdon saada
jotakin aikaan, muuten kaikki puhuvat vain Ferodiasta, eikä kukaan
muista Kalulua. Minä haluan myös tavata nuoren herrasi nähdäkseni
onko hän yhtä hyvä kuin sinä väität."

Simba ja Moto olivat jo tarttuneet aseisiinsa, ja kun Kalulu oli


käskenyt Abdullahin jäädä hänen majaansa ja toimittanut hänelle
ruokaa ja yösijan seurasi hän toisten mukana ulos.

Oli keskipäivän aika, kun he alkoivat marssia samaa tietä myöten


kuin Ferodia oli tullut, ja seuraavana päivänä he näkivät kaukaa
aarniometsän synkät ääriviivat. Heidän ja metsän välissä oli
kuitenkin kylä, ja Simba piti parhaana alkaa tiedustelunsa jo sieltä.

Kun kylän asukkaat näkivät Katalambulan kasvatin tulevan,


ilmaisivat he suuren ilonsa. He kestitsivät Kalulua ja hänen miehiään
parhaansa mukaan tarjoten heille banaaneja, maissipuuroa ja
keitettyjä papuja.

Päällikkö kävi Kalulun viereen istumaan ja keskusteli kauan hänen


kanssaan. Hän kertoi muun muassa, että eräs hänen palvelijoistaan,
joka aamulla oli mennyt metsään etsimään hunajaa, oli löytänyt
sieltä pyssyn.

"Pyssynkö?" huudahtivat Moto ja Kalulu samalla kertaa.

"Niin, pyssyn, jossa oli lääkettä — pulveria ja kuula — sillä kun hän
leikitteli sillä, pamahti se ja oli säikäyttää hänet kuoliaaksi."
"Hyvin omituista", sanoi Moto koettaen hillitä kärsimättömyyttään,
"eikö palvelijasi löytänyt muuta?"

"Ei mitään muuta, veljeni. Eikö se ollut kylliksi? Sehän oli


suorastaan ihme."

"Mutta veljeni", sanoi Moto kiivaasti. "Miten pyssy saattoi joutua


metsään, jollei joku ollut tuonut sitä sinne?"

"Mienji Mungu — hyvä henki — toi sen sinne minua varten.


Muutamia päiviä sitten kuoli isäni, ja minä hautasin hänen mukanaan
hänen tavaransa, ja minä rukoilin hyvää henkeä, että hän tekisi
minut rikkaaksi ja mahtavaksi. Nyt hän on kuullut rukoukseni ja
lähettänyt tämän pyssyn taivaasta minulle."

"Älä puhu niin, päällikkö", sanoi Kalulu. "Tiedätkö, missä palvelijasi


löysi tuon pyssyn?"

"Orjasi vaikenee, kun Kalulu puhuu", päällikkö vastasi. "Minä en


tunne paikkaa, mutta palvelija tietää sen varmaan."

Palvelija käskettiin paikalle, ja hän sai käskyn saattaa Kalulu ja


hänen miehensä sinne, mistä hän oli löytänyt tämän ihmeellisen
aarteen.

Kahden tunnin marssin jälkeen he seisoivat metsässä suuren puun


juurella. Moton käskystä sotilaat asettuivat riviin, ja toinen puoli
heistä lähti pohjoiseen päin pysytellen viidenkymmenen askeleen
päässä toisistaan, toinen puoli etelään. Kun ketju oli täten
muodostettu, lähtivät he liikkeelle itää kohti, ja heidän oli määrä
pitää silmällä kaikkea, mikä sattui heidän eteensä.
Suunnitelma oli hyvä, sillä tuskin he olivat ennättäneet
kahdensadan metrin päähän, ennenkuin yksi joukosta huudahti ja
osoitti olentoa, joka makasi maassa. Simba kiiruhti paikalle ja huusi
ääneensä ilosta, sillä se oli Selimin ruumis.

Moto ja Kalulu kiiruhtivat myös jäljessä, mutta ilo muuttui suruksi,


kun he näkivät, miten jäykkä ja eloton ruumis oli. Jättiläinen Simba
seisoi ääneti ja voimattomana. Kalulun kasvot ilmaisivat syvää
osanottoa, ja Moto heittäytyi epätoivoissaan maahan. Toisetkin, jotka
nyt tulivat heidän luokseen, näyttivät hämmästyneiltä ja alakuloisilta,
mutta mies, joka oli löytänyt pyssyn, oli kuitenkin kaikkein syvimmin
liikuttunut nähdessään valkean ruumiin. Hän seisoi ensin aivan
liikkumatta paikallaan, mutta astui sitten lähemmäksi.

"Mitä tämä on?" kysyi hän lähimmältä mieheltä, "onko se henki,


joka antoi pyssyn!"

"Ei, henki se ei ole, senkin narri, vaan arabialaispoika joka on


kuollut nälkään", vastasi Moto ylpeänä äänellä, josta kävi ilmi, miten
hän sääli toisen tietämättömyyttä.

"Arabialaispoika!" toisti edellinen. "Mikä se on?"

"Eräs valkeaihoisista, jotka asuvat keskellä merta", vastasi sotilas.

"Miksi hän on valkea? Onko hänen ihonsa kuin munankuori? Onko


se kova vai pehmeä?" kysyi villi.

"Pelkäätkö sinä kuollutta poikaa? Koettele häntä, hupsu."

Villi naurahti mielettömänä, mutta kumartui Selimin ruumiin yli ja


koetteli arasti kädellään hänen rintaansa, mutta vetäisi heti pois
kätensä.
"Ei hän ole kuollut!" hän huusi kauhuissaan. "Hänen ihonsa on
pehmeä, ja minä tunsin, että se liikkui."

Moto ja Kalulu kumartuivat eteenpäin, ja ilonvälke syttyi Simban


silmään, kun hän painoi toisella kädellään Selimin rintaa, toisella
hänen päätään.

"Hän elää, nuori Selim herra elää!" hän huusi, ja Kalulu kumartui
innokkaana hänen ylitseen, sillä Simban äänestäjä kasvojen ilmeestä
hän oli arvannut sanojen merkityksen.

"Mutta hän ei voi elää kauan, jollei hän saa jotakin syödäkseen",
Moto sanoi. "Näetkö, Simba, miten laiha hän on, vain luuta ja
nahkaa! Mikä sheita paha henki — on häntä pidellyt noin pahoin?
Katso naarmuja hänen käsivarsissaan ja — käännäpä häntä Simba —
haavoja hänen selässään!"

"Oi, Moto", sanoi helläsydäminen Simba, "se on tosiaankin sheitan


tai mshensin — villin — työtä, ja niin totta kuin Allah minua
auttakoon, minä raastan sen miehen sydämen hänen rinnastaan.
Kannetaan hänet nyt varovasti kylään, ja pyydä Kalulu hankkimaan
hänelle hiukan vuohenmaidosta keitettyä velliä."

Sillä aikaa kuin Kalulu antoi tämän käskyn, joka nopeasti


toimitettiin edelleen, levitti Moto vaatteen maahan, ja Simba nosti
varovasti sille nuoren isäntänsä laihtuneen ruumiin, ja sitten he
yhdessä kahden muun miehen kanssa tarttuivat vaatteen kulmista
kiinni ja kantoivat hänet kylään.

Kun he saapuivat sinne, olivat kylän asukkaat kiihdyksissään


kuultuaan, että Kalulu oli löytänyt miltei nälkään nääntyneen valkean
pojan metsästä. Sen kummempaa saattoi tuskin ajatella. Valkoinen
poika, jonka iho oli kuin munankuori. Mielessään he olisivat voineet
kuvailla kaksipäisiä, kuusikätisiä ja vaikkapa tuhatraajaisia mustia
miehiä, mutta valkea poika, jonka iho oli niin hieno ja pehmeä, että
vähinkin puristus jätti siihen merkkinsä, oli jotakin kuulumatonta.

Eipä siis ihme, että kaikki kiirehtivät uteliaina katsomaan, ja että


he olivat pahoin pettyneet, kun Kalulun sotilaat eivät päästäneet
heitä paarien luo. Moto ja Simba sekä heidän apulaisensa kantoivat
taakkansa tyhjään majaan, jonka kylän päällikkö Kalulun pyynnöstä
luovutti heille, ja Moton avattua varovaisesti Selimin suun alkoi
Simba syöttää hänelle ohutta velliä pienellä puulusikalla.

Se vaikutti melkein heti, joskin kärsimättömän Simban mielestä


aika tuntui kovin pitkältä, ennenkuin avonaiset huulet sulkeutuivat ja
kurkussa tuntui hiukan liikettä. Mutta sitten kuivat huulet avautuivat
itsestään, ja Simba oli heti valmis antamaan hiukan lisää lämmintä ja
virkistävää juomaa. Kalulu oli polvistunut Selimin pään viereen ja
näytti Simballe pieniä hikipisaroita joita alkoi helmeillä sairaan
otsalle. Moto painoi kätensä Selimin rintaa vasten ja saattoi kaikkien
iloksi vakuuttaa, että sydän alkoi lyödä nopeammin ja
voimakkaammin. Pian Selim huokasi, ja silmäluomet, jotka tähän
saakka olivat olleet ummessa, avautuivat ja loistavat, sielukkaat
silmät tulivat näkyviin.

"Oi, miten kauniit silmät, miten suuret ja loistavat!" huudahti


Kalulu ihmeissään.

"Sh!" varoitti Simba ja painoi korvansa Selimin huulia vasten, jotka


kuiskasivat:

Se päivä koittaa, hetki murheinen,


kun pojat suree surmaa isien.
"Poika parka!" sanoi Simba. "Hän toistaa sanoja, jotka hänen
äitinsä lausui heidän eronhetkellään." Ja sitten hän lisäsi kovalla
äänellä: "Selim, nuori herra, tunnetko minua?"

"Simba, sinäkö se olet?" kysyi Selim väsyneellä, mutta iloisella


äänellä.

"Niin, minä olen orjasi Simba. Allah olkoon kiitetty hyvyydestään.


Herrani tuntee orjansa."

"Missä minä olen?" Selim kysyi. "Minulla oli hirveä uni. Minusta
tuntui, että olin kuolla nälkään ja janoon. Mutta minä olin kaukana
kaameassa metsässä. Ja nyt olen sisällä huoneessa, ja Simba on
vieressäni. Mitä on tapahtunut, Simba?"

"Tunnetko myöskin Moton, herra?" kysyi tämä. "Oi, Moto, oletko


sinäkin täällä? Nyt olen iloinen, etten ole enää yksin niinkuin
uneksin."

"Ei, herra, sinä et ole enää yksin, mutta syö hiukan, niin tulet taas
voimiisi", sanoi Simba. Ja Selim söi katsellen samalla ympärilleen.
Hänen aivonsa koettivat ratkaista kysymystä, mitä oli tapahtunut sen
jälkeen, kun hän metsässä oli kaatunut kumoon nälästä,
väsymyksestä ja janosta heikontuneena.

Mutta kun hän oli syönyt kaiken maidon loppuun, olivat hänen
voimansa palanneet siinä määrin, että Simba saattoi lyhyesti kertoa
hänelle kaiken sen, minkä me jo tiedämme molempien orjien
matkasta Katalambulan luo.

Ja sitten tuli Kalulukin esille, ja Simba kertoi, miten hyvä hän oli
ollut Motolle ja miten he hänen avullaan olivat löytäneet Selimin.
Selim nosti kättään, puristi lämpimästi Kalulun kättä ja pyysi
Moton tulkitsemaan hänelle hänen kiitollisuuttaan.

"Kalulu on arabialaispojan veli", sanoi nuori päällikkö lämpimästi.


"Kalulun rinnalla voi valkea arabialaisveljeni huoleti kulkea metsän
halki, sillä metsä on ystävällinen Kalululle. Puut ja linnut tervehtivät
häntä ilolla, eivät edes villit eläimet tee hänelle pahaa. Tule
terveeksi, veljeni, tule voimakkaaksi äläkä tämän jälkeen pelkää
mitään vaaraa."

Selimin silmät olivat täynnä kiitollisuuden kyyneleitä, kun hän


vastasi:

"Kalulun ääni kajahtaa korvissani kuin raitis lähteen solina janosta


uupuneen korvissa. Pelko ja epätoivo katoaa ja sydämeni saa
rauhan. Jos Kalulu on veljeni, niin tunnen iloa ja riemua yön
pimeydessä samoinkuin auringonvalossakin."

"Kalulu iloitsee myöskin kuullessaan sinun äänesi, valkea veljeni.


Minä opetan sinulle, mitä taivaanhenki on opettanut watutalaisille, ja
sinä neuvot minulle, mitä hän on opettanut arabeille. Sinä kerrot
minulle suuresta merestä, jonka myrsky saa kuohumaan, ja minä
näytän sinulle Liemban ruskean veden ja krokotiilit ja virtahevot,
jotka elävät siinä. Minä opetan sinua metsästämään nopeajalkaisia
antilooppeja, villejä puhvelihärkiä, paksunahkaisia sarvikuonoja ja
jalopeuroja. Syö nyt ja tule voimakkaaksi. Mutta sanohan minulle,
veljeni, mistä johtuu, että selkäsi on arpia ja naarmuja täynnä?"

"Älä välitä siitä, Kalulu-veljeni, sinun sanasi ovat minulle paras


lääke. Äänesi sointu on parantanut haavani, en tunne kipua enää."

"Mutta sanohan minulle, kuka löi sinua", intti Kalulu. "Ferodiako?"


"Ei, vaan Tifum Byah."

"Vai Tifum Byah, tuo julma koira, kyllä minä hänen selkänsä
pehmitän!"

"Älä tee hänelle pahaa minun tähteni, Kalulu", pyysi Selim, "pahat
päivät ovat nyt lopussa."

"Saammepa nähdä", sanoi Kalulu, "ja nyt on parasta, että


annamme sinun maata. Kaksi päivää me lepäämme täällä. Voimistut
sinä aikana sen verran, että voit tulla kuningas Katalambulan luo.
Tiedätkö, että kun Moto kertoi sinusta, pidin sinusta hänen tähtensä.
Nyt pidän sinusta itsesi vuoksi. Ja mtutalainen voi sekä rakastaa että
vihata."

You might also like