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ą).
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