W języku C# interfejs IEnumerator definiuje sposób przechodzenia przez kolekcję i przeglądania elementów. Myślę, że jest to niezwykle użyteczne, ponieważ jeśli podasz IEnumerable<T>
dla metody, to nie zmodyfikujesz oryginalnego źródła.Dlaczego Iterator definiuje operację remove()?
Jednak w Javie Iterator definiuje operację remove na (opcjonalnie!) Pozwalającą usuwać elementy. Nie ma żadnej korzyści przy przekazywaniu do metody Iterable<T>
, ponieważ ta metoda może nadal modyfikować oryginalną kolekcję.
remove
„s optionalness jest przykładem refused bequest zapachu, ale nie zważając, że (już omówione here) Byłbym zainteresowany decyzji projektowych, które wywołało zdarzenie remove
być realizowane w interfejsie.
Jakie są decyzje projektowe, które doprowadziły do dodania remove
do Iterator
?
Innymi słowy, jaka jest decyzja projektowa C#, która jawnie nie ma remove
zdefiniowanej na IEnumerator
?
'Niezmodyfikowalny XYZ' jest jednak tylko runtime, lubię statyczne niezmienniki. Byłem bardziej zainteresowany decyzją projektową, która doprowadziła do dodania 'remove' i być może dlatego C# nie wybrał zbyt. –
Najgorsze w użyciu 'unmodifiableXYZ' jest to, że jeśli ktoś przekazał' XYZ', który jest już zapakowany, możesz owijać go dwukrotnie, i nie masz sposobu, aby tego uniknąć, chyba że użyjesz refleksji, aby to rozpracować. Chociaż uważam, że wdrożenie to zoptymalizuje, nadal jest dla mnie zbyt złe. –
Patrząc na implementację OpenJDK, nie wydaje się, aby uniknąć wielokrotnego zawijania. Oznacza to, że w skomplikowanej aplikacji możesz wreszcie owinąć prostą 'ArrayList' przez 100 lub więcej razy. –