どうもこんにちは!
先日プログラミングスクールを卒業し、11月からの入社に向けて、Laravelをやり始めた者です。
スクールでrailsを使用していた際は、依存性とか全く気にせず全ての処理をコントローラーに書き込んでいたのですが、Laravelをビジネスで使う上では、依存性の注入(DI)という概念が大事になってくるぽいので、
まとめてみようかなと思います。
依存度を下げる=機能分割する→変化に強い
ある値が処理の中で何度も登場するときは変数にしておきましょうという話は聞いたことがあると思います。
def hello
puts "こんにちは!田中くん!"
puts "こんにちは!山田くん!"
puts "こんにちは!野口くん!"
end
ってやるより
def hello
hello= "こんにちは!"
puts "#{hello}田中くん!"
puts "#{hello}山田くん!"
puts "#{hello}野口くん!"
end
ってしておいた方が例えば「こんにちは」から「こんばんわ」にしたい時、変更点は一箇所だけだし、修正ミスが起こる可能性も一箇所だけだから低いですよね。あと今回は3つしかputsがないので、あれですけども、例えば100近く同じ記述があったら、、、って考えるとよく利便性がわかると思います。
変数として処理の外から値を注入することで、値が1つ1つの処理に左右されていない、依存度が低い状態になっています。
Controllerとかでの話
スクール時代に書いていたContoroller(railsの例)
class UsersController < ApplicationController
def index
if params[:keyword]==""
@users=[]
else
@users = User.where('name LIKE ?', "#{params[:keyword]}%").where.not(name: "#{current_user[:name]}").limit(15)
end
respond_to do |format|
format.json
end
end
indexの所にどっさり処理が書かれていますよね。
違う言語になるのであれですけど、
Laravelで依存度を低く意識した記述がこんな感じ
public function store(TweetRequest $request)
{
TweetService::CreateTweet($request['content']);
return redirect('/tweet');
}
TweetService::CreateTweetはLaravelのクラスメソッドの書き方で、
別途用意したServiceClassに処理を書いて、それをコントローラー内で呼び出してます。
public static function CreateTweet($request)
{
$content= $request;
$tweet = new Tweet($content, Auth::id());
$tweet->save(); //TweetController@storeへ
}
まぁ今はとりあえずはこんな感じで。
11月からの実務を経験して知識補完し次第追記か、別途人にお見せできるレベルの文を書いてみたいと思います。