Dlaczego korzystać z generatorów komunikatów

msm

Ale o co chodzi?

Wszedłeś właśnie na stronę swojego serwisu społecznościowego. Następny komunikat jaki ujrzysz może wyglądać na przykład tak:

	Witaj Adamie!

	Ostatni raz odwiedziłeś nas 24.03.2010 r. z IP 127.0.0.1.
	Od tego czasu na forum przybyło 40 nowych postów które mogą cię zainteresować.

Każdy prawie programista ma czasami konieczność wykonania takiego komunikatu.
Kod kryjący się za takimi $$$ zazwyczaj wygląda mniej-więcej tak:

	"Witaj " + UserName + "!\n\n" +
	"Ostatni raz odwiedziłeś nas " + LastVisitDate + " z IP + " LastIP + ".\n" +
	"Od tego czasu na forum przybyło " + Count + " nowych postów które mogą cię zainteresować."

Takie rozwiązanie jest niewątpliwie proste w programowaniu i intuicyjne... Ale też nieczytelne i trudne do modyfikacji.

Generator komunikatów

Lepszym sposobem byłoby napisanie jakiegoś generatora komunikatów tworzącego gotowe wiadomości z podanego schematu, mogącego wyglądać na przykład tak:

	Witaj %0!
	
	Ostatni raz odwiedziłeś nas %1 r. z IP %2.
	Od tego czasu na forum przybyło %3 nowych postów które mogą cię zainteresować.

Za pomocą znaku '%' odnosimy się do pola w jakimś rekordzie/strukturze.

Taki schemat mógłby być interpretowany przez następujący pseudokod

	odczytaj rekord;;
	pętla po wszystkich znakach w schemacie
		c = następny znak;
		if (c != %) dodaj do bufora c;
		else 
			switch (c)
				'0'..'9': dodaj do bufora wartość c-tego pola rekordu;
				'%': dodaj do bufora '%';
				default: zgłoś błąd w schemacie

Implementacja

Oto przykładowa implementacja w C. Jej zaletą w porównaniu z *printf jest swoboda kolejności pól we wzorcu.

void template (char *f, char **data)
{
  char c, n, *p;
  while (c = *f++) {
    if (c == '%') {
      n = *f++;
      if (n >= '0' && n <= '9') {
        p = data[n - '0'];
        while (c = *p++)
          putchar (c);
      } else if (n == '%') {
        putchar ('%');
      }
    } else
      putchar (c);
  }
}

Podsumowanie

Na zakończenie tego krótkiego artykułu dodaj jeszcze podsumowanie najważniejszych wad i zalet takiego rozwiązania.

Zalety:

  • Kod jest krótszy.
  • ...i czytelniejszy.
  • DRY (wystarczy jedna metoda do wysyłania wszystkich możliwych wiadomości).
  • Modyfikacja schematu nie wymaga modyfikacji kodu.
  • ...oraz jest prostsza (bez bawienia się w \n etc)
  • W prosty sposób można przenieść schematy do plików zewnętrznych.
  • Rozdzielenie logiki od prezentacji
  • W przypadku wielu różnych generowanych komunikatów - szybskość implementacji.

Wady

  • W przypadku małych programów nie ma sensu pisać generatora
  • Generowanie jest wolniejsze (chociaż można napisać np. jakąś prekompilacje dla schematów - wszystko zależy od ciebie, to ty jesteś programistą).

1 komentarz

tak ten.. tylko, że większość znanych mi języków ma coś takiego jak printf/sprintf/etc.
Albo nie łapię Twojej idei, albo to jest bez sensu