Bezpaństwowość a stanowa

95

Interesują mnie artykuły zawierające konkretne informacje na temat projektowania bezstanowego i stanowego w programowaniu. Jestem zainteresowany, ponieważ chcę dowiedzieć się więcej na ten temat, ale naprawdę nie mogę znaleźć żadnych dobrych artykułów na ten temat. Przeczytałem dziesiątki artykułów w Internecie, które niejasno omawiają ten temat lub mówią o serwerach i sesjach internetowych - które również są `` stanowe i bezstanowe '', ale interesuje mnie bezstanowe vs stanowe projektowanie atrybutów w kodowaniu . Przykład: Słyszałem, że klasy BL są z założenia bezstanowe, klasy encji (a przynajmniej tak je nazywam - jak Person (id, name,…)) są stanowe itp.

Myślę, że ważne jest, aby wiedzieć, ponieważ wierzę, że jeśli to zrozumiem, będę mógł napisać lepszy kod (np. Mając na uwadze szczegółowość).

W każdym razie, naprawdę krótko, oto, co wiem o stanowych i bezpaństwowych:

Stanowe (jak WinForms): przechowuje dane do dalszego wykorzystania, ale ogranicza skalowalność aplikacji, ponieważ jest ograniczona przez procesor lub limity pamięci

Bezstanowe (podobnie jak ASP.NET - chociaż ASP próbuje być stanowy z ViewStates): po zakończeniu akcji dane są przesyłane, a instancja jest przekazywana z powrotem do puli wątków (amorficzna).

Jak widać, są to dość niejasne i ograniczone informacje (i dość skoncentrowane na interakcji z serwerem), więc byłbym naprawdę wdzięczny, gdybyś mógł podać mi kilka smaczniejszych informacji :)

Team-JoKi
źródło

Odpowiedzi:

58

Proponuję zacząć od pytania w StackOverflow, które omawia zalety programowania bezstanowego. Jest to bardziej w kontekście programowania funkcjonalnego, ale to, co przeczytasz, ma zastosowanie również w innych paradygmatach programowania.

Programowanie bezstanowe jest powiązane z matematycznym pojęciem funkcji, która wywoływana z tymi samymi argumentami zawsze zwraca te same wyniki. Jest to kluczowa koncepcja paradygmatu programowania funkcjonalnego i spodziewam się, że będzie można znaleźć wiele odpowiednich artykułów w tej dziedzinie.

Innym obszarem, który możesz zbadać, aby uzyskać więcej informacji, są usługi sieciowe RESTful. Są one z założenia „bezstanowe”, w przeciwieństwie do innych technologii internetowych, które próbują w jakiś sposób utrzymać stan. (W rzeczywistości to, co mówisz, że ASP.NET jest bezstanowy, nie jest poprawne - ASP.NET usilnie stara się utrzymać stan przy użyciu ViewState i zdecydowanie należy je scharakteryzować jako stanowe. Z drugiej strony ASP.NET MVC jest technologią bezstanową). Jest wiele miejsc, w których omawia się „bezpaństwowość” usług sieciowych RESTful (takich jak ten spot na blogu), ale możesz ponownie zacząć od pytania SO .

kgiannakakis
źródło
W porządku, dzięki za informację, rzuciłem okiem na link i znalazłem kilka ciekawych informacji! Chociaż wciąż jestem otwarty na więcej;)
Team-JoKi
Dodałem kolejny obszar, w którym stanowe i bezstanowe są ważnym czynnikiem (usługi sieciowe RESTful).
kgiannakakis
Dzięki za informację!
Zagłosowałbym
wiele aplikacji internetowych jest pełnych stanu, ponieważ ta sama strona rejestracji daje różne wyniki dla kredytów użytkowników ... Pierwsza rejestracja zakończy się powodzeniem ... druga rejestracja z tymi samymi danymi wejściowymi zakończy się niepowodzeniem .... ponieważ aplikacja internetowa ma gdzieś zapisany stan użytkownika .może to być baza danych lub inna pamięć masowa
czuć się dobrze i programować
85

Bezpaństwowość oznacza, że ​​nie ma pamięci o przeszłości. Każda transakcja przebiega tak, jakby była wykonywana po raz pierwszy.

Stanowy oznacza, że ​​istnieje pamięć o przeszłości. Poprzednie transakcje są zapamiętywane i mogą mieć wpływ na bieżącą transakcję.

Bezpaństwowcy:

// The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

Stanowy:

// The state is maintained by the function

private int _number = 0; //initially zero

function int addOne()
{
   _number++;
   return _number;
}

Zobacz: /software/101337/whats-the-difference-between-stateful-and-stateless

Ankit
źródło
73

Stateful aplikacja jest jeden, który przechowuje informacje o tym, co działo się lub zmienione, ponieważ zaczął biec. Wszelkie publiczne informacje o tym, w jakim „trybie” się znajduje, lub ile rekordów zostało przetworzonych, lub cokolwiek innego, czynią go stanowym.

Aplikacje bezstanowe nie ujawniają żadnej z tych informacji. Za każdym razem dają tę samą odpowiedź na to samo żądanie, wywołanie funkcji lub metody. HTTP jest bezstanowe w swojej surowej postaci - jeśli wykonasz GET do określonego adresu URL, otrzymasz (teoretycznie) tę samą odpowiedź za każdym razem. Wyjątkiem jest oczywiście sytuacja, w której zaczynamy dodawać stanowość na wierzchu, np. Z aplikacjami internetowymi ASP.NET :) Ale jeśli pomyślisz o statycznej witrynie zawierającej tylko pliki HTML i obrazy, wiesz, o co mi chodzi.

Lucas Wilson-Richter
źródło
18

Przymiotnik Stanowy lub Bezstanowy odnosi się tylko do stanu konwersacji, nie jest związany z koncepcją funkcji, która zapewnia to samo wyjście dla tego samego wejścia. Jeśli tak, każda dynamiczna aplikacja internetowa (z bazą danych) byłaby usługą stanową, co jest oczywiście fałszywe. Mając to na uwadze, jeśli powierzam zadanie utrzymania stanu konwersacji w podstawowej technologii (takiej jak sesja coockie lub http), wdrażam usługę stanową, ale jeśli wszystkie niezbędne informacje (kontekst) są przekazywane jako parametry I ' m implementowanie usługi bezstanowej. Należy zauważyć, że nawet jeśli przekazany parametr jest „identyfikatorem” stanu konwersacji (np. Bilet lub sessionId) to nadal działamy w ramach usługi bezstanowej,

Marco
źródło
Nie jestem pewien, czy spełnienie session identifierkażdego żądania może zostać uznane za bezpaństwowe. Moim zdaniem taki przypadek zostałby uznany za stanowy. Jeśli jednak zawsze przekazujesz tokenużytkownikowi a, ale nie masz żadnego innego stanu, to jest to stan bezstanowy. Ale czuje stanowy XD. To jest takie zagmatwane.
7hi4g0
4

Pieniądze przelewane online z jednego konta na inne są stanowe, ponieważ rachunek odbiorcy zawiera informacje o nadawcy. Przekazywanie gotówki od osoby innej osobie jest transakcją bezpaństwową, ponieważ po otrzymaniu gotówki nie ma tożsamości dawcy wraz z gotówką.

S Upendra rao
źródło
1

Tylko po to, aby dodać wkład innych osób ... Innym sposobem jest spojrzenie na to z serwera WWW i punktu widzenia współbieżności ...

HTTP ma charakter bezstanowy z jakiegoś powodu… W przypadku serwera WWW bycie stanowym oznacza, że ​​musiałby on zapamiętać „stan” użytkownika dla jego ostatniego połączenia i / lub utrzymywać otwarte połączenie z żądającym. Byłoby to bardzo kosztowne i „stresujące” w przypadku aplikacji z tysiącami jednoczesnych połączeń ...

Bycie bezstanowym w tym przypadku oznacza oczywiste efektywne wykorzystanie zasobów ... tj. Obsługę połączenia w pojedynczym wystąpieniu żądania i odpowiedzi ... Brak narzutu utrzymywania otwartych połączeń i / lub zapamiętywania czegokolwiek z ostatniego żądania ...

Ken.Fukizi
źródło
-3

Sprawiamy, że Webapps staje się pełny, zastępując zachowanie bezstanowe HTTP przy użyciu obiektów sesji. Gdy używamy obiektów sesji, stan jest przenoszony, ale nadal używamy tylko HTTP.

czuć się dobrze i programować
źródło
-3

Miałem te same wątpliwości co do projektowania klas bezstanowych v / s i przeprowadziłem pewne badania. Właśnie zakończone, a moje ustalenia zostały opublikowane na moim blogu

  • Klasy jednostek muszą być stanowe
  • Klasy pomocnika / pracownika nie powinny być stanowe.
Joy George Kunjikkuru
źródło