32,99 €
Create more robust applications with a test-first approach to JavaScript Reliable JavaScript, How to Code Safely in the World's Most Dangerous Language demonstrates how to create test-driven development for large-scale JavaScript applications that will stand the test of time and stay accurate through long-term use and maintenance. Taking a test-first approach to software architecture, this book walks you through several patterns and practices and explains what they are supposed to do by having you write unit tests. Write the code to pass the unit tests, so you not only develop your technique for structuring large-scale applications, but you also learn how to test your work. You'll come away with hands-on practice that results in code that is correct from the start, and has the test coverage to ensure that it stays correct during subsequent maintenance. All code is provided both in the text and on the web, so you can immediately get started designing more complete, robust applications. JavaScript has graduated from field-validation scripts to full-scale applications, but many developers still approach their work as if they were writing simple scripts. If you're one of those developers, this book is the solution you need to whip your code into shape and create JavaScript applications that work. * Write more concise and elegant code by thinking in JavaScript * Test the implementation and use of common design patterns * Master the use of advanced JavaScript features * Ensure your code's conformance to your organization's standards If you're ready to step up your code and develop more complete software solutions, Reliable JavaScript is your essential resource.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 603
Lawrence D. Spencer Seth H. Richards
Reliable JavaScript®
Published by John Wiley & Sons, Inc. 10475 Crosspoint Boulevard Indianapolis, IN 46256 www.wiley.com
Copyright © 2015 by John Wiley & Sons, Inc., Indianapolis, Indiana
Published simultaneously in Canada
ISBN: 978-1-119-02872-7
ISBN: 978-1-119-02873-4 (ebk)
ISBN: 978-1-119-02874-1 (ebk)
Manufactured in the United States of America
No part of this publication may be reproduced, stored in a retrieval system or transmitted in any form or by any means, electronic, mechanical, photocopying, recording, scanning or otherwise, except as permitted under Sections 107 or 108 of the 1976 United States Copyright Act, without either the prior written permission of the Publisher, or authorization through payment of the appropriate per-copy fee to the Copyright Clearance Center, 222 Rosewood Drive, Danvers, MA 01923, (978) 750-8400, fax (978) 646-8600. Requests to the Publisher for permission should be addressed to the Permissions Department, John Wiley & Sons, Inc., 111 River Street, Hoboken, NJ 07030, (201) 748-6011, fax (201) 748-6008, or online at http://www.wiley.com/go/permissions.
Limit of Liability/Disclaimer of Warranty: The publisher and the author make no representations or warranties with respect to the accuracy or completeness of the contents of this work and specifically disclaim all warranties, including without limitation warranties of fitness for a particular purpose. No warranty may be created or extended by sales or promotional materials. The advice and strategies contained herein may not be suitable for every situation. This work is sold with the understanding that the publisher is not engaged in rendering legal, accounting, or other professional services. If professional assistance is required, the services of a competent professional person should be sought. Neither the publisher nor the author shall be liable for damages arising herefrom. The fact that an organization or Web site is referred to in this work as a citation and/or a potential source of further information does not mean that the author or the publisher endorses the information the organization or website may provide or recommendations it may make. Further, readers should be aware that Internet websites listed in this work may have changed or disappeared between when this work was written and when it is read.
For general information on our other products and services please contact our Customer Care Department within the United States at (877) 762-2974, outside the United States at (317) 572-3993 or fax (317) 572-4002.
Wiley publishes in a variety of print and electronic formats and by print-on-demand. Some material included with standard print versions of this book may not be included in e-books or in print-on-demand. If this book refers to media such as a CD or DVD that is not included in the version you purchased, you may download this material at http://booksupport.wiley.com. For more information about Wiley products, visit www.wiley.com.
Library of Congress Control Number: 2015941920
Trademarks: Wiley, the Wiley logo, Wrox, the Wrox logo, Programmer to Programmer, and related trade dress are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States and other countries, and may not be used without written permission. JavaScript is a registered trademark of Oracle America, Inc. All other trademarks are the property of their respective owners. John Wiley & Sons, Inc. is not associated with any product or vendor mentioned in this book.
We dedicate this book to all JavaScript developers who work hard to hone their craft. You are making the world a more beautiful place.
PROJECT EDITORChristina Haviland
TECHNICAL EDITORSKeith Pepin John Peloquin
PRODUCTION MANAGERKathleen Wisor
COPY EDITORNancy Rapoport
MANAGER OF CONTENT DEVELOPMENT & ASSEMBLYMary Beth Wakefield
MARKETING DIRECTORDavid Mayhew
MARKETING MANAGERCarrie Sherrill
PROFESSIONAL TECHNOLOGY & STRATEGY DIRECTORBarry Pruett
BUSINESS MANAGERAmy Knies
ASSOCIATE PUBLISHERJim Minatel
PROJECT COORDINATOR, COVERBrent Savage
PROOFREADERNancy Carrasco
INDEXERJohnna VanHoose Dinse
COVER DESIGNERWiley
COVER IMAGE© Getty Images/Andrew Rich
LARRY SPENCER is Vice President of Application Development at ScerIS, a software and services company in Sudbury, Massachusetts. He and his team create browser-based applications in AngularJS, with a C#/Web API/SQL Server back end. Larry's 35-year career has included stints programming in COBOL, C, C++, C#, and even mainframe assembly language, but he says JavaScript is the most fun. A frequent speaker at Code Camps and other gatherings, Larry enjoys sharing his love of software with the development community. You can find his blog at http://FascinatedWithSoftware.com.
Larry's outside interests include philosophy, chess, and classical guitar. He lives in Marlborough, Massachusetts.
SETH RICHARDS has been crafting software professionally since 2002. He got his start programming embedded devices for the bar and nightclub industry and transitioned to web application development in 2007. He has worked on numerous web-based applications ranging from an enterprise-class geographic information system–centric physical asset management system to a social network for product discovery and recommendation.
Seth graduated from Plymouth State College (now University) in Plymouth, New Hampshire, where he studied computer science and mathematics. He is currently pursuing his M.S. in Computer Science from the Georgia Institute of Technology. Seth's blog can be found at http://blog.shrichards.com, and he can be followed on Twitter at @shrichards.
KEITH PEPIN has been developing sites and applications on the web for over 17 years. Early in his career, he fell in love with JavaScript and has been passionately building dynamic user experiences ever since. He is currently a Senior Software Engineer at Meltwater, and is using HTML5, CSS3, JavaScript, AngularJS, Node.js, and MongoDB to build the next generation of their online marketing intelligence platform. When not coding or spending time with his family, he enjoys other geeky pursuits, including all forms of games, comic books, painting, and sketching.
JOHN PELOQUIN is a software engineer with over 10 years of JavaScript experience ranging across applications of all sizes. John earned his B.A. in Mathematics from U.C. Berkeley and is currently a lead engineer at Spreemo, a healthcare technology startup in NYC. Prior to editing this volume, John edited Professional Website Performance by Peter Smith (Wiley 2012) and Professional JavaScript for Web Developers, 3rd ed. by Nicholas Zakas (Wiley 2012). When he is not coding or collecting errata, John can occasionally be found doing stand-up comedy at an open mic.
Thank you to my wife, Bethany, for her love and support while we wrote this book, and for enduring (or enjoying?) many husband-less nights and weekends while I worked to meet a deadline.
–SETH RICHARDS
Thanks to my family for encouraging me to pursue my dreams. My dreams may include writing a book, but they begin and end with you.
–LARRY SPENCER
This book would not have been possible without the willingness of others to share their knowledge and expertise with us and the community at large in book, blog, and source-code format. Together, we'd like to acknowledge and thank:
Douglas Crockford, for his exposure of good parts of JavaScript and his work on jsLint.
Nicolas Zakas, for the numerous books and blog posts he wrote that acted as guides through JavaScript's sometimes-treacherous waters, and also his maintenance of and contributions to ESLint.
Stoyan Stefanov, for his instruction on applying pattern-based development to JavaScript.
Robert C. Martin, for instilling in us the desire to write clean code.
Fredrik Appelberg, for his creation of, and Dave Clayton for his contributions to, the AOP.js aspect-oriented programming framework.
Mike Bostock, for inspiring us with the D3 library for SVG graphics.
The folks at Pivotal Labs, for the creation of the open-source JavaScript framework Jasmine, and members of the community that have contributed to the framework.
The AngularJS team, for showing the world a great way to build single-page applications.
The vast and growing network of generous people on sites such as Stack Overflow and GitHub. Without you, we'd still be thumbing through manuals.
We would also like to express our appreciation to our project editor, Chris Haviland, who deftly maneuvered us through the writing process from beginning to end. Our copy editor, Nancy Rapoport, has read our book more carefully, and more times, than anyone else ever will. For her dedication and suggestions we offer heartfelt thanks. We would also like to express our sincerest thanks to our technical editors, Keith Pepin and John Peloquin. Their JavaScript prowess helped us avoid more than a few technical errors. Should any errors still exist, it's likely because we didn't follow some of their advice. Our hats are off to you, gentlemen.
Finally, we'd like to thank Carol Long, the Executive Acquisitions Editor at Wiley, who gave us the opportunity to write this book. Without her, we'd still just be a couple of guys that write software for a living. We're still that, but now we're authors, too. Carol announced her retirement from the publishing industry just before we finished the book. We sure hope we weren't the straw that broke the camel's back! Thank you, Carol, and we wish you nothing but sunny days and margaritas in your retirement.
–LARRY AND SETH
INTRODUCTION
THE RISE OF JAVASCRIPT AS A FIRST-CLASS LANGUAGE
THE EASE OF WRITING TRULY DISASTROUS CODE IN JAVASCRIPT
THE EASE OF UNINTENTIONALLY BREAKING JAVASCRIPT CODE
THIS BOOK'S INTENDED AUDIENCE
HOW THIS BOOK IS STRUCTURED
WHAT YOU NEED TO USE THIS BOOK
CONVENTIONS
SOURCE CODE
ERRATA
P2P.WROX.COM
PART I: LAYING A SOLID FOUNDATION
CHAPTER 1 PRACTICING SKILLFUL SOFTWARE ENGINEERING
WRITING CODE THAT STARTS CORRECT
WRITING CODE THAT STAYS CORRECT
SUMMARY
CHAPTER 2 TOOLING UP
USING A TESTING FRAMEWORK
USING A DEPENDENCY-INJECTION FRAMEWORK
USING AN ASPECT TOOLKIT
USING A CODE-CHECKING TOOL
SUMMARY
CHAPTER 3 CONSTRUCTING RELIABLE OBJECTS
USING PRIMITIVES
USING OBJECT LITERALS
USING THE MODULE PATTERN
USING OBJECT PROTOTYPES AND PROTOTYPAL INHERITANCE
CREATING OBJECTS WITH NEW
USING CLASSICAL INHERITANCE
USING FUNCTIONAL INHERITANCE
MONKEY-PATCHING
SUMMARY
PART II: TESTING PATTERN-BASED CODE
CHAPTER 4 REVIEWING THE BENEFITS OF PATTERNS
CASE STUDY
PRODUCING MORE ELEGANT CODE BY USING A BROADER VOCABULARY
PRODUCING RELIABLE CODE WITH WELL-ENGINEERED, WELL-TESTED BUILDING BLOCKS
SUMMARY
CHAPTER 5 ENSURING CORRECT USE OF THE CALLBACK PATTERN
UNDERSTANDING THE PATTERN THROUGH UNIT TESTS
AVOIDING PROBLEMS
SUMMARY
CHAPTER 6 ENSURING CORRECT USE OF THE PROMISE PATTERN
UNDERSTANDING PROMISES THROUGH UNIT TESTS
CHAINING PROMISES
USING A PROMISE WRAPPER
UNDERSTANDING STATES AND FATES
DISTINGUISHING STANDARD PROMISES FROM JQUERY PROMISES
SUMMARY
CHAPTER 7 ENSURING CORRECT USE OF PARTIAL FUNCTION APPLICATION
UNIT-TESTING A PARTIAL FUNCTION APPLICATION
CREATING AN ASPECT FOR PARTIAL FUNCTION APPLICATION
DISTINGUISHING BETWEEN PARTIAL FUNCTION APPLICATION AND CURRYING
SUMMARY
CHAPTER 8 ENSURING CORRECT USE OF THE MEMOIZATION PATTERN
UNDERSTANDING THE PATTERN THROUGH UNIT TESTS
ADDING MEMOIZATION WITH AOP
SUMMARY
CHAPTER 9 ENSURING CORRECT IMPLEMENTATION OF THE SINGLETON PATTERN
UNDERSTANDING THE PATTERN THROUGH UNIT TESTS
SUMMARY
CHAPTER 10 ENSURING CORRECT IMPLEMENTATION OF THE FACTORY PATTERN
WRITING UNIT TESTS FOR A FACTORY
IMPLEMENTING THE FACTORY PATTERN
CONSIDERING OTHER FACTORY TYPES
SUMMARY
CHAPTER 11 ENSURING CORRECT IMPLEMENTATION AND USE OF THE SANDBOX PATTERN
UNDERSTANDING THE PATTERN THROUGH UNIT TESTS
SUMMARY
CHAPTER 12 ENSURING CORRECT IMPLEMENTATION OF THE DECORATOR PATTERN
DEVELOPING A DECORATOR THE TEST-DRIVEN WAY
SUMMARY
CHAPTER 13 ENSURING CORRECT IMPLEMENTATION OF THE STRATEGY PATTERN
UNDERSTANDING THE PATTERN THROUGH UNIT TESTS
SUMMARY
CHAPTER 14 ENSURING CORRECT IMPLEMENTATION OF THE PROXY PATTERN
DEVELOPING A PROXY THE TEST-DRIVEN WAY
SUMMARY
CHAPTER 15 ENSURING CORRECT IMPLEMENTATION OF CHAINABLE METHODS
UNDERSTANDING THE PATTERN THROUGH UNIT TESTS
CHAINING THEN
SUMMARY
PART III: TESTING AND WRITING WITH ADVANCED JAVASCRIPT FEATURES
CHAPTER 16 CONFORMING TO INTERFACES IN AN INTERFACE-FREE LANGUAGE
UNDERSTANDING THE BENEFITS OF INTERFACES
UNDERSTANDING THE INTERFACE SEGREGATION PRINCIPLE
USING TEST-DRIVEN DEVELOPMENT TO CREATE A CONTRACT REGISTRY
SUMMARY:
CHAPTER 17 ENSURING CORRECT ARGUMENT TYPES
UNDERSTANDING THE OPPORTUNITIES AND RISKS POSED BY JAVASCRIPT’S TYPE-FREE PARAMETERS
EXTENDING THE CONTRACTREGISTRY TO CHECK ARGUMENTS
SUPPORTING CONTRACT LIBRARIES
PUTTING IT ALL TOGETHER
COMPARING THE ASPECT-ORIENTED SOLUTION TO A STATIC SOLUTION
SUMMARY
CHAPTER 18 ENSURING CORRECT USE OF CALL, APPLY, AND BIND
EXPLORING HOW THIS IS BOUND
CREATING AND TESTING CODE THAT USES CALL, APPLY, AND BIND
SUMMARY
CHAPTER 19 ENSURING CORRECT USE OF METHOD-BORROWING
ENSURING THE BORROWING OBJECT IS SUITABLE
ANTICIPATING SIDE EFFECTS ON THE BORROWER
ANTICIPATING SIDE EFFECTS ON THE DONOR OBJECT
SUMMARY
CHAPTER 20 ENSURING CORRECT USE OF MIXINS
CREATING AND USING MIXINS
SUMMARY
CHAPTER 21 TESTING ADVANCED PROGRAM ARCHITECTURES
ENSURING RELIABLE USE OF THE OBSERVER PATTERN
ENSURING RELIABLE USE OF THE MEDIATOR PATTERN
SUMMARY
PART IV: SPECIAL SUBJECTS IN TESTING
CHAPTER 22 TESTING DOM ACCESS
UNIT-TESTING UI
OPTIMIZING YOUR CODE WITH A PROFILER
SUMMARY
CHAPTER 23 ENSURING CONFORMANCE TO STANDARDS
USING ESLINT
ENFORCING ARCHITECTURAL DIVISIONS
SUMMARY
PART V: SUMMARY
CHAPTER 24 SUMMARY OF THE PRINCIPLES OF TEST-DRIVEN DEVELOPMENT
RECALLING WHY TEST-DRIVEN DEVELOPMENT IS WORTHWHILE
PRACTICING TEST-DRIVEN DEVELOPMENT
SUMMARY
CHAPTER 25 SUMMARY OF JAVASCRIPT IDIOMS IN THIS BOOK
REVIEWING OBJECTS
REVIEWING VARIABLES
REVIEWING FUNCTIONS
REVIEWING BOOLEAN OPERATIONS
SUMMARY
INDEX
EULA
Chapter 3
Table 3.1
Table 3.2
Table 3.3
Table 3.4
Table 3.5
Table 3.6
Table 3.7
Chapter 4
Table 4.1
Chapter 10
Table 10.1
Chapter 21
Table 21.1
Table 21.2
Chapter 1
Figure 1.1
Figure 1.2
Figure 1.3
Figure 1.4
Chapter 2
Figure 2.1
Figure 2.2
Figure 2.3
Figure 2.4
Figure 2.5
Figure 2.6
Figure 2.7
Figure 2.8
Figure 2.9
Figure 2.10
Figure 2.11
Figure 2.12
Figure 2.13
Chapter 3
Figure 3.1
Figure 3.2
Figure 3.3
Chapter 5
Figure 5.1
Figure 5.2
Figure 5.3
Figure 5.4
Figure 5.5
Figure 5.6
Figure 5.7
Figure 5.8
Chapter 6
Figure 6.1
Chapter 7
Figure 7.1
Chapter 8
Figure 8.1
Figure 8.2
Chapter 9
Figure 9.1
Figure 9.2
Figure 9.3
Figure 9.4
Chapter 10
Figure 10.1
Chapter 11
Figure 11.1
Figure 11.2
Figure 11.3
Figure 11.4
Figure 11.5
Figure 11.6
Figure 11.7
Figure 11.8
Figure 11.9
Chapter 12
Figure 12.1
Figure 12.2
Figure 12.3
Figure 12.4
Figure 12.5
Figure 12.6
Figure 12.7
Chapter 13
Figure 13.1
Figure 13.2
Figure 13.3
Figure 13.4
Chapter 14
Figure 14.1
Figure 14.2
Figure 14.3
Figure 14.4
Figure 14.5
Figure 14.6
Figure 14.7
Figure 14.8
Figure 14.9
Figure 14.10
Figure 14.11
Chapter 15
Figure 15.1
Figure 15.2
Figure 15.3
Figure 15.4
Figure 15.5
Figure 15.6
Chapter 16
Figure 16.1
Figure 16.2
Figure 16.3
Figure 16.4
Figure 16.5
Chapter 17
Figure 17.1
Figure 17.2
Chapter 18
Figure 18.1
Figure 18.2
Figure 18.3
Figure 18.4
Figure 18.5
Figure 18.6
Figure 18.7
Figure 18.8
Figure 18.9
Figure 18.10
Figure 18.11
Figure 18.12
Figure 18.13
Figure 18.14
Figure 18.15
Chapter 19
Figure 19.1
Figure 19.2
Figure 19.3
Figure 19.4
Figure 19.5
Figure 19.6
Figure 19.7
Chapter 20
Figure 20.1
Figure 20.2
Figure 20.3
Figure 20.4
Figure 20.5
Figure 20.6
Figure 20.7
Figure 20.8
Figure 20.9
Figure 20.10
Figure 20.11
Figure 20.12
Figure 20.13
Figure 20.14
Figure 20.15
Figure 20.16
Figure 20.17
Figure 20.18
Figure 20.19
Figure 20.20
Chapter 21
Figure 21.1
Figure 21.2
Figure 21.3
Figure 21.4
Figure 21.5
Figure 21.6
Chapter 22
Figure 22.1
Figure 22.2
Figure 22.3
Figure 22.4
Figure 22.5
Figure 22.6
Figure 22.7
Figure 22.8
Figure 22.9
Figure 22.10
Figure 22.11
Figure 22.12
Figure 22.13
Figure 22.14
Figure 22.15
Chapter 23
Figure 23.1
Figure 23.2
Figure 23.3
Figure 23.4
Figure 23.5
Figure 23.6
Figure 23.7
Figure 23.8
Figure 23.9
Figure 23.10
Figure 23.11
Figure 23.12
Figure 23.13
Figure 23.14
Figure 23.15
Figure 23.16
Cover
Table of Contents
Part
xxi
xxii
xxiii
xxiv
xxv
xxvi
xxvii
xxviii
xxix
1
3
4
5
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
105
107
108
109
110
111
112
113
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
140
141
142
143
144
145
146
147
148
149
150
151
152
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
173
174
175
176
177
178
179
180
181
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
199
200
201
202
203
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
256
257
258
259
260
261
262
263
264
265
266
267
269
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
306
307
308
309
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
373
374
375
376
377
378
379
380
381
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
401
402
403
404
405
406
407
408
409
411
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
439
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
463
465
466
467
468
469
470
471
472
473
475
476
477
478
479
480
481
482
483
484
485
486
487
489
490
491
492
493
494
495
496
497
WHEN WE SHARED THE TITLE OF THIS BOOK, Reliable JavaScript, with fellow developers, we received feedback such as:
“Now
there's
a juxtaposition!”
“It must be a very short book.”
“Will I find it next to the latest John Grisham thriller in the fiction section of the bookstore?”
No, this book is not a work of fiction.
The feedback we received about the title of the book illustrates a broader perception about JavaScript that some developers with experience in classical, compiled languages have: JavaScript is used to create flashy portfolio websites or simple to-do apps; it has no business in my mission-critical enterprise application.
In the past that was true, but no more.
JavaScript's reputation as a wild child is well-deserved, and we hope to amuse you with some of its exploits in the next two sections. However, like a spoiled heiress who inherits the family business and surprises everyone by rising to the challenge, she has turned serious and responsible, lately showing herself capable of true greatness.
Her early life was as a dilettante, rarely entrusted with anything more than short “scripting” tasks. The decisions she made were simple: If a required field was not filled in, she should color it red; if a button was clicked, she should bring another page into view. Although her responsibilities were limited, she was easy to get along with and made many friends. To this day, most programmers' experience of her is primarily of this sort.
Then, in the shift that was to redefine her life, the world turned to the web. This had been her playground, her little place to amuse herself while members of The Old Boys Club did the real work on the server.
The wave started to break in the late 1990s when Microsoft introduced first iframes and then XMLHTTP. When Google made Ajax part of its Gmail application in 2004 and Google Maps in 2005, the wave came crashing down. The world was suddenly aware of just how much richer the web experience could be when the browser was entrusted with more than just displaying whatever the server dispensed.
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!
Lesen Sie weiter in der vollständigen Ausgabe!