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"