Operacje na stringach (programowanie obiektowe)

0

Mam do napisania projekt:

Operacje na stringach
Napisać bibliotekę, która będzie umożliwiała wykonywanie zestawów operacji na stringach.
Operacje to np. zamiana małych liter na wielkie, wielkich na małe, usunięcie spacji z początku i
końca stringa, zamiana części stringa na inną część, usunięcie wszystkich wystąpień danego znaku.
Rozwiązanie powinno opierać się o wzorzec projektowy komenda (polecenie).
http://pl.wikipedia.org/wiki/Wzorzec_polecenia
Przykładowe użycie:
Operacje op();
TrimCommand trim();
ChangeCommand change(„ala”,”ola”);
UpperCaseCommand toUpper();
op<<trim<<change<<toUpper;
cout<<op.apply(„ ala ma kota „);
// Wypisze „OLA MA KOTA”

Nie chodzi mi o napisanie programu. Zastanawiam się nad schematem programu tak żeby wszystko wyglądało porządnie i dobrze się łączyło. Nie wiem jakie klasy jak urządzic (tzn jakieś ogólne informacje o strukturze klas) - jakie będą klasy, zależności między nimi i za co dana klasa będzie odpowiedzialna. Nie wiem jeszcze w jaki sposób będą zaprezentowane działania tworzonych klas - czy będzie to interfejs użytkownika, testy, czy też działanie na podstawie danych z pliku.

Mam nadzieję że znajdzie się dobra duszyczka i mi trochę w tym pomoże. To ma byc tylko sam pomysł więc raczej nie zajmie to zbyt wiele czasu doświadczonym programistom (zakładam, że jakies 5-10minut chyba że ktoś będzie chciał mi na poważnie pomóc =P ). Czekam na odpowiedzi.

Chcialem jeszcze podkreslic ze tematy ktore przerobilismy na wykladach to:

  • klasy autonomiczne
  • przeciazanie nazw i operatorow
  • skladowe statyczne i stale
  • agregacja i dziedziczenie
  • polimorfizm
  • funkcje wirtualne
  • obsluga bledow
  • szablony
  • dziedziczenie wielobazowe
  • strumienie
0
Andanista napisał(a)

[...]
Operacje op();
TrimCommand trim();
ChangeCommand change(„ala”,”ola”);
UpperCaseCommand toUpper();
op<<trim<<change<<toUpper;
cout<<op.apply(„ ala ma kota „);
// Wypisze „OLA MA KOTA”
[...]

ja rozumiem OOP wszystko fajnie, ale żeby do każdej operacji tworzyć osobna klasę to z lekka przegięcie

0

Może coś takiego:

class IOperator
{
public:
   virtual void Apply(string &str) const = 0;
   virtual ~IOperator() {};
};

class ChangeCommand : public IOperator
{
private:
   string from;
   string to;
public:
   ChangeCommand(const string &_from, const string &_to) : from(_from), to(_to) {}
   ChangeCommand(const ChangeCommand &cc) : from(cc.from), to(cc.to) {}

   virtual void Apply(string &str) const { /*...*/ }
};

class TrimCommand : IOperator
//reszta operatorów ...

class Operacje : private vector<IOperator*>
{
public:
   ~Operacje() { while(!empty()) { delete back(); pop_back(); } }

   string Apply(const string &str) { /*...*/ }

   template<class OperatorType>
   Operacje& operator<<(const OperatorType &op)
   {
      push_back(new OperatorType(op));
      return *this;
   }
};
0
crayze napisał(a)

ja rozumiem OOP wszystko fajnie, ale żeby do każdej operacji tworzyć osobna klasę to z lekka przegięcie

To nieelegancka próba obejścia ograniczeń języka, by stworzyć elegancki mechanizm :)

0

Oj Dodek, Dodek... bo Ty to byś chciał od razu multimetody i bóg wie co jeszcze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1