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

ぼくがかんがえたさいこうのはいれつ

C++は厨二病なので、
テンプレートを憶えたてのプログラマはすぐに
「ぼくがかんがえたさいこうのはいれつ」を書きたがります。
STLがあるじゃん?
というと、使いにくいと言います。


で、ぼくがつかいやすいはいれつくらすをかきます、と言い出して配列を書き始めます。
これはほぼ九分九厘糞です。
でも本人はSTLより優れていると思っているんです。
微笑ましいですね。


よく見られる特徴。

  • イテレータがない
    • そもそもiteratorの重要性を理解していない。故に用意する事をそもそも考慮すらしない。
  • メソッド名をSTLにあわせない
    • STLを糞だと思っているので、メソッド名をあわせません。インターフェイスがむちゃくちゃです。
  • 便利メソッドがたくさんある
    • 突っ込みどころが満載な便利メソッドを追加してあります。おいおい。
  • immutableなメソッドをconst修飾しない
    • そんなことは別にどうだって良いんだ、と考えています。
  • ポインタを返すようなメソッドを用意して、プリミティブな型が指定されたらどうするかは一切考えない。
    • おいおい。
  • constとかつけないのでコンパイラによってはコンパイルできない
    • おいおい。
  • ファンクタとか知らないので、全て関数ポインタで済ませようとする。
    • おいおい。


かなり残念な一例。
実装はもっと残念なので割愛。
大抵、こんなのが出てきます。
STLに今すぐ謝れ!!!!
インターフェイスをみるだけでかなり残念です。


涙がでます。
でも、これを乗り越えて人は強くなります。

template<class T>
class Vector{
	typedef bool (*FunctionValid)(const T *);					// 有効性を調べる関数の型らしい
	typedef bool (*FunctionEqual)(const T *, const T *);		// 検索時の関数の型らしい
	typedef int (*FunctionSort)(const void *, const void *);	// qsortに渡す関数の型らしい
public:
        // STLよりも使いにくい基本インターフェイス
	Vector();										// コンストラクタ
	virtual ~Vector();								// デストラクタ
	void Alloc(unsigned int size);					// 指定した要素数を確保
	unsigned int Size();							// 要素数を返してくれるらしい
	T &operator[](int index);						// 要素を返してくれるらしい
	Vector <T> &operator=(const Vector <T> &v);			// ディープコピーをしてくれるらしい
	T *Ptr();										// ポインタを返してくれるらしい
	void Push(T &v);								// 無効な要素に引数の要素を代入してくれるらしい
	void Pop(T &v);									// 引数の要素と最初に合致した要素を初期化してくれるらしい

        // 不思議な便利メソッド群
	void Release();									// メモリ解放
	bool Valid();									// メモリを確保済みか返してくれるらしい
	T *Find(T &v);									// 引数の要素と合致した要素のポインタを返してくれるらしい
	T *FindInvalid();								// 未使用の要素を返してくれるらしい
	void Sort();									// 設定されているソート関数を使ってソートしてくれるらしい
	bool ValidAssert();								// メモリ未確保かどうか調べてくれるらしい
	unsigned int ValidSize();						// 使用中の要素数を返してくれるらしい
	unsigned int Count(FunctionValid f);				// 引数の関数に合致した要素数を返してくれるらしい

	void Clear();									// 全要素を初期値でクリアしてくれるらしい
	void Fill(T value);									// 全要素に代入してくれるらしい
        // ある特定の事をするためにセットしなければならない関数ポインタ群
	void SetFunctionValid(FunctionValid f);			// 有効性を調べる関数をセットできるらしい
	FunctionValid GetFunctionValid();					// 有効性を調べる関数を返してくれるらしい
	void SetFunctionEqual(FunctionEqual f);			// 合致用関数をセットできるらしい
	FunctionEqual GetFunctionEqual();					// 合致用関数を返してくれるらしい
	void SetFunctionSort(FunctionSort f);			// ソート用関数をセットできるらしい
	FunctionSort GetFunctionSort();					// ソート用関数を返してくれるらしい
};