# 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) ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up