Jaki termin jest używany do opisania funkcji / metody, która modyfikuje obiekt, do którego jest wywołany?


12

Przepraszam za ogólne pytanie. Przeszukałem wszystkie i znalazłem tak wiele wątków podobnych do tego, jednak żaden nie odpowiada na moje konkretne pytanie - być może dlatego, że szukany termin nawet nie istnieje.

Mój przyjaciel uczy się programowania, w szczególności JavaScript, i zapytał mnie, dlaczego to nie działa:

var a = "Hello World";
a.replace("Hello", "Goodbye");

console.log(a)  // Logs "Hello World"

Powodem jest to, że replacesię nie modyfikuje a, ponieważ ciągi są niezmienne w JavaSript. Ponieważ zwraca ciąg, musisz zrobić coś takiego jak ...

var a = "Hello World";
a = a.replace("Hello", "Goodbye");

console.log(a);  // Logs "Goodbye World"

Jednak alternatywą jest funkcja taka jak JavaScript reverse(), ponieważ modyfikuje to, co ją wywołuje. Na przykład:

var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();

console.log(fruits)  // ["Bananas", "Oranges", "Apples"]

Kiedy mój przyjaciel zapytał mnie, dlaczego jego replacenie działa, zdałem sobie sprawę, że sięgam po słowo, którego nie znam (o ile mi wiadomo) ...

„Musisz ustawić ciąg na„ ciąg kropki zamień ”, ponieważ funkcja zamiany to ________.”

Nie musisz ustawiać tablicy równej „odwrotnej macierzy”, ponieważ odwrotność to ________. ”

Znam prototypowe funkcje, choć nie sądzę, że tego słowa szukam. Czy ktoś może mi pomóc wypełnić te pola?


6
Może to słowo „mutator”? na przykład: You don't need to set an array equal to "array dot reverse", because reverse is a mutator function. I pomyśleć Słyszałem, że terminologia odnosi się do funkcji, które „mutate” instancję, która je wywołuje. Ale prawdopodobnie powinieneś sprawdzić to jeszcze gdzieś indziej.
FrustratedWithFormsDesigner

Doceniam to! Właśnie przeczytałem Metody Mutatora i myślę, że zdecydowanie pasuje to do tej rozmowy. Z pewnością w dziedzinie, której szukam.
Santi

Jestem zdezorientowany: w tytule, pytasz o funkcję, która modyfikuje obiekt, który nazwał go, ale w swoich przykładach pokazać metody, które modyfikują obiekt Nazywane są na , czyli dokładnie odwrotnie tytułu. Który z nich to jest?
Jörg W Mittag

Z pewnością ten wyjaśniony w 30 liniach szczegółów. Zmienię tytuł, aby był dokładny, dzięki za heads-up!
Santi

Odpowiedzi:


12

Para pojęć, których szukasz, to zmienne / niezmienne parametry oraz miejsce / zwracanie wyników.

W twoich przykładach:

Musisz ustawić ciąg na „ciąg kropki zamień”, ponieważ funkcja zamiany działa na ciąg znaków, który w Pythonie jest niezmienny, więc funkcja zamiany zwraca nowy ciąg.

Dla programisty C / C ++ jest to bardziej znane jako parametry „przekazywane przez wartość”, a nie „przekazywane przez referencję”, co czyni je niezmiennymi i zwraca wynik.

Nie musisz ustawiać tablicy równej „odwróceniu kropki macierzy”, ponieważ odwrotność działa na tablicy, która jest zmienna , więc jest w stanie wprowadzić zmiany w miejscu przed powrotem.

W językach takich jak C / C ++ jest to znane jako parametry „przekazywane przez referencję”, tj. Przekazywanie adresu, który, jeśli nie zostanie zmodyfikowany przez const, umożliwia funkcji zmianę, mutację , zawartość tego adresu zmieniającą wyniki w miejscu przed zwróceniem.

Oczywiście nie jest niczym niezwykłym posiadanie funkcji, która zwraca wyniki przez oba mechanizmy, np. int SomeFn(int p1, int p2, int *ErrCode)Może potencjalnie zwracać wyniki zarówno w wartości zwracanej, jak i przez modyfikowanie zawartości ErrCode.

Trzecia metoda

Dla kompletności trzecim mechanizmem zwracania wyników jest efekt uboczny lub globalny , tj. Modyfikacja zakresu pliku, całego programu, wartości wspólnych lub środowiskowych. Jest to ogólnie uważane za złe wieści, ponieważ o ile nie są dobrze udokumentowane, można dowiedzieć się, co się zmienia, uważnie czytając kod. W językach takich jak C / C ++ jest to zbyt łatwe, ponieważ ma zmienną zakresu zewnętrznego o podanej nazwie, być może nawet w innym module, i nie ma maskującej zmiennej zakresu lokalnego o tej samej nazwie. W Pythonie można odczytywać wartości wartości w zewnętrznych zakresach, chyba że wartości zakresu zewnętrznego są jawnie ustawione jako dostępne do modyfikacji za pomocąglobal słowo kluczowe, próba modyfikacji zmiennej zasięgu zewnętrznego automatycznie tworzy lokal o tej samej nazwie.


Ach, znam te terminy, choć nie byłem pewien, czy istnieje jakieś słowo opisujące samą funkcję . Jak w, (The reverse function is a _______ function.) Biorąc to pod uwagę, jest to prawie identyczna odpowiedź na tę, którą ostatecznie dałem przyjacielowi, więc doceniam twoje potwierdzenie - choć wciąż zastanawiam się, czy są jakieś konkretne warunki. Pozwolę, aby pytanie pozostało otwarte, ale z pewnością zaakceptuję to jako odpowiedź, w przypadku gdy te słowa po prostu nie istnieją.
Santi

2
W niektórych językach, takich jak Python, możesz także mieć klasy, które same się modyfikują - podczas gdy w niektórych kontekstach to „łatanie małp” jest uważane za dobrą rzecz, w wielu jest uważane za „samodmodyfikujący kod” i jest zabronione. Możesz także mieć „kod ewolucyjny”, w którym fragmenty kodu są losowo „mutowane” i / lub łączone, a następnie są testowane i wybierane pod kątem „najlepszej” wydajności w jakiś sposób.
Steve Barnes,

-1. To, czy łańcuchy są zmienne czy niezmienne, nie ma nic wspólnego z działającą na nim funkcją. Ta funkcja nie jest zmienna ani niezmienna i nie jest „powracająca ani zastępowana”. Funkcje mogą modyfikować swoje argumenty i nadal zwracać.
Miles Rout

@MilesRout dodał, że funkcje, które modyfikują w miejscu, nadal zwracają i niektóre przykłady C / C ++ dla przejrzystości oraz wyniki uboczne dla kompletności.
Steve Barnes,

4

Mój preferowany sposób wyrażenia tego to:

  • Macierz reversemetoda mutacji . To mutator . Częstym przypadkiem specjalnym jest seter .

  • Metoda String niereplace powoduje mutacji . To nie jest mutator . Jeśli niczego nie modyfikuje , jest wolny od skutków ubocznych . Częstym przypadkiem specjalnym jest getter .

  • Ponieważ ciągi JavaScript są niezmienne , metody ciągów nie mogą mutować.

    „Hello World” .replace („Hello”, „Goodbye”);

    powinno sprawić, że poczujesz się niekomfortowo. Nie modyfikuje literału łańcucha. Odrzuca wynik. Analizatory kodów statycznych mogą czasem wykryć takie błędy.

  • Ponieważ tablice JavaScript można modyfikować , metody tablic mogą mutować. JavaScript używa tablic jako lokalnych pojemników pamięci, które można łatwo modyfikować i rzadko kopiować.

2

Czasami w kontekście czystego programowania funkcjonalnego słyszałem funkcje, które modyfikują wartość wejściową (a zatem nie są czystymi funkcjami), zwane destrukcyjnymi . Nie jestem jednak pewien, czy jest to właściwy termin.

W twoim przypadku powiedziałbyś:

Musisz ustawić ciąg na „ciąg kropki zamień”, ponieważ funkcja zamiany nie jest destrukcyjna .

Nie musisz ustawiać tablicy równej „odwróceniu kropki tablicy”, ponieważ odwracanie jest destrukcyjne .


1

Być może słowo jest czyste , którego szukasz?

replace()jest (lub wydaje się być) czysty, ponieważ nie wygląda na to, aby miał jakieś skutki uboczne (tj. modyfikowanie łańcucha), podczas gdy reverse()jest nieczysty, ponieważ zmienia stan tablicy.


Jest to pokrewna koncepcja, ale także implikuje inne właściwości (np. Brak dostępu do stanu globalnego i zawsze uzyskiwanie tego samego wyniku dla tych samych danych wejściowych).
Jacob Raihle,

1

Zazwyczaj byłyby one podzielone na funkcje i metody (gdzie metody są podzbiorem funkcji). Funkcja jest sekcją kodu, którą można wywołać w oderwaniu, podczas gdy metoda ma pojęcie bieżącego „kontekstu”, w którym działa. Działanie metody zmienia stan jej kontekstu.

W programowaniu obiektowym kontekstem jest instancja, na której działa funkcja.


0

Nie wiem, czy istnieje oficjalna odpowiedź, ale oto dwie, które mogą ci się spodobać.

Procedura

Tylko dlatego, że wydawało się to dobrą odpowiedzią na to pytanie , które bardzo przypomina twoje pytanie BTW - powinieneś to sprawdzić.

Jednorazowa operacja w miejscu

Przejrzyj tę stronę: java.util.function . Zapewnia rodzaj wymyślonej nazwy dla delegatów (podpisy wejściowe / wyjściowe) różnych prototypów, np. Delegat, który przyjmuje argument i nic nie zwraca, nazywany jest konsumentem .

Teraz, jako bystry uczeń OOP, powinieneś zdawać sobie sprawę, że metoda jest tylko funkcją, która przyjmuje ukryty parametr ( this). Ponieważ jest dostarczany jako odniesienie, służy zarówno jako parametr wejściowy, jak i wyjściowy.

Według tych facetów Java (i wydają się całkiem sprytni), delegat, który akceptuje pojedyncze dane wejściowe i zwraca wartość tego samego typu, nazywany jest operatorem jednoargumentowym .

Teraz, w przypadku array::Reverse(), tablica nie jest niezmienna i może potencjalnie zajmować dużo miejsca, więc jest bardziej wydajna i wygodniejsza do wykonania operacji w miejscu. Dlatego Reverse()jest jednostronnym operatorem na miejscu .

Ale dla mnie „operator” jest specjalnym symbolem (jak operator dodawania, znany również jako +) lub matematycznym słowem kluczowym, takim jak mod. Dlatego wolę nazywać to jonem operacyjnym , dającym jednostronną operację w miejscu .


Mieszacie koncepcje. Reverse()Nie jest to operator jednoargumentowy operator nie musi powrócić do wartości tego samego typu (na przykład !, delete, typeof), oraz operatorzy nie osób. Ale „w miejscu” to dobry termin na metodę modyfikującą jej instancję. [Nie głosowałem za odrzuceniem, ale wygląda na to, że ktoś głosował za odrzuceniem wszystkich odpowiedzi, mimo że wszystkie były przydatne.]
Jerry101,

Nie jestem pewien, czy obserwujesz. Każdy prototyp może być reprezentowany przez delegata. „Operator” nie działa dla mnie (jak powiedziałem), więc mówię „Operacja”, a tak naprawdę Reverse()jest operacją jednoargumentową. Ale ogólnie zgadzam się, że to wszystko jest trochę dziwne, ale używam dosłownie terminologii z powiązanego dokumentu , który wydaje się być autorstwa autorów całkiem sprytnych. Przynajmniej jest to lepsze niż nic.
John Wu,

Rozumiem! Zauważ, że aby zmodernizować lambdy do Javy, oparły się one na pomyśle interfejsu funkcjonalnego ( interfejsu Java z tylko jedną metodą), abyśmy mogli ominąć zwykłe obiekty Java, by zastosować je jako „funkcje”. (Brian Goetz rozmawia na temat dodawania lambd. Wielokrotnie mówi „oczywiste podejście byłoby do bani”). Tworząc funkcjonalne interfejsy dla obiektów przetwarzających strumień, nadużywają oni terminów takich jak „operator”. To mylące! Na pewno zabrakło imion. Nie sądzę, że jest to dobre źródło terminów dla metod OOP, które modyfikują / nie modyfikują obiektu odbiornika.
Jerry101
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.