6

Scala dostarcza niezmiennych kolekcji, takich jak Set, List, Map. Rozumiem, że niezmienność ma zalety w równoległych programach. Jakie są jednak zalety niezmienności w regularnym przetwarzaniu danych?Jakie są rzeczywiste zalety niezmiennych kolekcji?

Co się stanie, jeśli wymienię na przykład subsets, permutations i combinations? Czy niezmienne zbiory mają tutaj jakąkolwiek przewagę?

Odpowiedz

10

Jakie są zalety niezmienności w regularnym przetwarzaniu danych?

Ogólnie mówiąc, niezmienne obiekty są łatwiejsze do zrozumienia.

+3

Mniej stan = mniej analizy. –

+0

Co umożliwia narzędziom (tj. Kompilatorom) wykonywanie większej liczby optymalizacji – michid

+1

Zgadzam się, a to oznacza, że ​​używanie niezmiennych obiektów tworzy kod, który jest częściej poprawny po raz pierwszy. Wraz z pisaniem statycznym powoduje to, że kod Scala wymaga zadziwiająco małego debugowania. –

7

To robi. Ponieważ wymieniasz kolekcję, prawdopodobnie chcesz mieć pewność, że elementy nie zostały przypadkowo dodane lub usunięte podczas wyliczania.

Niezmienność jest w dużym stopniu paradygmatem w programowaniu funkcjonalnym. Tworzenie niezmiennych zbiorów pozwala myśleć o nich bardzo podobnie do prymitywnych typów danych (tj. Modyfikowanie kolekcji lub dowolnego innego obiektu powoduje utworzenie innego obiektu, tak samo jak dodanie 2 do 3 nie modyfikuje 3, ale tworzy 5)

+0

To bardzo ciekawy komentarz - wydaje się, że daje ci "transakcyjną" semantykę na twoich danych, tzn. Jeśli zrobisz 'for ((k, v) <- myMap) {something (k, v)}' and someone robi 'myMap + = k2 -> v2' w środku' coś', nadal będziesz sprawdzał migawkę tego, co 'myMap' miał po uruchomieniu pętli. Dobrze? Nigdy o tym nie myślałem. –

4

Jeśli Twoje dane nie zmieniają się po utworzeniu, używaj niezmiennych struktur danych. Wybrany typ określa cel użycia. Coś bardziej konkretnego wymagałoby wiedzy na temat danego obszaru problemu.

Naprawdę możesz chcieć szukać podzbioru, permutacji lub generatora kombinacji, a wtedy dyskusja na temat struktur danych jest dyskusyjna.

Wspomniał Pan również o tym, że rozumiecie równoległe zalety. Prawdopodobnie rzucasz jakiś algorytm na permutacje i podzbiory i istnieje duża szansa, że ​​algorytm może być w pewnym stopniu zrównoleglony. W takim przypadku, użycie niezmiennych struktur z przodu zapewni początkową implementację algorytmu X, który będzie łatwo przekształcony w współbieżny algorytm X.

6

Aby rozwinąć odpowiedź Matta: Z własnego doświadczenia mogę powiedzieć, że implementacje algorytmów oparte na drzewach wyszukiwania (np. szerokość, najpierw głębia, cofanie) przy użyciu zbiorów zmiennych, kończą się regularnie jako parująca kupa bzdur: albo zapominasz skopiować kolekcję przed wywołaniem rekursywnym, albo nie przywrócisz poprawnych poprawek, jeśli odzyskasz kolekcję. W tym obszarze niezmienne zbiory są wyraźnie lepsze. Skończyłem pisząc własną, niezmienną listę w Javie, gdy nie mogłem dostać problemu z kolekcjami Javy. I oto pierwsza "niezmienna" implementacja działała natychmiast.

+1

Mam nadzieję, że nie napisałeś tej niezmiennej implementacji list za każdym razem zbyt niedawno, ponieważ mieliśmy ['Collections # unmodifiableList()' (Java SE)] (http://download.oracle.com/javase/7/docs /api/java/util/Collections.html#unmodifiableList%28java.util.List%29) i ['ImmutableList' (Google Guava)] (http://docs.guava-libraries.googlecode.com/git-history/ v9.0/javadoc/com/google/common/collect/ImmutableList.html) przez pewien czas. –

+1

'UnmodifiableList' nie jest w ogóle użyteczna, np. nie można uzyskać listy z dodatkowym elementem z powrotem. Guava jest fajny, ale czasami przesadny. Najlepszą niezmienną implementacją list, którą znam, jest http://functionaljava.org – Landei

2

mam kilka zalet dodać do listy:

  1. niezmiennymi zbiory nie mogą podważyć spod ty

    Oznacza to, że jest to całkowicie w porządku mieć niezmienne członków Val publicznego o klasa Scala. Z definicji są one tylko do odczytu. Porównaj z Javą, gdzie nie tylko musisz pamiętać, aby uczynić członka prywatnym, ale także napisać metodę get, która zwraca kopię obiektu, aby oryginał nie został zmodyfikowany przez kod wywołujący.

  2. Niezmienne struktury danych są trwałe.Oznacza to, że niezmienna kolekcja uzyskana przez wywołanie filter na twoim TreeSet faktycznie udostępnia niektóre z jej węzłów z oryginałem. Przekłada się to na oszczędność czasu i przestrzeni oraz kompensuje niektóre kary wynikające z niezmienności.

0

niektóre z zalet niezmienność:

1 - mniejszy margines błędu (zawsze wiedzieć, co jest w twojej kolekcji i tylko do odczytu zmiennych).

2 - możesz pisać programy współbieżne, nie martwiąc się o wątki na siebie nawzajem podczas modyfikowania zmiennych i kolekcji.

Powiązane problemy