Dlaczego widzę tak wiele natychmiastowych zajęć bez stanu?

18

W świecie C ++ i Java widzę wiele możliwych do natychmiastowego utworzenia klas, które nie mają żadnego stanu.

Naprawdę nie mogę zrozumieć, dlaczego ludzie to robią, mogliby po prostu użyć przestrzeni nazw z darmowymi funkcjami w C ++ lub klasy z prywatnym konstruktorem i tylko statycznymi metodami w Javie.

Jedyną korzyścią, jaką mogę wymyślić, jest to, że nie musisz zmieniać większości kodu, jeśli później zdecydujesz, że chcesz innej implementacji w określonych sytuacjach. Ale czy nie jest to przypadek przedwczesnego projektowania? Można go później przekształcić w klasę, kiedy / jeśli stanie się to właściwe.

Czy mylę się? Czy to nie OOP, jeśli nie umieszczę wszystkiego w obiektach (tj. Klasach instancji)? Dlaczego więc jest tak wiele przestrzeni nazw i klas narzędzi w standardowych bibliotekach C ++ i Java?

Aktualizacja: Z pewnością widziałem wiele przykładów tego w moich poprzednich pracach, ale staram się znaleźć przykłady open source, więc może nie jest to wcale takie powszechne. Mimo to zastanawiam się, dlaczego ludzie to robią i jak często to się dzieje.

futlib
źródło
2
Trudno odpowiedzieć bez określenia „tak często”. Nie mogę powiedzieć, że często to widzę. Zastanów się nad zmianą Q na coś takiego: „jak przydatne są klasy bez ivarów?”
Caleb
@Caleb Poszukam przykładów w projektach open source. Zdecydowanie dużo widziałem w sklepach Java, w których pracowałem.
futlib
@futlib: tak, to jest powszechne. stackoverflow.com/questions/4692845/…
Hoàng Long
Czy uważasz, że klasa zawiera tylko np. EntityManager nie zawiera stanu?
user470365

Odpowiedzi:

22

W świecie C ++ i Java widzę wiele możliwych do natychmiastowego utworzenia klas, które nie mają żadnego stanu.

Oto kilka możliwych powodów tworzenia klas bez własnych ivarów:

  • Stan jest lub może być zawarty w nadklasie.

  • Klasa implementuje interfejs i musi być możliwa do utworzenia, aby instancje mogły być przekazywane do innych obiektów.

  • Klasa ma być podklasą.

  • Przydatny sposób grupowania powiązanych funkcji. (Tak, mogą być lepsze lub różne sposoby na zrobienie tego samego.)

Czy mylę się? Czy to nie OOP, jeśli nie umieszczę wszystkiego w obiektach (tj. Klasach instancji)?

OOP jest paradygmatem, a nie prawem natury. Istnieje kilka języków, w których wszystko jest przedmiotem, więc naprawdę nie masz wyboru. Inne języki (np. C) w ogóle nie obsługują OOP, ale nadal możesz programować w stylu obiektowym. Powiedziałbym, że możesz mieć OOP, jeśli nie zrobisz wszystkiego na zajęciach ... możesz powiedzieć, że w takim przypadku masz po prostu mniej OOP.

Caleb
źródło
4

Caleb i Robert Harvey wskazali już, jakie są klasy użyteczności i jakie są uzasadnione powody posiadania klas „bez danych”. Te opisy są trafne, ale dotyczą pozytywnych aspektów.

Chciałbym tylko wspomnieć, że nadużywanie klas użyteczności może zdecydowanie być anty-wzorcem OO (patrz opis c2wiki ). Ten cytat ładnie podsumowuje:

Duża liczba takich klas (szczególnie tych z jedną metodą) wskazuje, że projektanci myślą do góry nogami, tj. myśląc o tym, co można zrobić z przedmiotem, a nie o tym, co może zrobić obiekt.

Jeśli twierdzisz, że ćwiczysz projektowanie obiektowe, ale twoja baza kodu składa się prawie wyłącznie z klas użyteczności, powiedziałbym, że zdecydowanie robisz coś złego. To powiedziawszy, funkcjonalne podejście ma tyle samo zalet i może być również doskonałe do pracy. Po prostu nie rób tego, że podążasz za tym, a bez entuzjazmu wdrażasz drugie.

Daniel B.
źródło
2

Klasy narzędzi w Javie i C ++ służą do utrzymywania biblioteki metod, które przyjmują jeden lub więcej parametrów wejściowych i zwracają wynik. Nie muszą utrzymywać stanu, jeśli po prostu zwracają wartość. Pod tym względem metody te można uznać za prymitywną formę programowania funkcjonalnego, ze wszystkimi jego zaletami (z jednej strony brak problemów ze współbieżnością).

W każdym razie klasy te służą jedynie do grupowania powiązanych metod w jednym kontenerze, metod, które nie wymagają tworzenia instancji obiektu w celu poprawnego działania. Przykładem takiej klasy jest klasa matematyczna zawierająca funkcje SINE i COSINE (i inne matematyczne).

Robert Harvey
źródło
2

Wiele z tych klas wchodzi w interakcje z danymi, nawet jeśli nie zawierają ich jawnie, i muszą to robić w sposób, który wymaga wielu jednoczesnych wystąpień, aby być aktywnymi. Np. Bezstanowy komponent sesji, który współdziała z procedurą przechowywaną w bazie danych, przekazując przychodzące dane do jakiegoś pakietu PL / SQL i przekazując wyniki z powrotem do aplikacji wywołującej. Ta rzecz musi istnieć w wielu instancjach, ale sama nie zawiera żadnych pól danych.

jwenting
źródło
0

W językach zorientowanych obiektowo, w których klasy nie są obiektami, możesz zrobić o wiele więcej z obiektem niż klasą.

Możesz przekazać obiekt jako parametr, możesz podstawić obiekt zgodny z typem, możesz zaimplementować interfejs (wyobrażam sobie, że istnieją języki, w których klasy są obiektami, ale możesz wykonać niektóre z tych rzeczy, ale w każdym razie ...) . Wszystkie te rzeczy są dość ważne, więc domyślną decyzją jest zazwyczaj utworzenie klasy.

Wydaje się, że w przypadku niektórych klas możliwości przyznane przez tworzenie instancji nie będą potrzebne. Prawdopodobnie nie będziesz musiał na przykład zamieniać jednej implementacji Cosine na inną. Okazuje się, że w większości funkcje narzędziowe nie potrzebują tych możliwości, więc w większości są to funkcje narzędziowe, których klasy nie są możliwe do utworzenia.

psr
źródło