オブジェクト指向難しい
オブジェクト指向難しい
環境
- express.js
- node.js
問題
クラスベースで書きたいけど難しいっていう愚痴
理由
- 何でまとめるか(クラス名をどうするか)悩む
- 既存のコードをクラスベースに書き換えようとしたが、一つの関数に仕事が複数あって、まず分割しなければいけないのが面倒・・・。
解決策
今回はなし
経緯
上記のサイト様の影響で、自身が作ったWEBアプリ(node.js, Express.js)をクラスベース化しようと考えた。理由は2つ
- 以前から、数日ぶりにWEBアプリのコードを編集する際に「え、何この関数は・・・」みたいなことがしょっちゅうあったのでその問題を解決したかった。
- バイト先で作成しているアプリで、自分の後任のバイトくん(ちゃん)が編集する可能性があるんでそのために。
まあ、イケるっしょwみたいな感じでやってみたが、実際やろうとすると難しい。
まず、既存の関数の中に、複数の仕事を持った関数があるのでそいつをクラスベースにするのが難しい。例えば、データベースから取ってきたクエリとページ数を返すみたいな関数は仕事を2つ持っていて、こいつをそのままクラスに持っていくことはできない。じゃあ、そいつの仕事を分割すればええやんけっていう話だが分割した後、どのような関数にし、そいつをクラスに格納しようかと考える。
そんなこんなで、今後コードを書く際は”1つの関数に1つの仕事”を徹底しようと思った。
補足
以下に自分が考えるクラスベースのメリットを記載する。
文才がなさすぎて以下の理由がスパゲッティと化したが、まとめるとメリットは以下の通り
- どんな機能なのか分かりやすくなる
- 追加・変更が安全に行える。
こんな感じ。以下、理由。
-
どんな機能なのか分かりやすくなる
例)String.toInteger( )
「string型をInt型にするメソッドなんやなぁ」って感じで。実際手続き型で関数を書くと関数の命名にどれだけ時間をかけても「この関数なんやったっけ?」みたいなことになる。 - 追加・変更が安全に行える
クラス機能を使わずにコードを書くと、複数の仕事を持った関数を書きがちなのだが(少なくとも自分はそう)、その書き方でやると後々困ったことになる。
例えば、
searchedData( )=>DBから全データを取ってきて返す
searchedDataWithPage( )=>DBから全データ、そしてページ数を返す
という関数があるとする。違いはページ数を返すか返さないかである。分割すればええやんけ。っていう感じで
searchedData( )=>DBから全データを取ってきて返す
searchedDataWithPage( )=>searchedData( )からデータをもらい、ページ数とともにそれらを返す
に分けるわけだがこれだとsearchedData( )の仕事量が大きくって例えば以下のようなデメリットが伴う。
1. searchedData( )から貰ったデータを編集するための関数が増殖する
=>searchedDataByIDsortedLast( )みたいなのが増える。地獄。
2. スパゲッティコードになる
=>searchedData( )を経由するためスパゲッティになる。飛行機の航路図を思い描いてほしい。すべての航空機が一旦東京を経由するようなもんである。地獄。
3. searchedData( )の変更が全てに影響する。
=>言わずもがな。地獄
4. 安易に削除が出来なくなる
=>ある関数を経由する関数が増えると、ある機能を削除すると「なぜか別の部分が動かなくなった」状態に陥ることがある。1つの関数に1つの仕事を守らなかったからである。地獄。
...こんな感じでまだデメリットはあるだろうが、とどのつまり、手続き型でコードを書くと柔軟な変更が出来ないということである。クラスベースは1つの関数に1つの仕事を守らないと書けないのでこう言ったデメリットはなくなるんじゃないでしょうか。知らんけど(関西人)