Software architecture with c++ design modern systems using effective architecture concepts, design patterns and techniques with c++20
Apply business requirements to IT infrastructure and deliver a high-quality product by understanding architectures such as microservices, DevOps, and cloud-native using modern C++ standards and featuresKey FeaturesDesign scalable large-scale applications with the C++ programming languageArchitect so...
Otros Autores: | , |
---|---|
Formato: | Libro electrónico |
Idioma: | Inglés |
Publicado: |
Birmingham, England :
Packt Publishing, Limited
[2021]
|
Materias: | |
Ver en Biblioteca Universitat Ramon Llull: | https://discovery.url.edu/permalink/34CSUC_URL/1im36ta/alma991009631685806719 |
Tabla de Contenidos:
- Cover
- Title Page
- Copyrights
- Dedication
- Contributors
- Table of Contents
- Preface
- Section 1: Concepts and Components of Software Architecture
- Chapter 1: Importance of Software Architecture and Principles of Great Design
- Technical requirements
- Understanding software architecture
- Different ways to look at architecture
- Learning the importance of proper architecture
- Software decay
- Accidental architecture
- Exploring the fundamentals of good architecture
- Architecture context
- Stakeholders
- Business and technical environments
- Developing architecture using Agile principles
- Domain-driven design
- The philosophy of C++
- Following the SOLID and DRY principles
- Single responsibility principle
- Open-closed principle
- Liskov substitution principle
- Interface segregation principle
- Dependency inversion principle
- The DRY rule
- Coupling and cohesion
- Coupling
- Cohesion
- Summary
- Questions
- Further reading
- Chapter 2: Architectural Styles
- Technical requirements
- Deciding between stateful and stateless approaches
- Stateless and stateful services
- Understanding monoliths-why they should be avoided, and recognizing exceptions
- Understanding services and microservices
- Microservices
- Benefits and disadvantages of microservices
- Characteristics of microservices
- Microservices and other architectural styles
- Scaling microservices
- Transitioning to microservices
- Exploring event-based architecture
- Common event-based topologies
- Event sourcing
- Understanding layered architecture
- Backends for Frontends
- Learning module-based architecture
- Summary
- Questions
- Further reading
- Chapter 3: Functional and Nonfunctional Requirements
- Technical requirements documentation from sources, you must have
- Understanding the types of requirements.
- Functional requirements
- Nonfunctional requirements
- Quality attributes
- Constraints
- Recognizing architecturally significant requirements
- Indicators of architectural significance
- Hindrances in recognizing ASRs and how to deal with them
- Gathering requirements from various sources
- Knowing the context
- Knowing existing documentation
- Knowing your stakeholders
- Gathering requirements from stakeholders
- Documenting requirements
- Documenting the context
- Documenting the scope
- Documenting functional requirements
- Documenting nonfunctional requirements
- Managing the version history of your documentation
- Documenting requirements in Agile projects
- Other sections
- Documenting architecture
- Understanding the 4+1 model
- Understanding the C4 model
- Documenting architecture in Agile projects
- Choosing the right views to document
- Functional view
- Information view
- Concurrency view
- Development view
- Deployment and operational views
- Generating documentation
- Generating requirements documentation
- Generating diagrams from code
- Generating (API) documentation from code
- Summary
- Questions
- Further reading
- Section 2: The Design and Development of C++ Software
- Chapter 4: Architectural and System Design
- Technical requirements
- Understanding the peculiarities of distributed systems
- Different service models and when to use them
- On-premises model
- Infrastructure as a Service (IaaS) model
- Platform as a Service (PaaS) model
- Software as a Service (SaaS) model
- Function as a Service (FaaS) model and serverless architecture
- Avoiding the fallacies of distributed computing
- The network is reliable
- Latency is zero
- Bandwidth is infinite
- The network is secure
- Topology doesn't change
- There is one administrator
- Transport cost is zero.
- The network is homogeneous
- CAP theorem and eventual consistency
- Sagas and compensating transactions
- Choreography-based sagas
- Orchestration-based sagas
- Making your system fault tolerant and available
- Calculating your system's availability
- Building fault-tolerant systems
- Redundancy
- Leader election
- Consensus
- Replication
- Master-slave replication
- Multi-master replication
- Queue-based load leveling
- Back pressure
- Detecting faults
- Sidecar design pattern
- Heartbeat mechanism
- Leaky bucket counter
- Minimizing the impact of faults
- Retrying the call
- Avoiding cascading failures
- Circuit breaker
- Bulkhead
- Geodes
- Integrating your system
- Pipes and filters pattern
- Competing consumers
- Transitioning from legacy systems
- Anti-corruption layer
- Strangler pattern
- Achieving performance at scale
- CQRS and event sourcing
- Command-query responsibility segregation
- Command-query separation
- Event sourcing
- Caching
- Updating caches
- Write-through approach
- Write-behind approach
- Cache-aside
- Deploying your system
- The sidecar pattern
- Deploying a service with tracing and a reverse proxy using Envoy
- Zero-downtime deployments
- Blue-green deployments
- Canary releases
- External configuration store
- Managing your APIs
- API gateways
- Summary
- Questions
- Further reading
- Chapter 5: Leveraging C++ Language Features
- Technical requirements
- Designing great APIs
- Leveraging RAII
- Specifying the interfaces of containers in C++
- Using pointers in interfaces
- Specifying preconditions and postconditions
- Leveraging inline namespaces
- Leveraging std::optional
- Optional function parameters
- Optional function return values
- Optional class members
- Writing declarative code
- Showcasing a featured items gallery
- Introducing standard ranges.
- Reducing memory overhead and increasing performance using ranges
- Moving computations at compile time
- Helping the compiler help you by using const
- Leveraging the power of safe types
- Constraining template parameters
- Writing modular C++
- Summary
- Questions
- Further reading
- Chapter 6: Design Patterns and C++
- Technical requirements
- Writing idiomatic C++
- Automating scope exit actions using RAII guards
- Managing copyability and movability
- Implementing non-copyable types
- Adhering to the rules of three and five
- Adhering to the rule of zero
- Using hidden friends
- Providing exception safety using the copy-and-swap idiom
- Writing niebloids
- Policy-based design idiom
- Curiously recurring template pattern
- Knowing when to use dynamic versus static polymorphism
- Implementing static polymorphism
- Interlude - using type erasure
- Creating objects
- Using factories
- Using factory methods
- Using factory functions
- Choosing the return type of a factory
- Using factory classes
- Using builders
- Building with composites and prototypes
- Tracking state and visiting objects in C++
- Dealing with memory efficiently
- Reducing dynamic allocations using SSO/SOO
- Saving memory by herding COWs
- Leveraging polymorphic allocators
- Using memory arenas
- Using the monotonic memory resource
- Using pool resources
- Writing your own memory resource
- Ensuring there are no unexpected allocations
- Winking out memory
- Summary
- Questions
- Further reading
- Chapter 7: Building and Packaging
- Technical requirements
- Getting the most out of compilers
- Using multiple compilers
- Reducing build times
- Using a fast compiler
- Rethinking templates
- Leveraging tools
- Finding potential code issues
- Using compiler-centric tools
- Abstracting the build process
- Introducing CMake.
- Creating CMake projects
- Distinguishing between CMake directory variables
- Specifying CMake targets
- Specifying the output directories
- Using generator expressions
- Using external modules
- Fetching dependencies
- Using find scripts
- Writing find scripts
- Using the Conan package manager
- Preparing Conan profiles
- Specifying Conan dependencies
- Installing Conan dependencies
- Using Conan targets from CMake
- Adding tests
- Reusing quality code
- Installing
- Exporting
- Using CPack
- Packaging using Conan
- Creating the conanfile.py script
- Testing our Conan package
- Adding Conan packaging code to our CMakeLists
- Summary
- Questions
- Further reading
- Section 3: Architectural Quality Attributes
- Chapter 8: Writing Testable Code
- Technical requirements
- Why do you test code?
- The testing pyramid
- Non-functional testing
- Regression testing
- Root cause analysis
- The groundwork for further improvement
- Introducing testing frameworks
- GTest examples
- Catch2 examples
- CppUnit examples
- Doctest examples
- Testing compile-time code
- Understanding mocks and fakes
- Different test doubles
- Other uses for test doubles
- Writing test doubles
- GoogleMock example
- Trompeloeil example
- Test-driven class design
- When tests and class design clash
- Defensive programming
- The boring refrain - write your tests first
- Automating tests for continuous integration/continuous deployment
- Testing the infrastructure
- Testing with Serverspec
- Testing with Testinfra
- Testing with Goss
- Summary
- Questions
- Further reading
- Chapter 9: Continuous Integration and Continuous Deployment
- Technical requirements
- Understanding CI
- Release early, release often
- Merits of CI
- Gating mechanism
- Implementing the pipeline with GitLab
- Reviewing code changes.
- Automated gating mechanisms.