selecao3のブログ

技術系の備忘録

オブジェクト指向難しい

オブジェクト指向難しい

 環境

  • express.js
  • node.js

問題

クラスベースで書きたいけど難しいっていう愚痴

理由

  •  何でまとめるか(クラス名をどうするか)悩む
  • 既存のコードをクラスベースに書き換えようとしたが、一つの関数に仕事が複数あって、まず分割しなければいけないのが面倒・・・。

解決策

 今回はなし

経緯 

qiita.com

上記のサイト様の影響で、自身が作ったWEBアプリ(node.js, Express.js)をクラスベース化しようと考えた。理由は2つ

  1. 以前から、数日ぶりにWEBアプリのコードを編集する際に「え、何この関数は・・・」みたいなことがしょっちゅうあったのでその問題を解決したかった。
  2. バイト先で作成しているアプリで、自分の後任のバイトくん(ちゃん)が編集する可能性があるんでそのために。

まあ、イケるっしょwみたいな感じでやってみたが、実際やろうとすると難しい。

まず、既存の関数の中に、複数の仕事を持った関数があるのでそいつをクラスベースにするのが難しい。例えば、データベースから取ってきたクエリとページ数を返すみたいな関数は仕事を2つ持っていて、こいつをそのままクラスに持っていくことはできない。じゃあ、そいつの仕事を分割すればええやんけっていう話だが分割した後、どのような関数にし、そいつをクラスに格納しようかと考える。

そんなこんなで、今後コードを書く際は”1つの関数に1つの仕事”を徹底しようと思った。

補足

以下に自分が考えるクラスベースのメリットを記載する。

文才がなさすぎて以下の理由がスパゲッティと化したが、まとめるとメリットは以下の通り

  1. どんな機能なのか分かりやすくなる
  2. 追加・変更が安全に行える。

こんな感じ。以下、理由。

  1. どんな機能なのか分かりやすくなる
    例)String.toInteger( )
    「string型をInt型にするメソッドなんやなぁ」って感じで。実際手続き型で関数を書くと関数の命名にどれだけ時間をかけても「この関数なんやったっけ?」みたいなことになる。

  2. 追加・変更が安全に行える
    クラス機能を使わずにコードを書くと、複数の仕事を持った関数を書きがちなのだが(少なくとも自分はそう)、その書き方でやると後々困ったことになる。
    例えば、
    searchedData( )=>DBから全データを取ってきて返す
    searchedDataWithPage( )=>DBから全データ、そしてページ数を返す
    という関数があるとする。違いはページ数を返すか返さないかである。分割すればええやんけ。っていう感じで
    searchedData( )=>DBから全データを取ってきて返す
    searchedDataWithPage( )=>searchedData( )からデータをもらい、ページ数とともにそれらを返す
    に分けるわけだがこれだとsearchedData( )の仕事量が大きくって例えば以下のようなデメリットが伴う。

    1. searchedData( )から貰ったデータを編集するための関数が増殖する
    =>searchedDataByIDsortedLast( )みたいなのが増える。地獄。
    2. スパゲッティコードになる
    =>searchedData( )を経由するためスパゲッティになる。飛行機の航路図を思い描いてほしい。すべての航空機が一旦東京を経由するようなもんである。地獄。
    3. searchedData( )の変更が全てに影響する。
    =>言わずもがな。地獄
    4. 安易に削除が出来なくなる
    =>ある関数を経由する関数が増えると、ある機能を削除すると「なぜか別の部分が動かなくなった」状態に陥ることがある。1つの関数に1つの仕事を守らなかったからである。地獄。

    ...こんな感じでまだデメリットはあるだろうが、とどのつまり、手続き型でコードを書くと柔軟な変更が出来ないということである。クラスベースは1つの関数に1つの仕事を守らないと書けないのでこう言ったデメリットはなくなるんじゃないでしょうか。知らんけど(関西人)

 

 

Command not found: npmになった

Command not found: npmになった

 環境

問題

表題の通り。ある日、"npm start"したら出た。

理由

 不明

解決策

 sudo aptitude install npm

すると解決した。

経緯

1.sudo apt install npm

npm: 依存:node-gyp(>= 0.10.9)しかし、インストールされようとしていません 

とかが出て失敗。

2.rm -rf .npm/node-gyp

ヤケクソになって削除後に1.を試したが変わらず1.と同じ文章が表示された。

失敗。

3.sudo apt purge nodejs && sudo apt install nodejs

node.js入れなおしたら直るかもしれん!彡(^)(^)

失敗。

4.sudo apttiude install npm

Ubuntuの「壊れた変更禁止パッケージがあります」エラーにaptitudeで対処する方法 - minus9d's diary

 上記のサイト様を参考にapttitudeでinstallしてみた。

脳死状態でYとEnterキーを数回押したらnpmがインストールされ、当初の目的の

npm startもできた。

今のところ、問題は起きていない。

 

「何もしていないのに壊れた」状態でとても辛かった(小並感)

 

undefined reference to {関数名}が出る

undefined reference to {関数名}が出る

 環境

問題

表題の通り

理由

 ライブラリがリンクされていないから

解決策

 コンパイル時に-lオプションをつける。

例えば、curlライブラリを使う際、ターミナルで

curl-config --libs

と入力すると、-lcurlという文言が出力されるので、

g++ src/main.cpp -lcurl

とすればコンパイルができる。

 

include pathが読み込まれない

include pathが読み込まれない

 環境

問題

libxml2ライブラリがVScodeコンパイル時に読み込まれない。

VScodeについて

  1. c/c++_properties.jsonを開く。(自身は自動でC++のプロジェクトを作成してくれる拡張機能で既に作成されていたが、VScodeのCtrl+Shift+PでC/C++; Edit Configurations..みたいなのをクリックすれば作成される)
  2. includePathにライブラリのパスを追加する。
    今回はlibxml2-devはWSLのaptでインストールした。その際libxml2は/usr/includeにインストールされていた。

コンパイルについて

  1. コンパイルする前に、
    xml2-config --cflags
    を入力する。すると、-I/usr/include/libxml2
    みたいな文字列が出力されるので、g++でコンパイルする際にこいつを付ければ良い。つまり、
    g++ -I/usr/include/libxml2 src/main.cpp -lxml2
    とすれば良い。