Clean Architecture â
Clean Architectureã¯ãRobert C. MartinïŒUncle BobïŒã2012å¹Žã«æå±ãããœãããŠã§ã¢ã¢ãŒããã¯ãã£ã®èšèšååã§ãããã®èšèšææ³ã¯ãããžãã¹ã«ãŒã«ããã¬ãŒã ã¯ãŒã¯ãããŒã¿ããŒã¹ãUIãªã©ã®å€éšèŠå ããåé¢ãããã¹ã¿ãã«ã§å€æŽã«åŒ·ãã·ã¹ãã ãæ§ç¯ããããšãç®çãšããŠããŸããæ¬è³ªçã«ã¯ãäŸåæ§ã®æ¹åãå¶åŸ¡ããããšã§ãããžãã¹ããžãã¯ãäžå¿ã«æ®ããã¢ãŒããã¯ãã£ãå®çŸããŸãã
äŸåæ§ã®èŠå â
Clean Architectureã®æ žå¿ã¯ãäŸåæ§ã®èŠåãã«ãããŸãããã®èŠåã¯ããœãŒã¹ã³ãŒãã®äŸåé¢ä¿ã¯å åŽïŒããžãã¹ã«ãŒã«ïŒã«åãã£ãŠã®ã¿èš±å¯ãããå€åŽããå åŽãžã®äŸåã®ã¿ãèš±ããããšãããã®ã§ããã€ãŸããå åŽã®åã¯å€åŽã®åã«ã€ããŠäœãç¥ããªããšããç¶æ ãä¿ã¡ãŸãã
ãã®äŸåæ§ã®æ¹åã¯ã倿Žã®é »åºŠãšéèŠåºŠã«åºã¥ããŠèšèšãããŠããŸããããžãã¹ã«ãŒã«ã¯æã倿Žé »åºŠãäœããæãéèŠãªéšåã§ãããããä»ã®ã³ã³ããŒãã³ãããç¬ç«ããŠããå¿ èŠããããŸããäžæ¹ãUIãããŒã¿ããŒã¹ã®ãããªæè¡ç詳现ã¯é »ç¹ã«å€æŽãããå¯èœæ§ããããããæå€å±€ã«é 眮ãããŸãã
ãšã³ãã£ãã£å±€ â
ãšã³ãã£ãã£å±€ã¯ãClean Architectureã®æãå åŽã®åãæ§æãããšã³ã¿ãŒãã©ã€ãºã¯ã€ããªããžãã¹ã«ãŒã«ãã«ãã»ã«åããŸãããšã³ãã£ãã£ã¯ãäŒæ¥å šäœã§äœ¿çšãããæãäžè¬çã§é«ã¬ãã«ã®ã«ãŒã«ãå«ããªããžã§ã¯ãã§ãããããã¯ãå€éšã®å€æŽããæãé ããæãä¿è·ãããã¹ãéšåã§ãã
ãšã³ãã£ãã£ã¯åãªãããŒã¿æ§é ã§ã¯ãããŸããããããã¯ãããžãã¹ã«ãŒã«ãšããŒã¿ã®äž¡æ¹ãå«ããå®å šã«ã«ãã»ã«åããããªããžã§ã¯ãã§ããäŸãã°ãéè¡ã·ã¹ãã ã«ããããå£åº§ããšã³ãã£ãã£ã¯ãæ®é«ã ãã§ãªããåŒãåºãå¶éã婿¯èšç®ã®ã«ãŒã«ãå«ã¿ãŸãã
ãšã³ãã£ãã£å±€ã®éèŠãªç¹åŸŽã¯ããã¬ãŒã ã¯ãŒã¯ãããŒã¿ããŒã¹ãUIã«é¢ããç¥èãäžåæããªãããšã§ãããããã¯çŽç²ãªããžãã¹ããžãã¯ã§ãããã©ã®ãããªã¢ããªã±ãŒã·ã§ã³ã§ãåå©çšå¯èœã§ãã
ãŠãŒã¹ã±ãŒã¹å±€ â
ãŠãŒã¹ã±ãŒã¹å±€ã¯ãã¢ããªã±ãŒã·ã§ã³åºæã®ããžãã¹ã«ãŒã«ãå«ã¿ãŸãããã®å±€ã¯ãã·ã¹ãã ã®ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãå®è£ ãããšã³ãã£ãã£ãšã®éã§ããŒã¿ã®æµããææ®ããŸãããŠãŒã¹ã±ãŒã¹ã¯ããšã³ãã£ãã£ã«å«ãŸãããšã³ã¿ãŒãã©ã€ãºã¯ã€ããªããžãã¹ã«ãŒã«ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³åºæã®ç®æšãéæããŸãã
ãŠãŒã¹ã±ãŒã¹ã¯ãå ¥åããŒããšåºåããŒããéããŠå€éšäžçãšéä¿¡ããŸãããããã®ããŒãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã§ããããŠãŒã¹ã±ãŒã¹ãå¿ èŠãšããããŒã¿ãããŠãŒã¹ã±ãŒã¹ãçæããããŒã¿ã®åœ¢åŒãå®çŸ©ããŸãããã®èšèšã«ããããŠãŒã¹ã±ãŒã¹ã¯ç¹å®ã®UIãããŒã¿ããŒã¹ã®å®è£ ããç¬ç«ããŸãã
ãŠãŒã¹ã±ãŒã¹ã®å®è£ ã«ãããŠéèŠãªã®ã¯ãåäžè²¬ä»»ã®ååãå®ãããšã§ããåãŠãŒã¹ã±ãŒã¹ã¯äžã€ã®ç¹å®ã®ããžãã¹æäœã®ã¿ãæ±ãã¹ãã§ããäŸãã°ããééããŠãŒã¹ã±ãŒã¹ã¯ééã®ããžãã¯ã®ã¿ãå«ã¿ããŠãŒã¶ãŒèªèšŒãéç¥éä¿¡ãªã©ã¯å¥ã®ãŠãŒã¹ã±ãŒã¹ãšããŠå®è£ ãããã¹ãã§ãã
ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒå±€ â
ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒå±€ã¯ããŠãŒã¹ã±ãŒã¹ãšãšã³ãã£ãã£ã«æã䟿å©ãªåœ¢åŒãããããŒã¿ããŒã¹ããŠã§ããªã©ã®å€éšæ©é¢ã«æã䟿å©ãªåœ¢åŒã«ããŒã¿ã倿ããŸãããã®å±€ã«ã¯ãMVCã¢ãŒããã¯ãã£ã®ã³ã³ãããŒã©ãŒããã¬ãŒã³ã¿ãŒããã¥ãŒãå«ãŸããŸãã
ãã®å±€ã®äž»ãªè²¬ä»»ã¯ãããŒã¿ã®å€æã§ããäŸãã°ãSQLããŒã¿ããŒã¹ããååŸããããŒã¿ããšã³ãã£ãã£ã«å€æãããããšã³ãã£ãã£ãããŠã§ãããŒãžã«è¡šç€ºããããã®ãã¥ãŒã¢ãã«ãçæãããããŸããéèŠãªã®ã¯ããã®å±€ãããžãã¹ã«ãŒã«ãå«ãŸãªãããšã§ããçŽç²ã«ããŒã¿åœ¢åŒã®å€æã®ã¿ãè¡ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒå±€ã§ã¯ãäŸåæ§é転ã®ååïŒDependency Inversion PrincipleïŒãéèŠãªåœ¹å²ãæãããŸããå åŽã®å±€ïŒãŠãŒã¹ã±ãŒã¹ïŒãã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããå€åŽã®å±€ïŒã¢ããã¿ãŒïŒããããå®è£ ããããšã§ãäŸåæ§ã®æ¹åãå¶åŸ¡ããŸãã
ãã¬ãŒã ã¯ãŒã¯ã»ãã©ã€ããŒå±€ â
æå€å±€ã¯ããã¬ãŒã ã¯ãŒã¯ãããŒã«ããã©ã€ããŒãªã©ã®æè¡çè©³çŽ°ã§æ§æãããŸãããã®å±€ã«ã¯ããŠã§ããã¬ãŒã ã¯ãŒã¯ãããŒã¿ããŒã¹ãã¡ãã»ãŒãžã³ã°ã·ã¹ãã ãªã©ãå«ãŸããŸãããããã¯è©³çްå®è£ ã§ãããããžãã¹ããžãã¯ã«åœ±é¿ãäžããããšãªã倿Žå¯èœã§ããã¹ãã§ãã
ãã®å±€ã®ç¹åŸŽã¯ãå¯èœãªéãèãä¿ã€ããšã§ãããã¬ãŒã ã¯ãŒã¯åºæã®ã³ãŒãã¯æå°éã«æããããžãã¹ããžãã¯ããã¬ãŒã ã¯ãŒã¯ã«äŸµé£ãããªãããã«ããŸããäŸãã°ãSpring BootãDjangoã®ãããªãã¬ãŒã ã¯ãŒã¯ã䜿çšããå Žåã§ããããžãã¹ããžãã¯ã¯ãã¬ãŒã ã¯ãŒã¯ã®ã¢ãããŒã·ã§ã³ãåºåºã¯ã©ã¹ããç¬ç«ããŠããå¿ èŠããããŸãã
äŸåæ§é転ã®å®è£ ãã¿ãŒã³ â
Clean Architectureãå®è£ ããäžã§ãäŸåæ§é転ã®ååã®é©çšã¯äžå¯æ¬ ã§ããå åŽã®å±€ãå€åŽã®å±€ã®è©³çްãç¥ããªãããã«ãããããã€ã³ã¿ãŒãã§ãŒã¹ã掻çšããŸããå ·äœçãªå®è£ ãã¿ãŒã³ãšããŠãRepository ãã¿ãŒã³ãAdapter ãã¿ãŒã³ãé »ç¹ã«äœ¿çšãããŸãã
ãã®èšèšã«ããããŠãŒã¹ã±ãŒã¹ã¯ããŒã¿ããŒã¹ã®å®è£ 詳现ãç¥ãããšãªããå¿ èŠãªããŒã¿æäœãè¡ããŸãããã¹ãæã«ã¯ãã€ã³ã¡ã¢ãªå®è£ ãã¢ãã¯å®è£ ã«ç°¡åã«çœ®ãæããããšãã§ããé«ããã¹ã¿ããªãã£ãå®çŸããŸãã
ããŒã¿ãããŒãšå¢çã®æšªæ â
Clean Architectureã«ãããããŒã¿ãããŒã¯ãåžžã«äŸåæ§ã®èŠåã«åŸãå¿ èŠããããŸããå€åŽããå åŽãžããŒã¿ãæµããéãåå±€ã®å¢çã§ããŒã¿æ§é ã®å€æãè¡ãããŸãããã®å€æããã»ã¹ã¯ãåå±€ã®ç¬ç«æ§ãä¿ã€ããã«éèŠã§ãã
å žåçãªãªã¯ãšã¹ãåŠçã®ãããŒã¯ä»¥äžã®ããã«ãªããŸããHTTPãªã¯ãšã¹ããã³ã³ãããŒã©ãŒã«å°éãããšãã³ã³ãããŒã©ãŒã¯ãªã¯ãšã¹ãããŒã¿ãå ¥åDTOã«å€æããŸãããã®å ¥åDTOã¯ãŠãŒã¹ã±ãŒã¹ã«æž¡ããããŠãŒã¹ã±ãŒã¹ã¯ããžãã¹ããžãã¯ãå®è¡ããŸããçµæã¯åºåDTOãšããŠè¿ããããã¬ãŒã³ã¿ãŒããããHTTPã¬ã¹ãã³ã¹ã«é©ãã圢åŒã«å€æããŸãã
å¢çãæšªæããéã®ããŒã¿æ§é ã¯ãã·ã³ãã«ãªããŒã¿è»¢éãªããžã§ã¯ãïŒDTOïŒã§ããã¹ãã§ãããããã¯ãåºæ¬çãªããŒã¿åãšãã®éåäœã®ã¿ãå«ã¿ãããžãã¹ããžãã¯ãå«ã¿ãŸããããã®èšèšã«ãããåå±€ã®ç¬ç«æ§ãä¿ãããäžæ¹ã®å±€ã®å€æŽã仿¹ã«æ³¢åããããšãé²ããŸãã
ãã¹ã¿ããªãã£ãšã¢ãã¯ã®æŽ»çš â
Clean Architectureã®å€§ããªå©ç¹ã®äžã€ã¯ãé«ããã¹ã¿ããªãã£ã§ããåå±€ãæç¢ºã«åé¢ãããäŸåæ§ãå¶åŸ¡ãããŠãããããåäœãã¹ãã容æã«ãªããŸããç¹ã«ãããžãã¹ããžãã¯ãå«ããŠãŒã¹ã±ãŒã¹ãšãšã³ãã£ãã£ã¯ãå€éšäŸåãªãã«ãã¹ãã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ã®ãã¹ãã§ã¯ããªããžããªãã²ãŒããŠã§ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ãã¢ãã¯åããŸããããã«ãããããŒã¿ããŒã¹ããããã¯ãŒã¯æ¥ç¶ãªãã«ãããžãã¹ããžãã¯ã®æ£ç¢ºæ§ãæ€èšŒã§ããŸãããšã³ãã£ãã£ã®ãã¹ãã¯ããã«ã·ã³ãã«ã§ãçŽç²ãªåäœãã¹ããšããŠå®è£ ã§ããŸãã
# Use case test example
class TestTransferMoneyUseCase:
def test_successful_transfer(self):
# Arrange
mock_repo = Mock(spec=IAccountRepository)
source_account = Account(id="1", balance=1000)
target_account = Account(id="2", balance=500)
mock_repo.find_by_id.side_effect = lambda id: {
"1": source_account,
"2": target_account
}[id]
use_case = TransferMoneyUseCase(mock_repo)
# Act
result = use_case.execute(
TransferMoneyInput(
source_id="1",
target_id="2",
amount=200
)
)
# Assert
assert result.success == True
assert source_account.balance == 800
assert target_account.balance == 700
å®è£ ã«ãããå®è·µçèæ ®äºé â
Clean Architectureãå®éã®ãããžã§ã¯ãã«é©çšããéãããã€ãã®å®è·µçãªèæ ®äºé ããããŸãããŸããå®å šãªåé¢ãéæããããšã¯ãç¹ã«å°èŠæš¡ãããžã§ã¯ãã§ã¯éå°èšèšã«ãªãå¯èœæ§ããããŸãããããžã§ã¯ãã®èŠæš¡ãšè€éãã«å¿ããŠãé©åãªã¬ãã«ã®æœè±¡åãéžæããããšãéèŠã§ãã
ããã±ãŒãžæ§é ã®èšèšãéèŠãªèæ ®äºé ã§ããäžè¬çãªã¢ãããŒããšããŠãæ©èœå¥ïŒfeature-basedïŒãšå±€å¥ïŒlayer-basedïŒã®æ§é ããããŸããClean Architectureã§ã¯ãå åŽã®å±€ã»ã©å®å®ããŠãããšããååãããå±€å¥ã®æ§é ãæšå¥šãããããšãå€ãã§ãããå€§èŠæš¡ãããžã§ã¯ãã§ã¯æ©èœå¥ã®æ§é ãšçµã¿åãããããšãæå¹ã§ãã
project/
âââ domain/
â âââ entities/
â â âââ account.py
â â âââ customer.py
â âââ value_objects/
â âââ money.py
âââ application/
â âââ use_cases/
â â âââ transfer_money.py
â â âââ create_account.py
â âââ ports/
â âââ input/
â âââ output/
âââ infrastructure/
â âââ adapters/
â â âââ web/
â â âââ persistence/
â âââ config/
âââ main.py
ãã¬ãŒããªããšä»£æ¿ã¢ãŒããã¯ãã£ãšã®æ¯èŒ â
Clean Architectureã¯äžèœã§ã¯ãªããç¹å®ã®ãã¬ãŒããªãã䌎ããŸããæãé¡èãªã®ã¯ãåæéçºã³ã¹ãã®å¢å ã§ããå€ãã®æœè±¡åå±€ãšã€ã³ã¿ãŒãã§ãŒã¹ã®å®çŸ©ã«ãããã·ã³ãã«ãªCRUDã¢ããªã±ãŒã·ã§ã³ã§ã¯éå°ãªè€éããããããå¯èœæ§ããããŸãã
代æ¿ã¢ãŒããã¯ãã£ãšããŠã¯ãHexagonal ArchitectureïŒPorts and AdaptersïŒãOnion ArchitectureãDomain-Driven DesignïŒDDDïŒã®Layered Architectureãªã©ããããŸãããããã¯Clean Architectureãšå€ãã®ååãå ±æããŠããŸãããå®è£ ã®è©³çްã匷調ç¹ãç°ãªããŸãã
Hexagonal Architectureã¯ãClean Architectureã®å身ãšãèšããèšèšã§ãããŒããšã¢ããã¿ãŒã®æŠå¿µãäžå¿ã«æ®ããŠããŸããClean Architectureã¯ãã®æŠå¿µãåãå ¥ãã€ã€ããã詳现ãªå±€æ§é ãå®çŸ©ããŠããŸããOnion Architectureãåæ§ã®äŸåæ§ã®æ¹åãæã¡ãŸããããã¡ã€ã³ã¢ãã«ãããäžå¿çã«æ±ããŸãã
ãããžã§ã¯ãã®ç¹æ§ã«å¿ããŠé©åãªã¢ãŒããã¯ãã£ãéžæããããšãéèŠã§ããé«åºŠãªããžãã¹ããžãã¯ãæã€ãšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ã§ã¯Clean Architectureãæå¹ã§ãããã·ã³ãã«ãªWebã¢ããªã±ãŒã·ã§ã³ã§ã¯MVCãã¿ãŒã³ã§ååãªå ŽåããããŸãã
ããã©ãŒãã³ã¹ãšæé©åã®èæ ®äºé â
Clean Architectureã®å±€æ§é ã¯ãããã©ãŒãã³ã¹ãžã®åœ±é¿ãæžå¿µãã声ããããŸãã確ãã«ãåå±€ã§ã®ããŒã¿å€æãã€ã³ã¿ãŒãã§ãŒã¹ãéãã鿥çãªåŒã³åºãã¯ãçè«äžã®ãªãŒããŒããããçããããŸããããããçŸä»£ã®ã³ã³ãã€ã©ãJITã³ã³ãã€ã©ã®æé©åã«ãããå®éã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯å€ãã®å Žåç¡èŠã§ããçšåºŠã§ãã
ããã©ãŒãã³ã¹ãéèŠãªå Žåã以äžã®æé©åæŠç¥ãèæ ®ã§ããŸãã第äžã«ãé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ã«å¯ŸããŠãã£ãã·ã³ã°å±€ãå°å ¥ããããšã§ããããã¯ããªããžããªã®å®è£ ã¬ãã«ã§ééçã«è¡ããŸãã第äºã«ãè€éãªã¯ãšãªããããåŠçã§ã¯ãå°çšã®ã¯ãšãªãµãŒãã¹ãäœæããèªã¿åãå°çšã®æé©åããããã¹ãæäŸããããšã§ãã
ãã®ãããªCQRSïŒCommand Query Responsibility SegregationïŒãã¿ãŒã³ãšã®çµã¿åããã«ãããClean Architectureã®ååãç¶æããªãããå¿ èŠãªç®æã§ããã©ãŒãã³ã¹ãæé©åã§ããŸãã
ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ãžã®é©çš â
Clean Architectureã®ååã¯ããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«ã广çã«é©çšã§ããŸããåãã€ã¯ããµãŒãã¹ãç¬ç«ããClean ArchitectureãšããŠèšèšããããšã§ããµãŒãã¹éã®çµå床ãäœãä¿ã¡ãªãããåãµãŒãã¹å éšã®åé床ãé«ããããšãã§ããŸãã
ãã€ã¯ããµãŒãã¹ç°å¢ã§ã¯ããµãŒãã¹ééä¿¡ãã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒå±€ã§åŠçãããŸããREST APIãgRPCãã¡ãã»ãŒãžãã¥ãŒãªã©ã®éä¿¡ã¡ã«ããºã ã¯ããã®å±€ã«å®è£ ãããŸããéèŠãªã®ã¯ããŠãŒã¹ã±ãŒã¹ããšã³ãã£ãã£ããããã®é信詳现ãç¥ããªãããšã§ãã
åãµãŒãã¹ã®å¢çã¯ãããžãã¹èœåããã¡ã€ã³å¢çã«åºã¥ããŠå®çŸ©ãããã¹ãã§ããClean Architectureã®å±€æ§é ã«ããããµãŒãã¹ã®å éšå®è£ ã倿ŽããŠããä»ã®ãµãŒãã¹ãžã®åœ±é¿ãæå°éã«æããããšãã§ããŸãã
ãšã©ãŒãã³ããªã³ã°ãšäŸå€ç®¡ç â
Clean Architectureã«ããããšã©ãŒãã³ããªã³ã°ã¯ãåå±€ã®è²¬ä»»ç¯å²ã«å¿ããŠèšèšãããå¿ èŠããããŸããããžãã¹ã«ãŒã«éåã¯ãã¡ã€ã³äŸå€ãšããŠãæè¡çãªåé¡ã¯ã€ã³ãã©ã¹ãã©ã¯ãã£äŸå€ãšããŠæ±ãããŸããéèŠãªã®ã¯ãå åŽã®å±€ãå€åŽã®å±€ã®äŸå€ã«ã€ããŠç¥ããªãããšã§ãã
ãŠãŒã¹ã±ãŒã¹å±€ã§ã¯ãããžãã¹ã«ãŒã«éåã衚çŸããããã®å°çšã®çµæåããšã©ãŒåãå®çŸ©ããããšãæšå¥šãããŸããããã«ãããæåãšå€±æã®äž¡æ¹ã®ã±ãŒã¹ãåå®å šã«æ±ããŸããå€åŽã®å±€ã§ã¯ããããã®ããžãã¹ãšã©ãŒãé©åãªHTTPã¹ããŒã¿ã¹ã³ãŒãããŠãŒã¶ãŒã¡ãã»ãŒãžã«å€æããŸãã
# Domain exception
class InsufficientFundsError(DomainError):
def __init__(self, account_id: str, requested: Money, available: Money):
self.account_id = account_id
self.requested = requested
self.available = available
super().__init__(
f"Insufficient funds in account {account_id}: "
f"requested {requested}, available {available}"
)
# Use case result type
@dataclass
class TransferResult:
success: bool
transaction_id: Optional[str] = None
error: Optional[DomainError] = None
# Controller error handling
def transfer_money(self, request: Request) -> Response:
result = self.use_case.execute(self._map_request(request))
if result.success:
return Response(
status=200,
body={"transaction_id": result.transaction_id}
)
elif isinstance(result.error, InsufficientFundsError):
return Response(
status=400,
body={"error": "Insufficient funds"}
)
else:
return Response(
status=500,
body={"error": "Internal server error"}
)
é²åçã¢ãŒããã¯ãã£ãšããŠã®é©çš â
Clean Architectureã¯ãå¿ ãããæåããå®å šãªåœ¢ã§å®è£ ããå¿ èŠã¯ãããŸãããããããã·ã¹ãã ã®æé·ã«å¿ããŠæ®µéçã«é©çšããããšãçŸå®çã§ããåææ®µéã§ã¯ç°¡æœãªå®è£ ããå§ããè€éããå¢ãã«ã€ããŠå±€ãåé¢ããŠããã¢ãããŒããæå¹ã§ãã
ãªãã¡ã¯ã¿ãªã³ã°ã®æéãšããŠã以äžã®ãããªå åãçŸãããå±€ã®åé¢ãæ€èšãã¹ãã§ãïŒããžãã¹ããžãã¯ãã³ã³ãããŒã©ãŒã«æŒãåºããŠããããã¹ããå°é£ã«ãªã£ãŠãããç¹å®ã®ãã¬ãŒã ã¯ãŒã¯ãžã®äŸåã匷ããããåãããžãã¹ã«ãŒã«ãè€æ°ç®æã«æ£åšããŠããããªã©ã§ãã
段éçãªç§»è¡ã§ã¯ããŸãæãéèŠãªããžãã¹ããžãã¯ããåé¢ãå§ããŸããæ¢åã®ã³ãŒãããŒã¹ã«å¯ŸããŠã¯ãæ°æ©èœã®è¿œå æã«Clean Architectureã®ååãé©çšããåŸã ã«æ¢åéšåããªãã¡ã¯ã¿ãªã³ã°ããŠããæŠç¥ã广çã§ãã
Clean Architectureã¯ããœãããŠã§ã¢èšèšã«ãããéèŠãªååãäœç³»åãããã®ã§ããäŸåæ§ã®æ¹åãå¶åŸ¡ããããžãã¹ããžãã¯ãæè¡ç詳现ããåé¢ããããšã§ã倿Žã«åŒ·ãããã¹ã¿ãã«ã§ãçè§£ããããã·ã¹ãã ãæ§ç¯ã§ããŸãããã®é©çšã«ã¯åæã³ã¹ãã䌎ããŸãããé·æçãªä¿å®æ§ãšæ¡åŒµæ§ã®åäžãšããåœ¢ã§æè³ã¯ååãããŸããéèŠãªã®ã¯ããããžã§ã¯ãã®ç¹æ§ãšèŠæ±ã«å¿ããŠãé©åãªã¬ãã«ã§ãããã®ååãé©çšããããšã§ãã
åèæç®
- Martin, Robert C. "Clean Architecture: A Craftsman's Guide to Software Structure and Design" (2017) Prentice Hall.
- Cockburn, Alistair. "Hexagonal Architecture" (2005) https://alistair.cockburn.us/hexagonal-architecture/
- Palermo, Jeffrey. "The Onion Architecture" (2008) https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/