未熟学生エンジニアのブログ

プログラミング・Web開発をする大学院生のブログ

Djangoのfunction based viewとclass based viewの違い・メリット・デメリットを調べた

DjangoにはRailsなどと異なり、class based viewとfunction based viewという概念があります。MTVで言う所のView、MVCでいうところのControllerにあたる所のメソッドの定義の仕方に2通りメジャーなやり方があるという感じになっています。

調べてみた

この記事が詳しかったです

simpleisbetterthancomplex.com

以下、上の記事で挙げられていた中で自分が大事だなと思った違い(メリット)をあげます。もっと知りたい人は上の記事を参照してください。

class based viewの主なメリット

  • 継承が使える
    • コードが少なくなる
    • 一覧などのテンプレコードを使い回すこと(再利用)ができる
  • HTTPのメソッドがそのままクラスのメソッドになり 、わかりやすい

class based viewの主なデメリット

  • コードが読みづらい
  • デコレータが使いづらい
  • 継承やmixinが複雑になることがある

function based viewの主なメリット

  • 実装がシンプルで、読みやすい
  • 関数なので、デコレータが使いやすい

function based viewの主なデメリット

  • 再利用しづらい
  • GET, POSTなどを関数内で分岐させないといけない

思ったこと

function based viewの実装がシンプルで読みやすいというのがいまいちわからなかったです。シンプルなのは確かに基本的に一つの関数だけで完結するため(内部で別の関数を呼ぶことはもちろんあるが)ということかもしれないが、読みやすいというのはどうなんだろう。クラスを使わない分、メンバを気にする必要がなく、関数の中にある変数だけを気にすればいいため、コードを読むとき目を比較的上下させなくていいことや、必然的に継承ではなく委譲を使うことになるためだろうか。

ちなみに、フロントエンドを描きやすくするためにReactやVue、Angularなどを使ってバックエンドはAPIにするという形をとるのが主流な現在では、RESTに則ってGET, POST, PUT, DELETEを活用するため、それらをクラスのメソッドとして実装できるclass based viewが優勢なのかもしれません。

多分今後APIを作るときは、class based viewを使うと思います。

今後に活かしたい

DjangoはDRYの原則に乗っ取ったつくりになっていることを考えると、class based viewの方がいいのかもしれません。いままでなんとなくfunction based viewを使っていましたが、メリットを活かして書いていけるよう意識していこうと思います。