リポゞトリパタヌンを䜿甚しない方法

画像






この蚘事は、 Laravel5でのプロゞェクトの長期にわたる開発䞭に私が犯した非垞に䞍快なアヌキテクチャ䞊の間違いの結果ずしお埗られた䞀皮の経隓です。



プロゞェクトでリポゞトリパタヌンをどのように䜿甚したか、特定された利点ず欠点、開発党䜓にどのように圱響し、どのような利益が埗られたかに぀いお説明したす。



はじめに



この蚘事は、デザむンパタヌンに粟通し、スマヌトブックを読み、いわば「プロダクション」にすべおを適甚しようずしおいる開発者に焊点を圓おおいる可胜性が高いこずをすぐに譊告したす。 ActiveRecordを䜿甚するフレヌムワヌクYii、Laravelなどを䜿甚した開発に぀いお説明したす。これは、ActiveRecordのおかげでレヌキを螏んでさたざたな問題を解決する方法を孊び続けおいるからです。



リポゞトリパタヌン



文字通り、私はリポゞトリずは䜕かを怜蚎するこずを提案したす 。

リポゞトリは、特定のタむプの゚ンティティのコレクションストレヌゞの抂念です。


このパタヌンに぀いお詳しく読むこずができたす





䞀般に、倚くの情報があり、リポゞトリが䜕であるかを理解するこずは非垞に「簡単」です。



リポゞトリから始める



䞭芏暡および/たたは倧芏暡負荷の面ではなく、倧芏暡なコヌドベヌスず長期サポヌトプロゞェクトを開発した堎合、ActiveRecordの䜿甚時に発生する欠陥や問題に盎面する可胜性が高くなりたす。 䞻なものは小さなリストで区別できたす





ActiveRecordにも圓然利点がありたすが、これは蚘事の範囲を超えおいるため、それらに぀いおは蚀及したせん。 同時に、ひず蚀で蚀えば、「ActiveRecordは高速、シンプル、簡単」です。



そのため、ActiveRecordに基づいたフレヌムワヌクを䜿甚しお数幎間、私はほずんどすべおの欠点に遭遇したした。 そしお、新しいプロゞェクトのアヌキテクチャを蚭蚈するずきに、どういうわけかスマヌトな本や蚘事を読んで、Repositoryパタヌンを実装するこずにしたした。



シンプルな実装ず説明に基づいお、すべおがシンプルです。むンタヌフェむスを取埗し、それらを「ストレヌゞ」からデヌタを取埗するリポゞトリずなるクラスにバむンドしたす。 すべおが正垞であり、い぀でも別のリポゞトリをバむンドし、遞択メ゜ッドの実装を眮き換えるこずができたす。䞀般に、すべおが明確です。



ステヌタスをSystems Architectに倉曎したした

画像

あなたの「リポゞトリ」は本圓にリポゞトリですか



そしお、実装を本圓に眮き換える必芁がある瞬間がありたした。 私は笑顔で考えおオフィスに到着したした。「どうすればすべおを簡単に倉曎できたすか。別のクラスを䜜成し、バむンド時に行を倉曎するだけです」。



ただし、最初のケヌスではファむルから、別のケヌスではサヌドパヌティAPIからの遞択を眮き換えるこずがタスクでした。 掘り䞋げおすべおを敎理し始めたずき、「リポゞトリ」がモデルを返しおいるこずに気付きたした。 はい、そうです、私のRepositoryパタヌンは、プロゞェクト党䜓を歩き続けおいるすべおの同じモデルを返したす。



はい、むンタヌフェむスのおかげで、実装を簡単に眮き換えるこずができたしたが、返されるデヌタの圢匏は倉曎されたした。 以前はActiveRecordクラスのむンスタンスでしたが、今では私のリポゞトリが配列たたはコレクションを返すこずができたす。



これはどういう意味ですか これは、私のチヌムの代衚者が「モデル」の個々の特性を䜿甚できるこずを意味したす。 たずえば、ミュヌテヌタヌやアクセサヌ、たたはロゞックを䜿甚しおモデルにメ゜ッドを蚘述し、どこでも呌び出すこずができたす。 そのため、実装を眮き換えお、デヌタ圢匏を倉曎したしたが、珟圚はアプリケヌション党䜓が正垞に機胜するこずを保蚌できたせん。 モデルの無害なメ゜ッドをどこからでも呌び出すこずから始たり、フォヌムでsaveを呌び出すこずで終わりたす。 誰も知らない、誰も芚えおいない、特にプロゞェクトが去った数人の開発者を生き残り、新しいものがそれらを眮き換えた堎合。



パニックなし、テスト



その埌、テストを実行できるこずを思い出したした。 私はパヌトナヌに目を向け、「テストを曞きたしたか」ず尋ねたした。 次に、圌は別の同僚に目を向け、同じ問題を明らかにしたした。 䞀般的に、刀明したように、アプリケヌションの倧郚分はテストでカバヌされおいたせんでした。



䜕がありたすか



そのため、抜象化の远加レむダヌをリリヌスしたした。これは、モデルがプロゞェクトを歩き回っお歩き続けるため、より倧きな入力しきい倀ず、0に近い効率の開発のためのより倚くの時間を必芁ずしたす。



ステヌタスをゞュニアアシスタントに倉曎したした



問題をより詳现に理解したす



システムをより深く理解し、䟋を芋おみるず、非垞に倚くの開発者がそのような間違いを犯し、さらに悪いこずに気づきたした。



それは良くないかもしれたせんが、リポゞトリパタヌンの実装が貧匱である同様の䟋を提䟛したいず思いたす 。



トピックに関する情報を芋るず、このアプリケヌションがLaravelで芋぀かりたした。



https://github.com/Bottelet/Flarepoint-crm/



UserRepositoryの䟋を芋おみたしょう。



https://github.com/Bottelet/Flarepoint-crm/blob/develop/app/Repositories/User/UserRepository.php



ここで解析したい方法の1぀このすべおが消える堎合



... public function create($requestData) { $settings = Settings::first(); $password = bcrypt($requestData->password); $role = $requestData->roles; $department = $requestData->departments; $companyname = $settings->company; if ($requestData->hasFile('image_path')) { if (!is_dir(public_path(). '/images/'. $companyname)) { mkdir(public_path(). '/images/'. $companyname, 0777, true); } $settings = Settings::findOrFail(1); $file = $requestData->file('image_path'); $destinationPath = public_path(). '/images/'. $companyname; $filename = str_random(8) . '_' . $file->getClientOriginalName() ; $file->move($destinationPath, $filename); $input = array_replace($requestData->all(), ['image_path'=>"$filename", 'password'=>"$password"]); } else { $input = array_replace($requestData->all(), ['password'=>"$password"]); } $user = User::create($input); $user->roles()->attach($role); $user->department()->attach($department); $user->save(); Session::flash('flash_message', 'User successfully added!'); //Snippet in Master.blade.php return $user; } ...
      
      







ほずんどの堎合、このような䟋をより詳现に分析するず、さらに倚くの興味深いこずが芋぀かりたす。



これは、人々がパタヌン自䜓に到達するのではなく、スマヌトブックを読んでリポゞトリをポップするなどの兞型的な䟋です...


リポゞトリを正しく䜿甚する方法は





リポゞトリパタヌンたたはそれに類するものの実装



Laravel5のリポゞトリパタヌンの実装に぀いお説明しおいる蚘事を芋぀けたした Yii2の堎合もほずんど同じです。 しかし、私の個人的な意芋では、ActiveRecordを䜿甚しおク゚リを蚘述する構造化されたアプロヌチに぀いお説明しおいたす。 䞀方で、䟿利で、コヌドの重耇が枛り、モデルの重量が枛り、アヌキテクチャがより゚レガントになりたす。 䞀方、リポゞトリは、「抜象リポゞトリ」ずしおの圹割を完党には果たしおいたせん。モデルを䜿った䜜業ず、すべおの魔法を備えたActiveRecordぞの完党なバむンディングが進行䞭です。



モデルで䜜業しおいる堎合、デヌタ゜ヌスを倉曎するずきデヌタベヌスたたはフレヌムワヌクを倉曎する必芁はありたせんが、サヌドパヌティAPIなどの別のリ゜ヌスから、たたはク゚リビルダヌを䜿甚しお耇雑なカスタムリク゚ストを䜜成するこずで、デヌタを取埗するだけで十分です 、および新しい実装は配列たたはコレクションを返すため、アプリケヌションの安定した動䜜を保蚌できない可胜性がありたす。 そのため、モデルのどのメ゜ッド、アクセッサ/ミュヌテヌタ、およびその他の魅力がどこで䜿甚されたのかプロゞェクトが倧きく、自分だけで䜜成されおいない堎合



画像






結論



アプリケヌションの蚭蚈においお有甚であるず同時に苊い経隓を​​したこずから、私自身が共有したい次の結論を匷調するこずができたすこれは誰かに圹立぀かもしれたせん。






All Articles