Model struktury klas dla własnego formatu wiadomości

0

Witam, chciałbym odpowiednio zaprojektować klasy dla własnego formatu wiadomości tak, aby można było w elastyczny sposób je rozbudowywać i wygodnie tworzyć obiekty reprezentujące konkretne wiadomości. Nie mam niestety doświadczenia jeżeli chodzi o wzorce projektowe i związane z nimi koncepcje, które zapewne będzie trzeba wykorzystać, aby utworzyć logiczną strukturę klas.

Format wiadomości: w załączniku.

Krótki opis: Każda wiadomość składa się z nagłówka (elementy od priority do pierwszego checksum) oraz części właściwej (klucz, część przeznaczona dla konkretnej usługi oraz druga checksuma). Wiadomość usługi A część przeznaczoną do wykorzystania przez usługę (w części właściwej) odpowiednio organizuje (typ wiadomości, zawartość). Usługa A może utworzyć 4 typy wiadomości, które specyfikują pole zawartości.

Potrzebuje takiej struktury klas, abym mógł np. rozszerzyć w prosty sposób funkcjonalność usługi A o nowe typy wiadomości oraz w prosty sposób zbudować dany typ wiadomości (np. funkcja zbuduj wiadomość 1 usługi A). Sporo nad tym myślałem, ale niestety do niczego konkretnego nie doszedłem (pewnie ze względu na braki wiedzy, jeżeli chodzi o wzorce itp). Przykładowo jakoś to zorganizować aby: określić, że cześć właściwa wiadomości składa się z elementu 1, 2 i 3 (konkretnie jak wygląda element 2 ma być wyspecyfikowane przez daną usługę, która doprecyzowuje, że element 2 zawiera elementy x i y, natomiast konkretna wiadomość tej usługi dalej określa jaka jest szczegółowa struktura elementu y).

0

ale przecież wszystko oprócz key i service content załatwia Ci ramka TCP i IP

0

Ten format został opracowany w ramach projektu dla specyficznej sieci DTN i elementy w nim występujące są wymagane na poziomie skonstruowanego protokołu, aby cały system działał zgodnie z założeniami. Wszystko zostało przetestowane i działa prawidłowo, dlatego jest tam wszystko co potrzebne, zorganizowane w ramach segmentów TCP. Pola z TCP i IP nie odpowiadają tym tutaj widocznym, np. TTL nie jest tym samym co TTL z IP, ale nie chciałem wchodzić szczegółowo w specyfikę skonstruowanego protokołu. To zostało już zaprogramowane, ale niestety w taki sposób (w postaci 1 klasy), że ciężko jest to rozbudować i używać przez kogoś innego niż autor (mnie), dlatego próbuje jakoś logicznie pogrupować i zorganizować klasy, które będą opisywać ten format wysyłanych wiadomości.

0

no to skoro masz ramkę z dość sztywną strukturą to nie bardzo wiem co chcesz zmieniać. Chyba, że chodzi Ci o jakiś "ładny" sposób na generowanie ramki z różnego kontentu. Ja bym to ubrał np. tak:

klasa załącznik z polami name, mime, size (może się wyliczać samo na podstawie reszty danych), data i metodą ToFrame (czy jak ją tam nazwiesz) zwracającą "gotowy" kawałek ramki

klasa mail z polami CD, from, to, subject, body, List<Załącznik> i metodą ToFrame

klasa kontent z polami username, server, pass i metodą ToFrame
klasa kontent_mail dziedzicząca po kontent z polem mail (pole mail typu mail :) ) i metodą ToFrame
klasa kontent_time dziedzicząca po kontent z polem time_interval i metodą ToFrame
(podobnie dla odpowiedzi)

klasa ramka, która załatwia wszystkie pola poza i metodą ToFrame

I teraz tak np. dla ramki kontent_mail metoda ToFrame powinna wywołać metodę ToFrame na obiekcie mail i do niej dokleić dane z ToFrame klasy bazowej i własne dane

0

Na bazie Twojej odpowiedzi + trochę układając sobie całość w głowie utworzyłem diagram klas (zawarty w załączniku)

Krótki opis:
BundleMessage - klasa wiadomości, składa się z nagłówka BundleHeader i cześci przeznaczonej na dane BundlePayload

BundlePayload - klasa abstrakcyjna, definiuje, że cześć przeznaczona na dane zgodnie z protokołem musi zawierać klucz, cześć przeznaczoną do wykorzystania przez konkretną usługę jako właściwość abstrakcyjna klasy ServiceContent oraz checksumę

ServiceContent - klasa abstrakcyjna definiująca obszar przeznaczony dla usługi (tutaj w zasadzie tylko jedna metoda wymagana ToFrame(), konkretne pola zdefiniowane będą w klasach pochodnych)

MailServiceContent - klasa abstrakcyjna dziedzicząca po ServiceContent, która określa dalszą strukturę jaką musi przestrzegać usługa typu poczty elektronicznej (czyli posiadać messageType oraz dane uwierzytelniające użytkownika (username, password, mailserver lub userid)

MailBundlePayload - klasa określająca konkretnie BundlePayload i definiująca właściwość abstrakcyjną typu ServiceContent (która musi być zdefiniowana) jako typ MailServiceContent

MessageOneContent - klasa dziedzicząca po MailServiceContent dodająca specyficzne dane dla wiadomości numer 1.

I tak jak trzeba by było stworzyć wiadomość 1 utworzony zostałby obiekt BundleMessage, gdzie BundlePayload jest typu MailBundlePayload ze zdefiniowanym MailServiceContent jako MessageOneContent.

W sumie wydaje mi się, że to ma sens. Czy może ktoś potwierdzić, że model jest programistycznie "dobry" i logiczny?

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