Czy „małpa łata” naprawdę jest taka zła?
Niektóre języki, takie jak Ruby i JavaScript mają otwarte klasy, które pozwalają na zmianę interfejsów nawet podstawowych klas, takich jak liczby, linie, tablice itp. Oczywiście, może pomylić innych, którzy znają interfejsy API, ale są Jest ważnym powodem, aby uniknąć jej inaczej, zakładając, że dodasz do interfejsu i nie zmieniaj istniejącego zachowania?
Na przykład byłoby miło dodać tablicę Lub twoje tablice rubinowe mogą korzystać z wygodnej metody "sum", która używa "wstrzykiwań". Podczas gdy zmiany są wyizolowane z systemów (na przykład nie jesteś częścią pakietu oprogramowania, który wydasz do dystrybucji), czy istnieje dobry powód, aby nie używać tej funkcji językowej?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
6 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Więc jakie jest „złe” zastosowanie małpiego łatania? Cóż, małpa łatanie generalnie pozostawia szeroko otwarte na duże, potencjalnie niewykrywalne kolizje. Mam klasę . Mam pewien rodzaj małpiego modułu naprawy , który naprawia , uwzględniając , i . Mam inny moduł naprawy małp , który również naprawia , uwzględniając , i
method4 . Teraz jestem zagubiony. Wzywam[code]instance_of_A.method2
: czyja metoda jest wywoływana? Odpowiedź na to pytanie może zależeć od wielu czynników: [/code]OK, więc numer 3 jest prawdopodobnie zbyt melodramatyczny ....
W każdym razie jest to problem z łataniem małpy: straszne problemy z konfliktem. Biorąc pod uwagę bardzo dynamiczną naturę języków, które zazwyczaj ją obsługują, napotkasz już wiele potencjalnych problemów z „upiornymi działaniami na odległość”; małpa poprawka tylko je dodaje.
Posiadanie dostępnych łatek małp jest dobre, jeśli jesteś odpowiedzialnym programistą. Niestety, IME zdarza się, że ktoś widzi łatkę z małpą i mówi: „Kochanie! Po prostu to naprawię, zamiast sprawdzać, czy inne mechanizmy mogą być bardziej odpowiednie”. Jest to sytuacja z grubsza analogiczna do baz kodu Lispa tworzonych przez ludzi, którzy skłaniają się ku makrom, zanim pomyślą o zrobieniu tego jako funkcji.
Anonimowy użytkownik
Potwierdzenie od:
http://en.wikipedia.org/wiki/ Monkey_patch # pod wodą
http://en.wikipedia.org/wiki/Monkey_patch#Pitfalls
Kamienie
Na wszystko jest czas i miejsce, a także na łatanie małp. Doświadczeni programiści mają w zanadrzu wiele sztuczek i wiedzą, kiedy ich używać. Rzadko jest to technika sama w sobie, która jest „zła”, wystarczy jej nieostrożne użycie.
Anonimowy użytkownik
Potwierdzenie od:
Twoich systemów (na przykład nie są częścią
pakiet oprogramowania, dla którego wydajesz
rozprzestrzenianie się), czy istnieje dobry powód
nie używaj tego języka
funkcjonować?
Jako samotny programista pracujący nad pojedynczym problemem nie ma problemu z rozszerzaniem lub modyfikowaniem obiektów natywnych. Ponadto w przypadku większych projektów należy dokonać wyboru zespołowego.
Osobiście nie podoba mi się, gdy zmieniają się obiekty natywne w javascript, ale jest to powszechna praktyka i właściwy wybór. Jeśli masz zamiar napisać bibliotekę lub kod, który jest przeznaczony do użytku przez innych, zdecydowanie bym tego unikał.
Jednak jest to właściwy wybór projektu, aby umożliwić użytkownikowi ustawienie flagi konfiguracji, która mówi, że należy nadpisać własne obiekty wygodnymi metodami, ponieważ jest to tak wygodne.
Aby zilustrować określoną pułapkę JavaScript.
Tego problemu można uniknąć, używając ES5, który umożliwia wstrzykiwanie niewliczalnych właściwości do obiektu.
Jest to zasadniczo wybór konstrukcji wysokiego szczebla, a każdy powinien znać/zgadzać się z tym.
Anonimowy użytkownik
Potwierdzenie od:
Wyważona opinia Gilada Brachi na temat łatania małp:
http://gbracha.blogspot.com/20 ... .html
http://gbracha.blogspot.com/20 ... .html
Anonimowy użytkownik
Potwierdzenie od:
Podobnie, co jeśli definiujesz "sumę" w Rubim i pewnego dnia zdecydujesz, że chcesz użyć tego kodu ruby w Railsach lub dodać obsługę aktywnych klejnotów do swojego projektu? Aktywne wsparcie definiuje również metodę sum (na Enumerable), więc występuje kolizja.
Anonimowy użytkownik
Potwierdzenie od:
Czy istnieje dobry powód, aby tego uniknąć, zakładając, że dodajesz do interfejsu i nie zmieniasz istniejącego zachowania?
Tak. Najgorszy przypadek, nawet jeśli się nie zmieniasz
istnięjące
zachowanie, możesz zranić
przyszłość
Składnia języka.
Dokładnie to się stało z https://github.com/tc39/proposal-flatMap/pull/56
i https://bugzilla.mozilla.org/s ... 59... Krótko mówiąc, specyfikacja została napisana dla tych metod, do których dotarły ich sugestie
etap 3
https://tc39.github.io/process-document/
A następnie przeglądarze zaczęli go wysyłać. Ale w obu przypadkach stwierdzono, że istnieją starożytne biblioteki, które naprawiają wbudowaną tablicęz własnymi metodami.
o tej samej nazwie co nowe metody
i zachowywał się inaczej; w rezultacie strony pękały, przeglądarki musiały zrezygnować z implementacji nowych metod, a specyfikacja musiała zostać zweryfikowana. (Nazwy metod zostały zmienione.)
Jeśli zmienisz obiekt wbudowany, taki jak
we własnej przeglądarce, na swoim komputerze
, to normalne. (Jest to bardzo przydatna technika tworzenia niestandardowych skryptów). Jeśli zmodyfikujesz obiekt wbudowany w swojej witrynie publicznej, jest to mniej normalne - tak jest
mogą
ostatecznie prowadzą do problemów, takich jak te opisane powyżej. Jeśli masz szczęście, że sobie poradzisz
świetna strona
(np. stackoverflow.com) i zmutujesz obiekt wbudowany, możesz prawie zagwarantować, że przeglądarki odmówią wdrożenia nowych funkcji/technik, które zepsują Twoją witrynę (ponieważ wtedy użytkownicy tej przeglądarki nie będą mogli korzystać z Twojej witryny bardziej prawdopodobne, że przejdą do innej przeglądarki). (cm.
tutaj
https://coderoad.ru/55934490/
wyjaśnienie tego rodzaju interakcji między twórcami specyfikacji a producentami przeglądarek)
Wszystko, co zostało powiedziane, dotyczy
konkretny przykład
w twoim pytaniu:
Na przykład byłoby miło dodać implementację Array.map do przeglądarek internetowych, które nie implementują 5.edycji ECMAScript
Jest to bardzo popularna i godna zaufania technika zwana
Wypełnienie
https://en.wikipedia.org/wiki/Polyfill_(programming)
.
Wypełnienie to kod implementujący funkcję w przeglądarkach internetowych, które jej nie obsługują. Najczęściej odnosi się do biblioteki JavaScript, która implementuje standard sieciowy HTML5, albo ustalony standard (obsługiwany przez niektóre przeglądarki) w starszych przeglądarkach, albo proponowany standard (nieobsługiwany przez żadne przeglądarki) w istniejących przeglądarkach
Na przykład, jeśli napisałeś polyfill dla (lub, w nowszym przykładzie, dla ), który
w pełni spełnione
Oficjalna specyfikacja etapu 4
https://tc39.github.io/ecma262 ... e.map
a następnie uruchomił kod definiujący w przeglądarkach, które jeszcze go nie miały:
Jeśli implementacja jest poprawna, jest to całkowicie w porządku i jest wykonywane bardzo często w całym Internecie, aby starsze przeglądarki mogły zrozumieć nowe metody.
polyfill.io
http://www.polyfill.io/
to powszechna usługa w tego rodzaju sprawach.