Set.h
download
// Poniżej zamieszczam fragment programu - części mojej pracy dyplomowej.
// Praca dotyczyła weryfikacji skończeniestanowej projektów obiektowych
// zapisanych w UML. Jest to plik nagłówkowy dla klasy operaującej na
// zbiorach elementów dziedziczących z klasy abstrakcyjnej Named.
//
// Pokazuje następujące techniki:
//
// - annotacje wskaźników w kodach źródłowych (rozwinięte forma zapisu
// zapożyczonego z lclint) cel: ułatwienie wychwytywania błędów
// obsługi wskaźników
// - stosowanie sprawdzeń kompilatora do zmniejszenia "kruchości" klasy
// (możliwości nieprawidłowego użycia klasy) - tu blokada
// konstruktora kopiującego
// - dokumentowanie interfejsów wzorowane na Javadoc
//
// Dariusz Cieślak, http://cieslakd.prv.pl
#ifndef __SET_H
#define __SET_H
class Named;
class Set
{
friend class SubSet;
protected:
enum{ MAX_SIZE = 32 };
public:
Set(int nMaxSize = MAX_SIZE);
~Set();
/** raises Error on missing item */
Named* /*notnull shared*/ find(const char* sName) const;
/** raises Error on duplicate name or if too many items */
void add(Named* /*pass*/ item);
/** number of items in set */
int getSize() const;
/** Error when no such name exists, id is alternative
* identifier in set */
int nameToPos(const char* sName) const;
/** i-th item */
const Named* /*shared*/ get(int i) const;
static void selfTest();
protected:
typedef Named* NamedPtr;
int nFreeNr;
int nMaxSize;
Named** mapNrToNamed;
Set(const Set&); // disable copy
/** when there's no such item, null is returned */
Named* /*null*/ find2(const char* sName) const;
};
template<class T>
class SetOf : public Set
{
public:
SetOf(int nMaxSize = MAX_SIZE)
: Set(nMaxSize)
{
}
T* /*notnull*/ find(const char* sName) const
{
return (T*)Set::find(sName);
}
void add(T* /*pass*/ item)
{
Set::add((Named*)item);
}
const T* get(int i) const
{
return (T*)Set::get(i);
}
bool exists(const char* sName) const
{
return find2(sName) != 0;
}
};
#endif /* __SET_H */
(...)
Nie ma bowiem łatwych odpowiedzi.
Nie istnieje nic takiego jak najlepsze
rozwiązanie - zarówno jeśli chodzi o
narzędzia,
jak i języki czy systemy operacyjne. Są
jedynie systemy, które mogą być bardziej
odpowiednie w konkretnych okolicznościach.
I tu właśnie do gry wchodzi pragmatyzm.
Nie należy przywiązywać się do żadnej
określonej metody, ale mieć na tyle rozległą
wiedzę i doświadczenie, by w danej sytuacji
wybrać dobre rozwiązanie.
(...)
Andrew Hunt, David Thomas
"Pragmatyczny Programista"