読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

クラス設計のTips

http://upload.wikimedia.org/wikipedia/commons/8/81/UML_Diagrams.jpg


TBD

関数の引数だけではわかりにくいと思ったらクラスにする。

ダメな例

bool flag = CompareWildCard("*IGHT", "eight", false);

良い例

WildCardCondition condition("*IGHT");
condition.SetCaseSensitive(false);
bool flag = condition.Accepts("eight");

クラスを作る時は、中身からではなくインターフェースを書いてから中身を書く

そのほうが、インターフェースが綺麗に書きやすい


継承されるクラスには仮想デストラクタを必ずつける。

これに関しては下記の記事がわかりやすい。

FAQ形式でデストラクタにvirtualを付ける理由をまとめてみた - かせいさんとこ

ここで書いてある通り、

すべてのクラスには、仮想デストラクタをつけるのがシンプルな気がする。


ちなみに、デストラクタの機能が不定になるのは、

子クラスのオブジェクトを親クラスにキャスト(アップキャスト)した時。

正直、そんなアクロバティックなコーディングしたこと無いので、

問題ないと思うが、仮想デストラクタを作っておくほうが良い

下記参照:

C++編(言語解説) 第24章 C++独自のキャスト


引数が一つのクラスのコンストラクタにはexplicitをつける。

あるクラス(hoge)で"引数(int)が一つ"のクラスがある時、

普通、

Hoge hoge(1);

というように、オブジェクトを作りますが、

実はC++の仕様で

Hoge hoge=1;

でオブジェクトを作ることができます。

しかし、下の方法を使うと挙動が不定になることがあるため、

上のオブジェクトの作成方法だけに限定する必要があります。

それには

 class Hoge
{
public:
	explicit Hoge(int i){}
};

のように,コンストラクタの前にexplicitを付けましょう。

最初から下の方法なんで使えないようにすればいいのに。。。(笑)



参考資料

クラス設計の考え方 http://www.aerith.net/design/class-j.html