Czy separacja poleceń / zapytań dotyczy metody, która tworzy obiekt i zwraca jego identyfikator?

12

Udawajmy, że mamy usługę wywołującą proces biznesowy. Ten proces wywoła warstwę danych, aby utworzyć obiekt typu A w bazie danych.

Następnie musimy ponownie wywołać inną klasę warstwy danych, aby utworzyć instancję typu B w bazie danych. Potrzebujemy przekazać informacje o A dla klucza obcego.

W pierwszej metodzie tworzymy obiekt (modyfikujemy stan) i zwracamy jego identyfikator (zapytanie) w jednej metodzie.

W drugiej metodzie mamy dwie metody, jedną (createA) dla składowania i drugą (getId) dla zapytania.

    public void FirstMethod(Info info)
    {
        var id = firstRepository.createA(info);           
        secondRepository.createB(id);
    }

    public void SecondMethod(Info info)
    {
        firstRepository.createA(info);
        var key = firstRepository.getID(info);
        secondRepository.createB(key);
    }

Z mojego zrozumienia, druga metoda w pełni uwzględnia separację zapytań poleceń. Uważam jednak, że marnotrawienie i sprzeczność z intuicją polega na przeszukiwaniu bazy danych w celu uzyskania właśnie utworzonego obiektu.

Jak pogodzić CQS z takim scenariuszem?

Czy tylko druga metoda jest zgodna z CQS, a jeśli tak, czy w takim przypadku lepiej ją zastosować?

Gilles
źródło
2
jeśli A i B są tworzone razem z dowolną częstotliwością, prawdopodobnie utworzyłbym procedurę składowaną jednocześnie, a następnie odetniesz potencjał tworzenia B najpierw lub A utworzonego bez B, jeśli są to problemy.
Ryathal,
Wchodzenie w późną fazę gry, aby zaoferować opcję użycia parametru out. Z technicznego punktu widzenia nie jest to wartość zwrotna! ;)

Odpowiedzi:

13

CQS jest raczej wytyczną niż bezwzględną regułą. Zobacz artykuł wiki, aby zapoznać się z przykładami działań, które są niemożliwe przy ścisłym CQS.

Jednak w tym przypadku, jeśli chcesz zachować CQS, możesz albo utworzyć identyfikator po stronie klienta (np. GUID), albo klient może zażądać identyfikatora z systemu przed utworzeniem jakichkolwiek obiektów, co wydaje się czystsze mnie niż tworzenie obiektu, a następnie wyszukiwanie go (ale jest trudniejsze niż użycie kolumny tożsamości).

Osobiście po prostu zwrócę identyfikator i nazwałbym go jedną z tych sytuacji, w których CQS nie pasuje.

Kolejny dobry artykuł z przykładami: Martin Fowler

Misko
źródło
3

Jeśli zastosujesz metodologię, która wydaje się poprowadzić cię na złe ścieżki, powinieneś ją ponownie ocenić.

Widzę, że identyfikator nowo utworzonego obiektu jest prawidłową rzeczą, którą należy mieć jako parametr zwracany - jest nie tylko wygodny, ale także „dobry” - ponieważ widać, że kod jest lepszy, gdy to robi.

W każdym razie nie jestem zaznajomiony z „separacją zapytań poleceń”, ale bardzo wątpię, aby uniemożliwiało komendom zwracanie informacji o wykonywaniu poleceń, a jeśli tak, to po prostu wyrzuć je - sukces / porażka zawsze tam jest, i robię to nie myśl, że „Twój obiekt został utworzony OK” z „Twój obiekt został utworzony OK, a jego identyfikator to xxx”, aby być znacznie innym.

alex
źródło
-1

Tylko druga metoda jest zgodna z CQS.

Uważam CQS za wskazówkę zachęcającą do dobrych praktyk kodowania. Skorzystaj z dobrych praktyk kodowania podczas programowania, a jeśli później dowiesz się, że ta metoda zawiera kod krytyczny dla zasobów, nadal możesz go zoptymalizować.

Przedwczesna optymalizacja jest źródłem wszelkiego zła :)

Cheesus mówi: przestań strzelać modami
źródło
Co jest szczególnie dobre w drugiej metodzie?
CheatEx
Nie powiedziałem, że druga metoda jest „dobra”. Powiedziałem, że jest to zgodne z paradygmatem CQS. Jeśli nie przestrzegasz CQS, przypuszczam, że druga metoda nie jest dla ciebie dobra. Jeśli chcesz wiedzieć, dlaczego niektórzy ludzie próbują stosować CQS, zobacz http://en.wikipedia.org/wiki/Command-query_separation
cheesus mówi, przestań strzelać modami
Powiedziałeś, że CQS zachęca do dobrych praktyk kodowania, jeśli jest to prawdą, powinniśmy zaobserwować pewien rodzaj „dobroci” w drugiej metodzie. Gdzie to jest?
CheatEx
Najwyraźniej nie przeczytałeś linku, który podałem. Fraza CQS: Zadanie pytania nie powinno zmienić odpowiedzi . W pierwszej metodzie masz metodę („createA”), która zapewnia „odpowiedź”, ale zmienia odpowiedź za każdym razem, gdy pytasz. W drugiej metodzie tego nie masz, jest to „dobroć”. Żeby było jasne: nie jestem purystą CQS, nie przestrzegam tego za każdym razem.
Cheesus mówi: przestań strzelać do modów