Take's Software Engineer Blog

とあるメーカーソフトウェアエンジニアに聞きたいことを発信していきます。

【企画】テスト駆動開発をC++でやってみる 第1章仮実装

f:id:monokuma12:20200905142104j:plain

書籍:テスト駆動開発における悩み
  • テスト駆動開発の書籍かったけど、Javaやんけ。読めんがな
  • 読めない言語でやってもヤル気でないわ。誰かC++で書いてくれないかな

テスト駆動開発という単語をご存じでしょうか?
簡単に言うと、テストを作ってテストを通らない状態にしてから、
実装する開発手法です。組み込みやPCアプリなど様々な環境で使用することが可能です。

ただし、あなたの職場で使っているって方いるでしょうか?

単体テストの環境すらないのではないでしょうか?

今時単体テストがない=やらなくてよいという職場がどんどん減ってくると思いますし、ないと気ままにリファクタリングできません。古いおっさんの書いた瓦礫プログラムの担当になり、よくわからん機能の担当で痛いっていう方はいませんよね。

ってことで、今回は、テスト環境をベースに開発を進めていくテーマとして、

書籍テスト駆動開発というものを進めていこうと思います。

この記事シリーズを読むことで、C++初心者かつテスト駆動開発初心者がすんなりC++の開発でテストを作りながら書籍テスト駆動開発に書かれたことを存分に体感できるところを目指しています。

ちなみに私は普段Cを使っている組み込みエンジニアです。久しぶりにコードを触って開発に触れているので、ほぼ初心者プログラマーです。

自分のような初心者がハマらないように記事を書いていきたいと思うのでよろしくお願いします

 

 

 

第1章仮実装「宣言できない問題」

f:id:monokuma12:20200905142147j:plain

第1章仮実装その1
  • Classの宣言がJavaと違うぞ。
  •  Dollar five = new Dollar(5);をC++に変換すると・・・

今回のハマりポイントはJavaとの差分です。

C++を初めて触る人において、クラスを使うってどうやってやるんだろうから
疑問に思うわけです。

具体的には、こんなシーン

書籍に「 Dollar five = new Dollar(5);」とあったので、

C++でも同じように書けるだろうか?えいっ

f:id:monokuma12:20210730132025p:plain

くそである。
いきなり第1章からコピペという手段を封じられる鬼畜な仕様である。
解決策は、*をつけることである

Dollar *five = new Dollar(5);

f:id:monokuma12:20210730132320p:plain

OK

たったこれだけだが、JavaからC++の差分を全く知らない人がC++をベースに進めるとこうなります。

 

 

第1章仮実装その2「ヘッダよお前もか」

 

f:id:monokuma12:20200905142147j:plain

第1章仮実装その1
  • ヘッダがない
  • 関数の実装はどうやってやるのか

今回のハマりポイントはJavaとの差分です。またかと思いつつもその2は関数の実装です

今回は

void times( int multiplier) { amount *= multiplier; }

C++使えるようにすることがゴールである

f:id:monokuma12:20210730132954p:plain

でわやっていく。

ヘッダファイルはコピペでいけそうだ。

Java

f:id:monokuma12:20210730133033p:plain

C++

f:id:monokuma12:20210730133025p:plain

 

 よしいけた。次はCppファイルだ

f:id:monokuma12:20210730133120p:plain

またかよ。ふー。

Cppファイルへの記述方法が全く違うようだ。
ノリで2個くらいサンプルに色々つけてみた

①Dollar Dollar::times(int multiplier) {void Dollar::times(int multiplier) { amount *=multiplier;}
②void Dollar::times(int multiplier) {void Dollar::times(int multiplier) { amount *=multiplier;}

f:id:monokuma12:20210730133232p:plain

正解は2である。

Dollarというクラス名がvoidとtimesの間に入るとか聞いてないぞ

ってことで、第2のハマりポイントは関数定義のやり方が全く違うということである。

 

まとめ

今回第1章をベースにCからC++に初挑戦かつJavaすらまとも読めないという前提で書いてみましたが、いい感じにはまりました。

今後も続けていく予定なので、

気になった方はお気に入り登録お願いします

今回の成果物は以下にあるので、気になった方は質問などよろしくお願いいたします。

まさかりはやめてちょ。

github.com

 

div #breadcrumb div{ display: inline;font-size:13px;}