Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
xMolecules
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Henning Schwentner
December 01, 2022
Programming
280
3
Share
xMolecules
Living architecture documentation
Henning Schwentner
December 01, 2022
More Decks by Henning Schwentner
See All by Henning Schwentner
Event Storming
hschwentner
3
1.3k
Software Architecture
hschwentner
6
2.5k
Model Pollution
hschwentner
1
280
Domain-Driven Design (Tutorial)
hschwentner
13
22k
Domain-Driven Transformation
hschwentner
2
2.2k
Value and Record Types
hschwentner
1
1.1k
Domain Storytelling
hschwentner
4
2.9k
UNIX, Linux, and Command Line Basics
hschwentner
0
190
From Legacy to Cloud
hschwentner
0
250
Other Decks in Programming
See All in Programming
エラー処理の温故知新 / history of error handling technic
ryotanakaya
6
1.6k
Vibe NLP for Applied NLP
inesmontani
PRO
0
500
煩雑なSkills管理をSoC(関心の分離)により解決する――関心を分離し、プロンプトを部品として育てるためのOSSを作った話 / Solving Complex Skills Management Through SoC (Separation of Concerns)
nrslib
4
1k
(Re)make Regexp in Ruby: Democratizing internals for the JIT
makenowjust
3
720
PHP で mp3 プレイヤーを実装しよう
m3m0r7
PRO
0
290
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
280
GoogleCloudとterraform完全に理解した
terisuke
1
160
ハーネスエンジニアリングとは?
kinopeee
13
6.2k
AIエージェントで業務改善してみた
taku271
0
540
Going Multiplatform with Your Android App (Android Makers 2026)
zsmb
2
450
PHPer、Cloudflare に引っ越す
suguruooki
1
110
Claude CodeでETLジョブ実行テストを自動化してみた
yoshikikasama
0
890
Featured
See All Featured
Designing for Performance
lara
611
70k
The Cost Of JavaScript in 2023
addyosmani
55
9.9k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
200
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
190
SEO for Brand Visibility & Recognition
aleyda
0
4.5k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.9k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
500
Mobile First: as difficult as doing things right
swwweet
225
10k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
180
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
240
Design in an AI World
tapps
1
200
Transcript
Starring Directed By Presented by With
None
None
https://hschwentner.io
@hschwentner
! " # $
@hschwentner
BankAccount withdraw() deposit() Amount
BankAccount withdraw() deposit() Amount
@hschwentner Domain-Driven Design Eric Evans
@hschwentner Entity vs. Value - Identity - Life cycle -
Can be mutable - No identity - Always immutable Contract Map Name Length 12.5 m “John Miller”
Entity Value Object Aggregate Service Factory Repository Tactical Design
«Entity» BankAccount withdraw() deposit() «Value Object» Amount
«stereotype» Value Object «stereotype» Entity ??? «stereotype» Identity
xMolecules
None
Hexagonal Architecture Layerered Architecture Onion Architecture Clean Architecture
@hschwentner How To Express Architecture?
class Account { public void deposit(Amount amount) //... public void
withdraw(Amount amount) //... }
class AccountEntity { public void deposit(Amount amount) //... public void
withdraw(Amount amount) //... }
class Account extends Entity { public void deposit(Amount amount) //...
public void withdraw(Amount amount) //... }
class Account extends Entity<IBAN> { public void deposit(Amount amount) //...
public void withdraw(Amount amount) //... }
import org.jmolecules.ddd.types.Entity; class Account extends Entity<IBAN> { public void deposit(Amount
amount) //... public void withdraw(Amount amount) //... }
@Entity class Account { public void deposit(Amount amount) //... public
void withdraw(Amount amount) //... }
import org.jmolecules.ddd.annotation.Entity; @Entity class Account { public void deposit(Amount amount)
//... public void withdraw(Amount amount) //... }
@hschwentner How To Express Architecture?
class Account { public void deposit(Amount amount) //... public void
withdraw(Amount amount) //... }
class AccountEntity { public void deposit(Amount amount) //... public void
withdraw(Amount amount) //... }
class Account : Entity { public void deposit(Amount amount) //...
public void withdraw(Amount amount) //... }
class Account : Entity<IBAN> { public void deposit(Amount amount) //...
public void withdraw(Amount amount) //... }
using NMolecules.DDD; class Account : Entity<IBAN> { public void deposit(Amount
amount) //... public void withdraw(Amount amount) //... }
[Entity] class Account { public void deposit(Amount amount) //... public
void withdraw(Amount amount) //... }
using NMolecules.DDD; [Entity] class Account { public void deposit(Amount amount)
//... public void withdraw(Amount amount) //... }
[Entity] class Account { [Identity] public IBAN IBAN { get;
} public void deposit(Amount amount) //... public void withdraw(Amount amount) //... }
@hschwentner How To Express Architecture?
class Account { public function deposit(Amount $amount) //... public function
withdraw(Amount $amount) //... }
class AccountEntity { public function deposit(Amount $amount) //... public function
withdraw(Amount $amount) //... }
class Account extends Entity { public function deposit(Amount $amount) //...
public function withdraw(Amount $amount) //... }
/** * @extends Entity<IBAN> */ class Account extends Entity {
public function deposit(Amount $amount) //... public function withdraw(Amount $amount) //... }
use PHPMolecules\DDD\Type\Entity; class Account extends Entity { public function deposit(Amount
$amount) //... public function withdraw(Amount $amount) //... }
#[Entity] class Account { public function deposit(Amount $amount) //... public
function withdraw(Amount $amount) //... }
use PHPMolecules\DDD\Annotation\Entity; #[Entity] class Account { public function deposit(Amount $amount)
//... public function withdraw(Amount $amount) //... }
@hschwentner Why Express Architecture?
Documentation Verification Boilerplate Reduction
@hschwentner Documentation
@hschwentner ! " «Entity» XXX «Value Object» YYY ??
None
@hschwentner Verification
@hschwentner value Architecture Rules entity allowed forbidden
None
@AnalyzeClasses(packagesOf = ArchitectureTests.class) class ArchitectureTests { @ArchTest ArchRule ddd =
JMoleculesDddRules.all(); }
None
PHPStan Psalm Phan PHPArkitect PHPArch
@hschwentner Boilerplate Reduction
@javax.persistence.Entity class BankAccount { /*...*/ } @javax.persistence.???.Embeddable class Amount {
/*...*/ }
@hschwentner jmolecules-bytebuddy jmolecules-jpa jmolecules-spring jmolecules-jackson jmolecules-intellij
@hschwentner Boilerplate Reduction
???
@hschwentner nmolecules-ef nmolecules-roslyn nmolecules-rider
@hschwentner Boilerplate Reduction
/** * @ORM\Entity * @ORM\Table(name="bank_accounts") */ class BankAccount { /**
* @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private IBAN iban; /*...*/ }
@hschwentner phpmolecules-doctrine phpmolecules-symphony phpmolecules-serializer phpmolecules-phpstorm
@hschwentner Installation
<dependency> <groupId>org.jmolecules</groupId> <artifactId>jmolecules-ddd</artifactId> <version>1.4.0</version> </dependency>
@hschwentner Installation
> dotnet add package NMolecules.DDD
// Install NMolecules.DDD as a Cake Addin #addin nuget:?package=NMolecules.DDD&version=0.2.1 //
Install NMolecules.DDD as a Cake Tool #tool nuget:?package=NMolecules.DDD&version=0.2.1
@hschwentner Installation
$ composer require --dev xmolecules/phpmolecules
@hschwentner LeasingNinja.io
None
Bibliography Evans, Eric. Domain-Driven Design: Tackling Complexity in the Heart
of Software. Boston: Addison-Wesley, 2004. Hofer, Stefan and Henning Schwentner. Domain Storytelling: a Collaborative, Visual, and Agile Way to Develop Domain-Driven Software. Boston: Addison-Wesley, 2022.
None
Henning Schwentner ⌂ https://hschwentner.io @hschwentner
[email protected]