---
# System prepended metadata

title: n4uリファクタリング設計

---

# n4uリファクタリング設計

## summary

今回の実装では、usecase,repository,controller（現在のエンドポイント関数）の3層による簡易的なレイヤーアーキテクチャを導入する。

## 各レイヤーの説明

### usecase層

ユースケース層では、コントローラーが期待する振る舞い、及びデータ構造を定義する。
ユースケースではControllerに利用して貰うデータ構造を定義し、そのやり取りを行なう。
ユースケース層の目的はドメイン知識に詳しいRepository層との責務の分離であり、これより上位の概念ではRepositoryの知識を知らない世界を作る。

ユースケースは必要なRepositoryのinterfaceを引数に持ち、インスタンス生成時にそれらを継承した実態が挿入されることを期待する。テスト時には固定の値を返すオブジェクトでも良い。
ユースケースのユニットテストの戦略は"意図した振る舞いを持つrepository"が存在したと仮定して、それらの値を処理し正しく返却出来るかを保証すれば良い。

まず、依存性逆転の原則に従い、repository層に期待する振る舞いをinterfaceで定める。


```python=
import abc

class User():
#     省略

class example_repository(metaclass=abc.ABCMeta):
    def __init__(self):
        # TODO implements here
        # 
    # これはとても雑な例である
    @abc.abstractmethod
    def getUserFromMysql(self,user_id:string) -> User:
        raise NoImplementedError()
    
```

そして、controllerが期待するusecaseの実態を定義する。

```python

class example_usecase_impl(example_usecase):
    def __init__():
        # TODO
    
    def getUser(self,user_id:string)->User:
        return user

```

### repository層

repository層はDBなどの知識を持ち、それらにクエリやリクエストを行ないそれらを整形しユースケースが期待する形に返却するのが責務である。

以下が実装例である。

```python=
from user_usecase import example_repository

class User():
#     省略

class example_repository_impl(example):
    # 名前がミスっている可能性がある
    def __init__(self,sqlAlchemy:SQLAlchemy):
        # TODO implements here
        self.instance = sqlAlchemy

    def getUser(self,user_id:string) -> User:
#         これはお気持ちコードである
        return self.instance.where(user_id:user_id)
    
```


