Ustawianie opcji dla kilku możliwych typów za pomocą jednej klasy opakowującej

0

Mam nadzieję, że kod rozjaśni o co mi chodzi ale mówiąc krótko mam jedną klasę w publicznym API która w konstruktorze przyjmuje enuma a na jego podstawie jest tworzony wewnętrznie konkretny obiekt klasy bazowej.
Pseudokod:

class AbstractDevice
{
public:
    virtual void run();
};

class LocalDevice : public AbstractDevice
{
public:
    void run() override;
    // have specicifc options
};

class RemoteDevice : public AbstractDevice
{
public:
    void run() override;
    // have specicifc options
};


// API class
class Device
{
public:
    enum class Type {
        Local,
        Remote
    };

    explicit Device(Device::Type type);
    void run();
};

I teraz szukam najlepszego sposobu na ustawianie opcji / konfiguracji klasy device a właściwie localDevice lub remoteDevice. Problem w tym, że nie wszystkie opcje są wspólne, istnieją takie ale każda ma też swoje unikalne więc mógłbym zrobić tak jak jest to w Qt że mam sporego enuma ze wszystkimi możliwymi opcjami dla wszystkich klas i w dokumentacji piszę że opcja x ma zastosowanie tylko do klasy localDevice a opcja y jest dla wszystkich itd.

I wtedy w API mogłoby to wyglądać tak:

Device device(Device::Type::Local);
device.setOption(Device::CryptographicHash, Device::Sha2);

device.run(); // -> LocalDevice::run();

Czy coś takiego wygląda ok? Czy jest lepszy sposób na tego typu problemy? Jakiś wzorzec?

0

Nie wiem co to za technologia, ale nic z tego nie rozumiem. Napisz dokładnie co to ma robić, bo na razie nie ma to sensu.

Co do drugiej części (kodu i dwóch linijek tekstu), to jak chcesz konfigurować obiekt w locie, to może warto skorzystać z Buildera lub Dekoratora. Zalecam Ci abyś najpierw napisał działający kod, przetestował go dokładnie a dopiero na końcu szukał wzorca, bo inaczej zaimplementujesz ich bardzo dużo w tym samym miejscu (jeden po drugim), ale nie nauczysz się jak to powinno się robić.

0

Szukam sposobu na ustawianie opcji wewnętrznych klas za pomocą jednej klasy publicznego API, w tym wypadku klasy Device z tym, że niektóre opcje są specyficzne tylko dla konkretnej klasy, inne wspólne dla wszystkich itd. I tak np linijka

device.setOption(Device::CryptographicHash, Device::Sha2);

ma sens dla klasy LocalDevice ale już dla klasy RemoteDevice nie bo ona z takiej opcji w ogóle nie korzysta. Więc musiałbym to oznaczyć w dokumentacji klasy. To rozwiązanie działa ale pytam bo może ktoś zna coś lepszego i być może jest na to jakiś wzorzec. Nie szukam go na siłę. Nie potrafię prościej tego wytłumaczyć.

0

Na pewno jest coś nie tak z kodem wywołującym(operującym na klasach), jeżeli miotasz się w takich sprawach.
Wywołaj sobie metodę set... ze zmienną liczbą argumentów, a wewnątrz odczytuj tylko te, które są Ci potrzebne.
Może to być przyczyna późniejszych błędów, bo uzależniasz wszystko od tego, coś jest nie tak.

Przyjrzyj się wzorcowi Builder na przykładzie, oraz Dekorator. Możliwe, że któreś z rozwiązań Ci przypasuje.
Do pytań o wzorce podawaj kody klas zależnych oraz testy jednostkowe/modułowe(nie musisz podawać wszystkiego), bo tutaj jest forum programistów, a nie wróżek.

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