2016.11.22
0でもできるオブジェクト指向 with 出席管理マネージャー#2【具体的にやってみましょう】
では具体的にオブジェクト指向を意識した実装をしてみましょう。
あっ、クッソ長ったらしいタイトルになりましたが、とりあえずいいサービス名を思いつかなかったので
出席管理マネージャーとしておきます。
さて、
前回(#1)では、
重要なのはコンストラクタだ!とか
全部クラス化しちまえ!!とかのたまっていましたが、実際にコーディングするとどーなるのかって話をします。
あ、再三言ってますけど、別にこのタイプの記事ってHow toのつもりで書いてるわけじゃなくて
僕の成長過程を記してるという意味合いが大きいので、なーにドヤ顔で書いてんだよとか言わないでくださいね(笑)
public function main(Request $request)
{
if (!Auth::check()) {
// ユーザーはログインしていない→ログインページへ
return view('index');
}
//ログイン済→データベースからリストを取得
/****ここでインスタンスを生成する****/
return view('list');
}
コントローラーの構造はこうなっています。
今までなら関数でなんとかしていたのですが、これをクラスで実装してみましょうと。
メリットはもちろん、ごちゃごちゃとした変数を定義する必要なく、生成したインスタンスをビューに渡せばOKということになりますね。
さて、これからやることとしては
管理グループリストの表示です。
つまり、自分が管理者となっているグループをリスト表示するということをやります。これをなるべく分割して実装するにはどうしたらって話ですね。
ここで実装のことをいきなり考えると失敗しやすいらしいので、試しに最初に
サンプルプログラムを書いてみるということをやってみます。
つまり、どのように動かしたいかを先に書いてみるということですね。
class AdminUser
{
/*サンプルプログラム*/
//AdminUser admin(int)
//db $list = admin->group_list()
}
db型なんてのは存在せず実際はオブジェクトなんですけど、まぁ分かりやすいようにdb型としました。
まぁ将来的にはAdminUserクラスはUserクラスを継承するんだろうなぁという予感はしますが
(管理者はユーザーでもあるため)とりあえず今はそんなこと考えずにコーディングして大丈夫そうですね。extendsくっつけるだけですしね。
作りたいクラスの内容としては、コンストラクタでint型
(ユーザーID番号)を設定し、group_list()でリストを取得するクラスですね。
まずオブジェクト指向の恩恵としては
group_list()が引数を必要としないってとこが手続き型プログラミングにはない恩恵です。だってオブジェクトそのものが値を持ってますからね。
//ログイン済→データベースからリストを取得
$admin=new AdminUser(1);//←コンストラクタで1を設定するのがミソであり・・・・・・
$admin->group_list();//←$admin自体がID情報を持っているので引数が要らないのがミソなのだ!笑
class AdminUser
{
/*サンプルプログラム*/
//AdminUser admin(int)
//db $list = admin->group_list()
// プロパティ
private $id;
function __construct($id) {
$this->id=$id;
}
// メソッドの宣言
public function group_list() {
echo $this->id;
}
}
雛形を作るとこんな感じです。これはidを受け取ってコンストラクタでインスタンスに紐付け、group_list()が呼び出された時その値をechoするというだけの簡単なプログラムですが、IDの情報がadminというインスタンスに集約されるのでいちいち引き継がなくていいわけですね。
めっちゃラクですねこれ
では次に
指定されたユーザーが管理するグループのリストを取得するというところを実装するのですが、これは別のクラスにできるんですかね???
クラス分けをする際に考えるのは
とにかく普遍化させるということだと思います。
この例で言えば
あるIDが属するグループのリストを取得するという似たような関数を将来的に作ることが予測されるので、もう少し一般化できないかを考えたいところですね。
これに関しては明日の記事にて書きます。
あからさまな記事のかさ増しだなァ!?!?