The document discusses building rich domain models using domain-driven design (DDD) and test-driven development (TDD). It warns against common anti-patterns when using these approaches, such as starting with the data model or reverse engineering. The document advocates for focusing on domain objects, value objects, entities and aggregates and using TDD to drive the design from tests. It provides examples of modeling customer and account domains using these DDD and TDD techniques.
Domain Driven Design (DDD) is a topic that's been gaining a lot of popularity in both the Java and .NET camps recently. Entities, value types, repositories, bounded contexts and anti-corruption layers -- find out what all the buzz is about, and how establishing a domain model can help you combat complexity in your code.
Richard Dingwall is a .NET developer and blogger with a passion for architecture and maintainable code.
He is currently working at Provoke Solutions as lead developer on a six-month project introducing test-driven development (TDD) and domain-driven design (DDD) to a large ASP.NET ERP system.
An hour-long talk given at Wellington .NET user group, Sept 23 2009.
The domain model is an abstraction of the problem domain that your system supports. It contains the objects and operations that are crucial to your system and its users. Therefore the design of the domain model deserves the utmost care and attention. In this session you will be introduced to Domain-Driven Design and you will learn how to put Domain-Driven Design (DDD) into practice. We will explore how to apply DDD on tactical level to design a rich domain model that encapsulates behaviour, protects its invariants and can be tested in isolation from its runtime environment
Domain Driven Design (DDD) is a topic that's been gaining a lot of popularity in both the Java and .NET camps recently. Entities, value types, repositories, bounded contexts and anti-corruption layers -- find out what all the buzz is about, and how establishing a domain model can help you combat complexity in your code.
Richard Dingwall is a .NET developer and blogger with a passion for architecture and maintainable code.
He is currently working at Provoke Solutions as lead developer on a six-month project introducing test-driven development (TDD) and domain-driven design (DDD) to a large ASP.NET ERP system.
An hour-long talk given at Wellington .NET user group, Sept 23 2009.
The domain model is an abstraction of the problem domain that your system supports. It contains the objects and operations that are crucial to your system and its users. Therefore the design of the domain model deserves the utmost care and attention. In this session you will be introduced to Domain-Driven Design and you will learn how to put Domain-Driven Design (DDD) into practice. We will explore how to apply DDD on tactical level to design a rich domain model that encapsulates behaviour, protects its invariants and can be tested in isolation from its runtime environment
Domain Driven Design main concepts
This presentation is a summary of the book "Domain Driven Design" from InfoQ.
Here is the link: http://www.infoq.com/minibooks/domain-driven-design-quickly
Explain Domain-Driven Design, its main concepts and tools, and the Event Storming practice to highlight the importance of a good design and empower a team to start using it progressively.
Strategic Domain-Driven Design by Nick Tune at #AgileIndia2019Agile India
f you’re a software developer or architect who wants to play a more influential role in ensuring your software systems are optimised to support business goals, then you need to learn about the benefits and techniques of modern strategic domain-driven design.
Many people think that DDD is about software design patterns, but that’s only a small part, and the least important part of DDD. In fact, Eric Evans wishes he’d focused more on the strategic aspects of DDD in his famous book (Domain-Driven Design: Tackling Complexity in the Heart of Software) and pushed the tactical coding patterns to the back!
Strategic domain-driven design is about truly understanding the business domain. It involves collaboratively modelling business processes using advanced modelling techniques, like Event Storming and Domain Storytelling, with domain experts on an ongoing basis.
One of the core outcomes of strategic DDD is identifying cohesive modules, known as bounded context. Bounded contexts help you to create a maintainable, comprehensible codebase by isolating dependencies and delineating concepts that reference different classes of business value.
In this talk, you’ll see many of the most effective bounded context design heuristics, recurring patterns in the wild, and you’ll learn how to facilitate those vital modelling sessions so you can lead the adoption of strategic DDD in your organisation.
More details:
https://confengine.com/agile-india-2019/proposal/8100/strategic-domain-driven-design
Conference link: https://2019.agileindia.org
Domain Driven Design - Strategic Patterns and MicroservicesRadosław Maziarka
Presentation describes Domain Driven Design - approach to create applications driven by business domain. I show how to split your monolith base on DDD strategic patterns.
A Practical Guide to Domain Driven Design: Presentation Slidesthinkddd
Tonight I presented on Domain Driven Design to the Alt.Net group in Sydney at the invite of Richard Banks.
As a follow up, attached are the slides I used, feel free to distribute and use on the Creative Commons Licence
Clean architecture - Protecting the DomainVictor Rentea
The goal of architecture is to simplify the most complex parts of your logic. Any other goal should be secondary to this. The problem is that you can’t always anticipate where the complexity of your application will accumulate, especially when confronted with ever-changing requirements. The only way to keep your code simple is to gradually evolve the architecture without adding useless complexity up front, but always looking out for opportunities to break-down and refactor towards the most simple design that solves the problem. Drawing concepts from the Domain-Driven Development mindset, this talk summarizes the most important lessons learned designing and consulting many real-world projects. Along the way, you’ll hear about Value Objects and Entities, DTOs, Dependency Inversion Principle, Facades, the Onion Architecture and many pragmatic tips and tricks immediately applicable to your day-to-day work.
Domain Driven Design main concepts
This presentation is a summary of the book "Domain Driven Design" from InfoQ.
Here is the link: http://www.infoq.com/minibooks/domain-driven-design-quickly
Explain Domain-Driven Design, its main concepts and tools, and the Event Storming practice to highlight the importance of a good design and empower a team to start using it progressively.
Strategic Domain-Driven Design by Nick Tune at #AgileIndia2019Agile India
f you’re a software developer or architect who wants to play a more influential role in ensuring your software systems are optimised to support business goals, then you need to learn about the benefits and techniques of modern strategic domain-driven design.
Many people think that DDD is about software design patterns, but that’s only a small part, and the least important part of DDD. In fact, Eric Evans wishes he’d focused more on the strategic aspects of DDD in his famous book (Domain-Driven Design: Tackling Complexity in the Heart of Software) and pushed the tactical coding patterns to the back!
Strategic domain-driven design is about truly understanding the business domain. It involves collaboratively modelling business processes using advanced modelling techniques, like Event Storming and Domain Storytelling, with domain experts on an ongoing basis.
One of the core outcomes of strategic DDD is identifying cohesive modules, known as bounded context. Bounded contexts help you to create a maintainable, comprehensible codebase by isolating dependencies and delineating concepts that reference different classes of business value.
In this talk, you’ll see many of the most effective bounded context design heuristics, recurring patterns in the wild, and you’ll learn how to facilitate those vital modelling sessions so you can lead the adoption of strategic DDD in your organisation.
More details:
https://confengine.com/agile-india-2019/proposal/8100/strategic-domain-driven-design
Conference link: https://2019.agileindia.org
Domain Driven Design - Strategic Patterns and MicroservicesRadosław Maziarka
Presentation describes Domain Driven Design - approach to create applications driven by business domain. I show how to split your monolith base on DDD strategic patterns.
A Practical Guide to Domain Driven Design: Presentation Slidesthinkddd
Tonight I presented on Domain Driven Design to the Alt.Net group in Sydney at the invite of Richard Banks.
As a follow up, attached are the slides I used, feel free to distribute and use on the Creative Commons Licence
Clean architecture - Protecting the DomainVictor Rentea
The goal of architecture is to simplify the most complex parts of your logic. Any other goal should be secondary to this. The problem is that you can’t always anticipate where the complexity of your application will accumulate, especially when confronted with ever-changing requirements. The only way to keep your code simple is to gradually evolve the architecture without adding useless complexity up front, but always looking out for opportunities to break-down and refactor towards the most simple design that solves the problem. Drawing concepts from the Domain-Driven Development mindset, this talk summarizes the most important lessons learned designing and consulting many real-world projects. Along the way, you’ll hear about Value Objects and Entities, DTOs, Dependency Inversion Principle, Facades, the Onion Architecture and many pragmatic tips and tricks immediately applicable to your day-to-day work.
Improving the Quality of Existing Software - DevIntersection April 2016Steven Smith
How do you improve the quality of your existing software, while continuing to add value for your customers? What are some heuristics and code smells you can look for, and principles and patterns you can use to guide you, as you make your software better over time instead of worse? How can we improve our skills and techniques so that writing high quality software becomes our default, fastest way of working?
How Custom is your Org? CEER at Dreamforce 2019Steven Herod
We often hear the advice of 'Clicks, not Code' and '80% Config vs 20% Code'. Orgs are described, without a frame of reference as being 'very custom'. However, there is no generally accepted definition on how to calculate customization of an org. Assumptions about code brought from other platforms are being misapplied to Salesforce to the detriment of customers and end-users. This presentation suggests a framework called 'CEER (Config / Extend / Enhance / Replace). This framework breaks the dichotomy of code vs clicks and replaces it with an approach that reflects the true nature of a salesforce solution. It highlights low vs high-risk activities such as Custom Object vs Building a collaboration platform. It also allows you to understand how Managed Packages impact your solution. The result is the ability to describe your org in terms of real effort/outcome basis. Allow you to make statements like "30% of your overall solution and 70% of your effort was expending on replacing standard Salesforce functions."
https://www.salesforce.com/video/7810482/
Improving the Quality of Existing SoftwareSteven Smith
How do you improve the quality of your existing software, while continuing to add value for your customers? What are some heuristics and code smells you can look for, and principles and patterns you can use to guide you, as you make your software better over time instead of worse?
Trends in software testing by Eka TechServekatechserv
Eka TechServ is a software services company founded by Dr. Prakash Mutalik who is often regarded as a “Guru” in software testing. Eka TechServ comes with over decades of experience in the testing industry and has been established with an intent to serve the industry with its expertise. Eka TechServ provides its services in the areas of software testing and knowledge management and focuses mainly on the SME segment in the market.
An architect’s job is to reduce complexity, not increase it. Yet the developer life is filled with jargon, acronyms, and seemingly infinite choices. So how do we know when complexity makes sense? We’ll learn when abstractions are justified and discuss how to structure applications so they’re maintainable, scalable, and testable.
We’ll make sure everyone is comfy with the core jargon like N-Teir, separation of concerns, and loose coupling. Then we’ll dive into various patterns for implementing the three common layers: data access, business logic, and presentation. You’ll learn when table module, active record, DDD, and ORMs make sense and walk away with the tools to better evaluate and justify complexity. We’ll focus on the value of keeping things simple whenever we can. Examples are presented in C# in Visual Studio but developers in Java, PHP, and other C-like languages should be able to follow right along.
Neoito — Design patterns and depenedency injectionNeoito
Dependency injection is a software design pattern that allows someone to remove hard-coded dependencies and makes it possible to change them. Dependencies can be injected to the object via the constructor or via defined method or a setter property.
Faiz Mohamed Haneef is currently the CEO and Chief Technology Architect at Neoito. He's a former Architect at Lowe's, Hallmark and Infosys.
Improving The Quality of Existing SoftwareSteven Smith
Presented at DevReach 2013.
As developers, most of our time is spent working on existing software. Sure, occasionally we get the chance to fire up a new Solution in Visual Studio, and that can be exciting. But after the first day, we find ourselves once more having to deal with the work we did yesterday. And today, we know more than we did yesterday, so there are things we’d do differently, if we had it to do over.
Over time, software rots. If we’re not diligent, our beautiful code can degrade into a worthless mess. Keeping our code in working condition is no different than changing the oil in our car – it’s preventive maintenance. In this session, Steve will look at some common places to look for signs of degradation in existing applications, and steps to take to improve the code. Examples will use C# and primarily ASP.NET.
Building Cloud-Native App Series - Part 1 of 11
Microservices Architecture Series
Design Thinking, Lean Startup, Agile (Kanban, Scrum),
User Stories, Domain-Driven Design
Managing an Experimentation Platform by LinkedIn Product LeaderProduct School
Main Takeaways:
-Establishing a culture of experimentation at scale
-Developing the product vision and strategy
-Backlog prioritization based on Impact Score formula
Similar to Building rich domain models with ddd and tdd ivan paulovich - betsson (20)
Clean Architecture Essentials - Stockholm Software CraftsmanshipIvan Paulovich
About the talk:
Software Architecture is not about picking frameworks then gluing the pieces together! Let's dig into a software implementation designed to support the use cases, we will learn how to make the use cases a standalone component and see how a good architecture allows major decisions to be deferred. We will discuss component coupling and cohesion during the development timeline. Is your application architecture a Web Application? Are your tests taking too long to run? You will learn how to make the delivery mechanism an irrelevant and testable detail.
About the speaker:
Ivan Paulovich is an Agile .NET developer that enjoy solutions based on use cases and decoupled from technology details. Active on GitHub he supports OSS about Domain-Driven Design, TDD, Event Sourcing, CQRS, SOLID and Microservices. Microsoft MVP Reconnect. Checkout @ivanpaulovich on GitHub.
Software Architecture is not about picking frameworks and then gluing the pieces together! Let's dig into a software implementation designed to support the use cases, we will learn how to make the use cases a standalone component and see how a good architecture allows major decisions to be deferred. We will discuss component coupling and cohesion during the development timeline. Is your application architecture a Web API? Are your tests taking too long to run? You will learn how to make the delivery mechanism an irrelevant and testable detail.
Como uma aplicação baseada em fluxo de dados pode ampliar a segurança em crec...Ivan Paulovich
Investiga uma solução tecnológica para ampliar a segurança em creches e instituições de educação infantil. Realiza uma pesquisa de mercado sobre a sensação de segurança dos usuários dessas instituições. Avalia um sistema de armazenamento baseado em fluxo de dados (Kafka), propõe uma arquitetura baseada em Event Sourcing, CQRS e Domain-Driven-Design (DDD) e sugere uma implementação seguindo os princípios do desenvolvimento de microsserviços usando C# e ASP.NET Core.
Como uma aplicação baseada em fluxo de dados pode ampliar a segurança em crechesIvan Paulovich
Investiga uma solução tecnológica para ampliar a segurança em creches e instituições de educação infantil. Realiza uma pesquisa de mercado sobre a sensação de segurança dos usuários dessas instituições. Avalia um sistema de armazenamento baseado em fluxo de dados (Kafka), propõe uma arquitetura baseada em Event Sourcing, CQRS e Domain-Driven-Design (DDD) e sugere uma implementação seguindo os princípios do desenvolvimento de microsserviços usando C# e ASP.NET Core.
Domain-Driven-Design com implementação de Aggregates + Event Sourcing + CQRS + Optimistic Concurrency.
A técnica de Event Sourcing é usada como ferramenta de auditoria das modificações do conteúdo do Blog.
A fonte dos dados são os Domain Events registrados no Kafka e para permitir consultas de alta performance foi criado um banco de dados MongoDB com o 'último estado já processado dos eventos'.
Há um microsserviço auxiliar de autenticação. Tudo isso foi implementado em .NET Core/Standard 2.0 compatível com Docker!
Utilize o vso e publique imagens docker Global Azure Bootcamp - BHIvan Paulovich
Como utilizar o Visual Studio Online para realizar a Integração Contínua, Entrega Contínua e Implantação Contínua (CI/CD) e utilizando a infra do Azure, Docker e .NET Core.
Veja os scripts e códigos no GitHub https://github.com/ivanpaulovich/azure-bootcamp
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Crescat
Crescat is industry-trusted event management software, built by event professionals for event professionals. Founded in 2017, we have three key products tailored for the live event industry.
Crescat Event for concert promoters and event agencies. Crescat Venue for music venues, conference centers, wedding venues, concert halls and more. And Crescat Festival for festivals, conferences and complex events.
With a wide range of popular features such as event scheduling, shift management, volunteer and crew coordination, artist booking and much more, Crescat is designed for customisation and ease-of-use.
Over 125,000 events have been planned in Crescat and with hundreds of customers of all shapes and sizes, from boutique event agencies through to international concert promoters, Crescat is rigged for success. What's more, we highly value feedback from our users and we are constantly improving our software with updates, new features and improvements.
If you plan events, run a venue or produce festivals and you're looking for ways to make your life easier, then we have a solution for you. Try our software for free or schedule a no-obligation demo with one of our product specialists today at crescat.io
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxrickgrimesss22
Discover the essential features to incorporate in your Winzo clone app to boost business growth, enhance user engagement, and drive revenue. Learn how to create a compelling gaming experience that stands out in the competitive market.
What is Augmented Reality Image Trackingpavan998932
Augmented Reality (AR) Image Tracking is a technology that enables AR applications to recognize and track images in the real world, overlaying digital content onto them. This enhances the user's interaction with their environment by providing additional information and interactive elements directly tied to physical images.
Transform Your Communication with Cloud-Based IVR SolutionsTheSMSPoint
Discover the power of Cloud-Based IVR Solutions to streamline communication processes. Embrace scalability and cost-efficiency while enhancing customer experiences with features like automated call routing and voice recognition. Accessible from anywhere, these solutions integrate seamlessly with existing systems, providing real-time analytics for continuous improvement. Revolutionize your communication strategy today with Cloud-Based IVR Solutions. Learn more at: https://thesmspoint.com/channel/cloud-telephony
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Mind IT Systems
Healthcare providers often struggle with the complexities of chronic conditions and remote patient monitoring, as each patient requires personalized care and ongoing monitoring. Off-the-shelf solutions may not meet these diverse needs, leading to inefficiencies and gaps in care. It’s here, custom healthcare software offers a tailored solution, ensuring improved care and effectiveness.
Utilocate offers a comprehensive solution for locate ticket management by automating and streamlining the entire process. By integrating with Geospatial Information Systems (GIS), it provides accurate mapping and visualization of utility locations, enhancing decision-making and reducing the risk of errors. The system's advanced data analytics tools help identify trends, predict potential issues, and optimize resource allocation, making the locate ticket management process smarter and more efficient. Additionally, automated ticket management ensures consistency and reduces human error, while real-time notifications keep all relevant personnel informed and ready to respond promptly.
The system's ability to streamline workflows and automate ticket routing significantly reduces the time taken to process each ticket, making the process faster and more efficient. Mobile access allows field technicians to update ticket information on the go, ensuring that the latest information is always available and accelerating the locate process. Overall, Utilocate not only enhances the efficiency and accuracy of locate ticket management but also improves safety by minimizing the risk of utility damage through precise and timely locates.
May Marketo Masterclass, London MUG May 22 2024.pdfAdele Miller
Can't make Adobe Summit in Vegas? No sweat because the EMEA Marketo Engage Champions are coming to London to share their Summit sessions, insights and more!
This is a MUG with a twist you don't want to miss.
Quarkus Hidden and Forbidden ExtensionsMax Andersen
Quarkus has a vast extension ecosystem and is known for its subsonic and subatomic feature set. Some of these features are not as well known, and some extensions are less talked about, but that does not make them less interesting - quite the opposite.
Come join this talk to see some tips and tricks for using Quarkus and some of the lesser known features, extensions and development techniques.
OpenMetadata Community Meeting - 5th June 2024OpenMetadata
The OpenMetadata Community Meeting was held on June 5th, 2024. In this meeting, we discussed about the data quality capabilities that are integrated with the Incident Manager, providing a complete solution to handle your data observability needs. Watch the end-to-end demo of the data quality features.
* How to run your own data quality framework
* What is the performance impact of running data quality frameworks
* How to run the test cases in your own ETL pipelines
* How the Incident Manager is integrated
* Get notified with alerts when test cases fail
Watch the meeting recording here - https://www.youtube.com/watch?v=UbNOje0kf6E
Atelier - Innover avec l’IA Générative et les graphes de connaissancesNeo4j
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Allez au-delà du battage médiatique autour de l’IA et découvrez des techniques pratiques pour utiliser l’IA de manière responsable à travers les données de votre organisation. Explorez comment utiliser les graphes de connaissances pour augmenter la précision, la transparence et la capacité d’explication dans les systèmes d’IA générative. Vous partirez avec une expérience pratique combinant les relations entre les données et les LLM pour apporter du contexte spécifique à votre domaine et améliorer votre raisonnement.
Amenez votre ordinateur portable et nous vous guiderons sur la mise en place de votre propre pile d’IA générative, en vous fournissant des exemples pratiques et codés pour démarrer en quelques minutes.
Do you want Software for your Business? Visit Deuglo
Deuglo has top Software Developers in India. They are experts in software development and help design and create custom Software solutions.
Deuglo follows seven steps methods for delivering their services to their customers. They called it the Software development life cycle process (SDLC).
Requirement — Collecting the Requirements is the first Phase in the SSLC process.
Feasibility Study — after completing the requirement process they move to the design phase.
Design — in this phase, they start designing the software.
Coding — when designing is completed, the developers start coding for the software.
Testing — in this phase when the coding of the software is done the testing team will start testing.
Installation — after completion of testing, the application opens to the live server and launches!
Maintenance — after completing the software development, customers start using the software.
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeAftab Hussain
Understanding variable roles in code has been found to be helpful by students
in learning programming -- could variable roles help deep neural models in
performing coding tasks? We do an exploratory study.
- These are slides of the talk given at InteNSE'23: The 1st International Workshop on Interpretability and Robustness in Neural Software Engineering, co-located with the 45th International Conference on Software Engineering, ICSE 2023, Melbourne Australia
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Łukasz Chruściel
No one wants their application to drag like a car stuck in the slow lane! Yet it’s all too common to encounter bumpy, pothole-filled solutions that slow the speed of any application. Symfony apps are not an exception.
In this talk, I will take you for a spin around the performance racetrack. We’ll explore common pitfalls - those hidden potholes on your application that can cause unexpected slowdowns. Learn how to spot these performance bumps early, and more importantly, how to navigate around them to keep your application running at top speed.
We will focus in particular on tuning your engine at the application level, making the right adjustments to ensure that your system responds like a well-oiled, high-performance race car.
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppGoogle
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
👉👉 Click Here To Get More Info 👇👇
https://sumonreview.com/ai-fusion-buddy-review
AI Fusion Buddy Review: Key Features
✅Create Stunning AI App Suite Fully Powered By Google's Latest AI technology, Gemini
✅Use Gemini to Build high-converting Converting Sales Video Scripts, ad copies, Trending Articles, blogs, etc.100% unique!
✅Create Ultra-HD graphics with a single keyword or phrase that commands 10x eyeballs!
✅Fully automated AI articles bulk generation!
✅Auto-post or schedule stunning AI content across all your accounts at once—WordPress, Facebook, LinkedIn, Blogger, and more.
✅With one keyword or URL, generate complete websites, landing pages, and more…
✅Automatically create & sell AI content, graphics, websites, landing pages, & all that gets you paid non-stop 24*7.
✅Pre-built High-Converting 100+ website Templates and 2000+ graphic templates logos, banners, and thumbnail images in Trending Niches.
✅Say goodbye to wasting time logging into multiple Chat GPT & AI Apps once & for all!
✅Save over $5000 per year and kick out dependency on third parties completely!
✅Brand New App: Not available anywhere else!
✅ Beginner-friendly!
✅ZERO upfront cost or any extra expenses
✅Risk-Free: 30-Day Money-Back Guarantee!
✅Commercial License included!
See My Other Reviews Article:
(1) AI Genie Review: https://sumonreview.com/ai-genie-review
(2) SocioWave Review: https://sumonreview.com/sociowave-review
(3) AI Partner & Profit Review: https://sumonreview.com/ai-partner-profit-review
(4) AI Ebook Suite Review: https://sumonreview.com/ai-ebook-suite-review
#AIFusionBuddyReview,
#AIFusionBuddyFeatures,
#AIFusionBuddyPricing,
#AIFusionBuddyProsandCons,
#AIFusionBuddyTutorial,
#AIFusionBuddyUserExperience
#AIFusionBuddyforBeginners,
#AIFusionBuddyBenefits,
#AIFusionBuddyComparison,
#AIFusionBuddyInstallation,
#AIFusionBuddyRefundPolicy,
#AIFusionBuddyDemo,
#AIFusionBuddyMaintenanceFees,
#AIFusionBuddyNewbieFriendly,
#WhatIsAIFusionBuddy?,
#HowDoesAIFusionBuddyWorks
Launch Your Streaming Platforms in MinutesRoshan Dwivedi
The claim of launching a streaming platform in minutes might be a bit of an exaggeration, but there are services that can significantly streamline the process. Here's a breakdown:
Pros of Speedy Streaming Platform Launch Services:
No coding required: These services often use drag-and-drop interfaces or pre-built templates, eliminating the need for programming knowledge.
Faster setup: Compared to building from scratch, these platforms can get you up and running much quicker.
All-in-one solutions: Many services offer features like content management systems (CMS), video players, and monetization tools, reducing the need for multiple integrations.
Things to Consider:
Limited customization: These platforms may offer less flexibility in design and functionality compared to custom-built solutions.
Scalability: As your audience grows, you might need to upgrade to a more robust platform or encounter limitations with the "quick launch" option.
Features: Carefully evaluate which features are included and if they meet your specific needs (e.g., live streaming, subscription options).
Examples of Services for Launching Streaming Platforms:
Muvi [muvi com]
Uscreen [usencreen tv]
Alternatives to Consider:
Existing Streaming platforms: Platforms like YouTube or Twitch might be suitable for basic streaming needs, though monetization options might be limited.
Custom Development: While more time-consuming, custom development offers the most control and flexibility for your platform.
Overall, launching a streaming platform in minutes might not be entirely realistic, but these services can significantly speed up the process compared to building from scratch. Carefully consider your needs and budget when choosing the best option for you.
Building rich domain models with ddd and tdd ivan paulovich - betsson
1. Building Rich
Domain Models
with DDD and TDD
ivan.paulovich@betssongroup.comhttps://paulovich.net
Ivan Paulovich
Betsson Dev'talk #3
Stockholm – September 12th, 2018
@ivanpaulovich
3. Betsson Wallet Team
• Seniors Developers
• Agile Team
• Business Oriented
• .NET – SQL Server – Angular
• Stockholm Office
• We are hiring!
4. How to shoot yourself in the foot:
1. Design your application starting from the data model.
2. Create your domain model by reverse engineering.
3. Pretend that you’re doing TDD and start testing your domain
classes.
• Particularly getters and setters.
4. Now start testing the logic with Integration Tests and get stuck by
test data and related issues.
5. Declare that TDD provides no benefit and only slows you down.
6. Comment tests in your Continuous Integration process.
7. Keep on whining.
Alberto Brandolini
04/59
5. Domain-Driven
Design
Tiny Domain Objects
Exploratory Programming
Focus on Unit Tests
Frequent Short Cycles
Quick Feedback
Self Explanatory Coding
Frequent Rewriting
Confidence to Change
Test-Driven
Development
05/59
7. Primitive Obsession Leads to Services Like..
• Needs to verify for required parameters,
Data Format and Data Range.
• Services are unnecessary Big and Fat.
• Easy to confuse one parameter with the
another.
07/59
8. • Not a technology.
• Not a methodology.
• Set of principles and patterns for focusing
the design effort where it matters most.
08/59
10. Business Rules Enforced Through Value Objects
• The simple existence of a Value Object means that it is valid.
• No need to verify parameters values on every method.
• Services are thinner and smaller when using Value Objets.
10/59
11. DDD express the Model with
Value Objects, Entities and Services.
Some Entities act as root of Aggregates.
11/59
12. An Example with Some Use Cases
• A customer can register a new account using its
personal details.
• Allow a customer to deposit funds into an existing
account.
• Allow to withdraw from an existing account.
• Do not allow to withdraw more than the current
balance.
12/59
14. Some Noums and Verbs are Useful
• A customer can register a new account using its
personal details.
• Allow a customer to deposit funds into an
existing account.
• Allow to withdraw from an existing account.
• Do not allow to withdraw more than the current
balance.
14/59
17. Customer
Account
Credit
First Name
Last Name
Opening Date
Personnummer
Debit
Amount
Transaction
Date
Description
Tactical-Design
Mobile Phone
Number
Personal Expenses
Bounded Context
Amount
Transaction
Date
Description
17/59
18. Domain Model
Terms
Names of
Bounded Contexts
Terminology of Large-scale
Structures
DDD Patterns
Names
Business Terms
Developers Don’t
Understand
Business Terms
Everyone Uses
That Don’t Appear
in Design
Technical Aspects
of Design
Technical
Terms
Technical Design
Patterns
Developers Domain Experts
Ubiquitous
Language
18/59
19. Entities
• Have a unique identity.
• Are mutable or not.
• Refer others entities by their IDs.
19/59
20. Aggregate Roots (Are Entities)
• Refer other aggregates by identity only.
• Scope of consistency inside the aggregate boundaries.
• Eventual consistency between aggregates.
• Aggregates are small.
• Aggregates implement behaviors.
• Entity + Repository ~ Aggregate
• One Aggregate Root for every Entity is a Code Smell.
20/59
26. Account Aggregate Root
It is an Entity
Only mandatory fields are
required in the constructor
Implements behaviors which maintain
the state consistent.
26/59
27. Account Aggregate Root
It is an Entity
Factory method to restore state.
Only mandatory fields are
required in the constructor
Implements behaviors which maintain
the state consistent.
27/59
28. Value Objects
• Immutable.
• Have no explicit identity.
• Unique by the comparison of the attributes.
• Used to describe, measure or quantify an Entity.
First Name Last Name
Personnummer
Mobile Phone
Number
Amount Description
28/59
32. .NET
Bounded Context
Thread
Personal Expenses
Bounded Context
.NET
Bounded Context
Personal Expenses
Bounded Context
We only pay for the complexity
we really use
string
Phone Number
Thread
nullstring int
Reflection
double
collection
HttpClient
Without Value Objects With Value Objects
We bring the .NET Framework Complexity
into our Bounded Context.
nullint
Reflection
double
collection
HttpClient
32/59
34. First-Class Collections
• Each collection should be wrapped in its own class¹.
• Classes that contains collections do not contains any other
variable.
• Behaviors have a home.
• When necessary return immutable collection copies.
Account Transaction1:N
¹The ThoughtWorks Anthology: Essays on Software Technology and Innovation (Pragmatic Programmers), 2008
34/59
37. How to Use the TransactionCollection Class
37/59
38. How to Use the TransactionCollection Class
The GetBalance() implementation belongs to
the TransactionCollection class.
38/59
39. How to Use the TransactionCollection Class
The GetBalance() implementation belongs to
the TransactionCollection class.
Composite simpler than
the sum of its parts
39/59
40. Write a failing
acceptance test
Write a
failing
unit test
Make the
test pass
Refactor
Inner and outer feedback loops in TDD
40/59
48. Opinionated DDD/TDD
• Sometimes I implement too much of the Domain Model. Then
return covering it with unit tests.
• By knowing the DDD patterns I underestimate the TDD value then
I'm slapped in the face.
• My goal is to maintain a high test coverage on the Domain
Model.
• If testing is hard. It is an architectural issue!
48/59
49. I won’t reverse engineer my
data model to create a
domain model.
49/59
55. Outside In
Controllers > Use Cases > Aggregates > Value Objects
Inside Out
1. Aggregates > Value Objects
2. Use Cases
3. Controllers
Testing Strategies
55/59
59. Resources
• Domain-driven Design, Eric J. Evans, 2003
• The ThoughtWorks Anthology: Essays on Software Technology
and Innovation (Pragmatic Programmers), 2008
• Clean Architecture, Robert C. Martin, 2017
• Growing Object-Oriented Software, Guided by Tests, 1st
Edition, 2009
• Secure by Design, Dan Bergh Johnsson, Daniel Deogun, Daniel
Sawano, 2018
• Domain-Driven Design Quickly, 2007
• Effective Aggregate Design, Vaughn Vernon, 2011
59/59
Editor's Notes
Thank you for joining the Betsson Meetup.
I am going to talk about Domain-Driven Design and Test-Driven Development.
First let me introduce myself, I am Ivan Paulovich and I moved to Stockholm earlier this year to be a Developer for Betsson. I used to be an MVP in asp.net for a few years and now I am in the MVP Reconnect Program.
My background is Development, Architecture and Cloud and I earned few Microsoft Certifications in these areas.
I support the Paulovich.net blog and I am active in GitHub.
I work with those guys, we are team of seniors developers following agile practices and we deliver the features the business wants.
Our tech stack is .NET, SQL Server and Angular.
If you are open to discuss opportunities we are hiring! Try to talk with HR and those developers.
Let’s begin with a sad and common story that I copied from Alberto Brandolini. Its about designing the software from the data model using reverse engineering to make the Domain Model fit within the Data Model.
And by pretending doing TDD testing getters and setters. Doing integration tests and get stuck by test data and related issues.
Disappointing about TDD benefits and removing tests from the CI.
Fortunately we move to a more happier story where Domain-Driven Design and Test-Driven Development work together.
Alone this topics are huge and I will explain how they can be used together.
On one side DDD provides this Tiny Domain Objects, Exploratory Programming.. On the other side TDD with Unit Tests, short cycles and confidence to change.
Both target a Self Explanatory Coding, Quick feedback and Rewriting.
My strategy is to talk is to introduce DDD and bit by bit talk about TDD.
Let’s explicit the problem:
This is a Customer Entity, all the properties are strings. It does not have methods and all data are exposed as public.
The previous class leads to Services like this, if wanna register a Customer the service receive string parameters that we need to verify for data range, format and what is mandatory or not.
Usually it became unecessary big and fat also it is easy to confuse one parameter with another.
Then we are enlightened with DDD. Which is not a technology, not a methodology. It is a set os principles and patterns for focus the design effort where it matters.
I could replace the string properties with specialized classes that we call Value Objects, this tiny classes enforces the smallest business rules.
And it leads to thinner Services, that do not require to validate the arguments of every method. The simple existence of a Value Object means that it is valid.
A quick tip about services is that they do not have state.
DDD express the Model with Value Objects, Entities and Services.. Some Entities are Aggregate Roots. At this moment it is not clear.
So.. I will explain using Use Cases.
A Customer can register a new account then deposit and withdraw funds. The customer can not withdraw more that the current balance.
This table make the use cases clear.
A customer can have multiple accounts, each account has a transaction history and we can get the balance any time.
The previous use cases are useful to identify some noums and verbs. It helps do draw the initial Design.
This figure is another representation the Domain.
In blue the Entities and in green the Value Objects that describe the entities.
The Customer and Account perform the Aggregate Root role, I am going to explain soon.
And of course, this structures are only valid inside the Personal Expenses Bounded Context.
The fundamentals of DDD is to build an Ubiquitous Language, this is the vocabulary that is shared between Developers and Domain Experts.
Developers have jargons, they know technical stuff. And Domain Experts focus in the Business.
There are some terms that both should know to create a shared language.
The Domain Model Terms, Bounded Contexts, DDD pattterns names and high level structures.
Everything else are not ubiquitous.
The entity pattern requires that every entity has an unique id. The entity could be mutable or not, and they refer other entities by ID. In our example the Customer, Account, Credit and Debit are Entities.
An Aggregate Root is a specialized Entity that control the scope of consistency inside the aggregate boundaries. Usually the aggregate root is a bunch of entities that are seen as one single unit.
The aggregates are small, they implement behaviors with methods.
And I advance that one entity plus one repository pattern are close to an Aggregate.
Another way to explain the Aggregate Pattern, is by what it is not.
The aggregate is not your Entire Model, the same way as this bunch of grapes that we can not identify the boundaries.
Aggregate Roots are small as this bunch of grapes that we can see the boundaries. This way it is possible to maitain the consistency of the business rules.
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
it simple do not exist if invalid
If you're calling two setters in a row, you're missing a concept.
Don't get trapped by datastore thinking.
DDD and TDD are tools, seniors developers need to know.