Çağrıldığı nesneyi değiştiren bir işlevi / yöntemi tanımlamak için kullanılan terim nedir?


12

Genel soru için özür dilerim. Her yerde aradım ve buna benzer çok sayıda konu buldum , ancak özel sorumu cevaplayan biri değil - belki de aradığım terim bile mevcut değil.

Bir arkadaşım özellikle JavaScript ve programlama öğreniyor ve bana bunun neden çalışmadığını sordu:

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

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

Bunun nedeni, dizelerin JavaSript'te replacedeğiştirilememesi nedeniyle değiştirilmemesidir a. O çünkü döndüren bir dize, gibi bir şey yapmak gerekir ...

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

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

Bununla birlikte, alternatif, JavaScript'i andıran bir işlevdir reverse(), çünkü onu ne çağırırsa değiştirir. Örneğin:

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

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

Arkadaşım bana neden replaceçalışmadığını sorduğunda , bilmediğim bir kelimeye ulaştığımı fark ettim (bildiğim kadarıyla) ...

"Sen zorunda set 'yerine fonksiyonu olduğu için ________.' Dize nokta yerine dize"

"Dizi nokta tersine" değerine eşit bir dizi ayarlamanız gerekmez , çünkü ters ________.

Aradığım kelimenin bu olduğuna inanmama rağmen prototip işlevlerine aşinayım . Birisi bu boşlukları doldurmama yardımcı olabilir mi?


6
Belki de kelime "mutator" mu? gibi: You don't need to set an array equal to "array dot reverse", because reverse is a mutator function. Ben düşünüyorum ben terminoloji işlevlerine onları çağırır "mutasyon" örneği başvurmak için duydum. Ama muhtemelen başka bir yerde iki kez kontrol etmelisiniz.
Hayal kırıklığına

Teşekkür ederim! Mutator Metodları hakkında biraz okuma yaptım ve bunun kesinlikle bu sohbete oldukça iyi uyduğunu düşünüyorum. Kesinlikle aradığım şeyin alanında.
Santi

Ben karıştı: Başlıkta, bir işlevi hakkında sormak değiştirir denir, ama örneklerde, onlar denir nesneyi değiştiren yöntemler göstermek nesne üzerinde , başlığın yani tam tersi. İkisinden hangisi?
Jörg W Mittag

Kesinlikle bir ayrıntı 30 satırda açıkladı. Başlığı doğru olacak şekilde değiştireceğim, heads-up için teşekkürler!
Santi

Yanıtlar:


12

Aradığınız kavram çifti, değiştirilebilir / değişmez parametreler ve sonuçların yerinde / döndürülmesidir.

Örneklerinizde:

Yerine fonksiyon python olduğunu, bir ipe çalışır, çünkü "dizesi yerine dot" dizesi ayarlamak zorunda değişmez fonksiyonu yerine böylece döner yeni bir dize.

Bir C / C ++ programcısı için bu, "referansla aktarıldı" yerine "değere göre aktarıldı" parametreleri olarak daha tanıdıktır, bu da onları değiştirilemez ve sonucu döndürür.

"Dizi nokta tersine" değerine eşit bir dizi ayarlamanız gerekmez, çünkü tersi değiştirilebilir bir dizi üzerinde çalışır , bu nedenle geri dönmeden önce yerinde değişiklikler yapabilir .

Böyle C / C ++ dillerinde ise bu, adres geçen yani "referans geçti" parametreleri olarak bilinir tarafından değiştirilmemiş ise const, değişim, işlevi verir mutasyona sonuçları değiştirerek bu adresin içeriğine yerinde dönmeden önce.

Tabii ki her iki mekanizma ile sonuçlarını döndürür, örneğin bir işlevi olması anormal değildir int SomeFn(int p1, int p2, int *ErrCode), olabilir , potansiyel dönüş değeri ve içeriğini değiştirerek iki sonucu elde ErrCode.

3. Yöntem

Tamlık için sonuçların döndürülmesi için 3. bir mekanizma yan etki veya globaldir , yani dosya kapsamını, program genişliğini, paylaşılan veya çevresel değerleri değiştirmek. Çok iyi belgelenmedikçe, yalnızca kodu dikkatlice okuyarak nelerin değiştirildiğini öğrenebileceğiniz için bu genellikle kötü haber olarak kabul edilir . C / C ++ gibi dillerde, belirli bir ada sahip bir dış kapsam değişkenine, muhtemelen başka bir modülde bile ve aynı adda maskeleme yerel kapsam değişkenine sahip olmadan bunu yapmak çok kolaydır . Python'da, dış kapsam değerleri açıkça değiştirilecek şekilde ayarlanmadığı sürece, dış kapsamlardaki değerlerin değerlerini okuyabilirsiniz.global anahtar kelimesi, bir dış kapsam değişkenini değiştirmeye çalışmak otomatik olarak aynı adda bir yerel oluşturur.


Ah, bu terimlere aşinayım, ancak işlevin kendisini tanımlayan gerçek bir kelime olup olmadığından emin değildim . Olduğu gibi, (The reverse function is a _______ function.) Bu söylendiğinde, bu arkadaşımla verdiğim cevapla neredeyse aynı bir yanıt, bu yüzden onayınızı takdir ediyorum - yine de belirli terimler olup olmadığını merak ediyorum. Sorunun biraz açık kalmasına izin vereceğim ama kesinlikle bu kelimelerin mevcut olmaması durumunda cevap olarak kabul edeceğim.
Santi

2
Python gibi bazı dillerde, kendilerini değiştiren sınıflara da sahip olabilirsiniz - bazı bağlamlarda bu "maymun yaması" birçoğunda iyi bir şey olarak kabul edilir, "kendini değiştiren kod" olarak kabul edilir ve yasaktır. Ayrıca kod parçalarının rastgele "mutasyona uğradığı" ve / veya birleştirildiği "evrimsel kod" da olabilir ve bir şekilde "en iyi" performans için test edilir ve seçilir.
Steve Barnes

-1. Dizelerin değişebilir ya da değişmez olmasının, üzerinde çalışan işlevle bir ilgisi yoktur. İşlev değiştirilemez veya değiştirilemez ve "geri dönen veya yerinde" değildir. Fonksiyonlar argümanlarını değiştirebilir ve yine de geri dönebilir.
Miles Rout

@MilesRout, yerinde değişiklik yapan işlevlerin hala döndüğünü ve netlik için bazı C / C ++ örneklerinin yanı sıra tamlık için yan etkilere göre sonuçlar ekledi.
Steve Barnes

4

Bunu ifade etmek için tercih ettiğim yol:

  • Array reverseyöntemi değişiyor . Bir mutatör . Ortak bir özel durum bir pasördür .

  • String replaceyöntemi değişmez . Bu var bir Mutator değil . Hiçbir şeyi değiştirmezse , yan etkisi yoktur . Ortak bir özel durum alıcıdır .

  • JavaScript Dizeleri değiştirilemediğinden , Dize yöntemleri değiştirilemez .

    "Merhaba Dünya" .replace ("Merhaba", "Güle güle");

    sizi rahatsız etmeli. Bir dizgi değişmezini değiştirmez. Sonucu atar. Statik kod analizörleri bazen bu hataları tespit edebilir.

  • JavaScript Dizileri değiştirilebilir olduğundan , Dizi yöntemleri değişiyor olabilir. JavaScript, Dizileri kolayca değiştirilebilen ve nadiren kopyalanan yerel depolama kutuları olarak kullanma eğilimindedir.

2

Bazen, saf fonksiyonel programlama bağlamında kullanıldığında, yıkıcı olarak adlandırılan giriş değerini değiştiren (ve dolayısıyla saf işlev olmayan) işlevleri duydum . Yine de bunun doğru terim olup olmadığından emin değilim.

Sizin durumunuzda şunu söylerdiniz:

Değiştirme işlevi yıkıcı olmadığından, dizeyi "string dot replace" olarak ayarlamanız gerekir .

"Tersine nokta tersine" değerine eşit bir dizi ayarlamanız gerekmez, çünkü tersi yıkıcıdır .


1

Belki de aradığınız kelime saf mıdır?

replace()saftır (ya da öyle görünüyor) çünkü herhangi bir yan etkisi yoktur (yani, dizeyi değiştirmek) reverse(), dizinin durumunu değiştirdiği için saf değildir.


İlgili bir kavramdır, ancak diğer özellikleri de ifade eder (örneğin, küresel duruma erişmemek ve her zaman aynı girdi için aynı çıktıyı elde etmek).
Jacob Raihle

1

Bunlar genellikle işlevlere ve yöntemlere (yöntemlerin işlevlerin bir alt kümesi olduğu) ayrılır. Bir işlev, tek başına çağrılabilen bir kod bölümüdür, oysa bir yöntemin üzerinde çalıştığı geçerli bir 'bağlam' kavramı vardır. Bir yöntemin eylemi, bağlamının durumunu değiştirir.

Nesneye yönelik programlamada, bağlam fonksiyonun üzerinde çalıştığı örnektir.


0

Resmi bir cevap olduğunu bilmiyorum, ama hoşunuza gidebilecek iki tane var.

prosedür

Sadece BTW sorunuza çok benzeyen bu soruya iyi bir cevap gibi göründüğü için bunu kontrol etmelisiniz.

Yerinde tekli işlem

Bu sayfayı gözden geçirin: java.util.function . Çeşitli prototiplerin delegeleri (girdi / çıktı imzaları) için bir tür telafi adı sağlar, örneğin, argüman alan ve hiçbir şey döndürmeyen bir temsilci tüketici olarak adlandırılır .

Şimdi, OOP'un zeki bir öğrencisi olarak, bir yöntemin sadece gizli bir parametre ( this) alan bir işlev olduğunu bilmelisiniz . Referans olarak sağlandığından hem girdi hem de çıktı parametresi olarak işlev görür.

Bu Java adamlarına göre (ve oldukça akıllı görünüyorlar), tek bir girişi kabul eden ve aynı türde bir değer döndüren bir temsilci, tekli operatör olarak adlandırılır .

Şimdi array::Reverse(), bir dizi değişmez değildir ve potansiyel olarak çok fazla yer kaplayabilir, bu nedenle işlemi yerinde yapmak daha verimli ve uygundur. Bu nedenle Reverse()bir olduğunu yerinde tekli operatör .

Ama bana göre, bir "operatör" özel bir semboldür (toplama operatörü olarak da bilinir +) veya gibi bir matematiksel anahtar kelimedir mod. Bu nedenle , yerinde bir işlem sağlayan bir operasyon iyonu demeyi tercih ediyorum .


Kavramları karıştırıyorsunuz. Reverse()bir operatör değil, tekli bir operatörün aynı türde bir değer döndürmesi gerekmez (örn !. delete, typeof) ve operatörler delege değildir. Ancak "yerinde", örneğini değiştiren bir yöntem için iyi bir terimdir. [Ben aşağı oy vermedim, ama hepsi yararlı olsa bile birileri tüm cevapları aşağı
oyladı

Takip ettiğinizden emin değilim. Herhangi bir prototip bir temsilci tarafından temsil edilebilir. "Operatör" benim için çalışmıyor (belirttiğim gibi) bu yüzden "Operasyon" diyorum ve evet gerçekten Reverse()tek bir operasyon. Ama genel olarak bunun biraz garip olduğunu kabul ediyorum, ancak bazı oldukça akıllı insanlar tarafından yazılmış gibi görünen bağlantılı belgedeki terminolojiyi kelimesi kelimesine kullanıyorum . En azından hiç yoktan iyidir.
John Wu

Ah anlıyorum! Lambdaları Java'ya uyarlamak için, işlevsel bir arabirim (yalnızca 1 yöntemli bir Java arabirimi) fikri üzerine inşa edildiğini ve "işlevler" olarak uygulamak için sıradan Java nesnelerini dolaşabileceğimizi unutmayın. (Brian Goetz'in lambda ekleme konusunda teknik bir konuşması var. Birden çok kez "bariz yaklaşım berbat olurdu" diyor.) Akış işleme nesneleri için işlevsel arabirimler oluştururken , "operatör" gibi bir tür istismar edilmiş terimler oluşturuyorlar. Bu kafa karıştırıcı! Onlar iyi isimler bitmiş olmalı. Alıcı nesnesini değiştiren / değiştirmeyen OOP yöntemleri için iyi bir terim kaynağı olduğunu düşünmüyorum.
Jerry101
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.