Döndürülen değişkeni "sonuç" olarak adlandırmak iyi bir uygulama mıdır? [kapalı]


44

Bir yöntemin döndürdüğü değişken ismini değişken ismiyle çağırmak iyi bir uygulama mıdır result?

Örneğin:

public Zorglub calculate() {
    Zorglub result = [...]
    [...]
    return result;
}

Yoksa türüne göre adlandırmalı mıyım?

public Zorglub calculate() {
    Zorglub zorglub = [...]
    [...]
    return zorglub;
}

Her ikisini de vahşi doğada gördüm, birini seçmem gerekirse, ilkini veya ikincisini (veya daha iyi bir ismi) tercih etmem için hangi nedenler olabilir?

Ben çoğunlukla Java'yı düşünüyorum.


73
Ben de ofTheJedibu amaçla kullanıldığını gördüm . Bir öneri değil, sadece gördüm diyerek. Zorglub ofTheJedi = //...; return ofTheJedi;

7
Ben genellikle "retval" (geri dönülecek değer) olarak adlandırırım, ancak bu, oyumu kullanacağım "sonuç" ile aynı şeydir.
Zeta İki

5
Herkesin farklı bir cevabı var, hepsi birbirine benziyor, ama farklı ve geçerli, soru isteyerek öznel değil, ama cevaplar. Bu daha çok bir anket.
ZJR

16
Ben bir değişken olarak "sonuç" iyi olduğunu söyleyebilirim, ancak bir işlev olarak "hesaplamak" kesinlikle değildir.
Kaz Ejderha

2
Birçok eski Delphi programcısıyla mı çalışıyorsunuz?
Peter Turner

Yanıtlar:


48

Bu bir metod değişkeni ise, gerçekten okunabilirliğe bağlıdır.

Hem değişken bildiriminde hem de yöntem dönüş türünde zaten bir tür adınız olduğunu görünce, siz de kullanabilirsiniz result- bu değişkenin rolünü açıklayıcıdır.


40

Değişken isimlendirilirse çapraz okuma daha kolay yapılır result. Bu, niyetini açıkça gösterir.


2
+1 Bu ana nokta. Herhangi bir bağlamda sonucun ne anlama geldiğini yalnızca koda bakarak biliyorum.
Xeoncross

1
Değişken türünü kullanmak, geri vereceğinizi anlamanıza yardımcı olmaz. Bu basit örneklerde, geri dönüşün kayan ya da görünmeden görünmesi daha kolaydır, ancak işlevin döndürdüğü değerin ne olduğunu bilmek daha hızlıdır. Örnekte olduğu gibi onu canlandırmak da önemlidir.
nycynik

17

Eğer bir dönüş değişkenine ihtiyacım olursa (bu aslında nadiren olur), daima onu çağırırım retve daima fonksiyon başlığının hemen altında tanımlarım. İşlev zaten döndüğü ile ilgili her şeyi söyleyen bir ada sahip.

Ben varsa myFunctionben olabilir 's dönüş değişkeni isim myFunctionReturnValuede aynı şeyi söylemek, sadece ben açıkça her zaman bunu söylemek gerekir. İşlevler genellikle kısa olması gerektiğinden, bu açıklığa gerek yoktur. İzini kaybedersem bile bildirime atlayabilirim ve işlev tanımının hemen altına inerim.

Ancak, dolaylı olarak (gibi retveya result) veya açıkça (gibi myFunctionReturnValueveya myFunctionResult) belirtmeyen başka herhangi bir ad, bunun geçerli işlevlerin dönüş değişkeninin çok genel olduğunu belirtir.

İkinci örneğinde zorglubkorkunç bir seçim. Tüm bildiri, bana, isminin hemen yanında bulunan açıklama tipine eşit olan bir değişken yarattığınızı söylüyor. Bu int someIntya da kadar faydalı Zorglub z.

İlk örneğinizde, koda baktığımda, önce bu ismin hesaplandığını söyleyen işlev adını gördüm Zorglub. İkinci satırı okuduğumda, "tamam, işte zorglub, iadesi olacak, ama açıkça geri döndürülemiyor ve bu nedenle resultdeğişkende saklanıyor " (bir not olarak: değeri yeniden atamayacaksınız, o zaman en son değişkeni bildirmek için en iyisini belirtmelisiniz), ve sonra sanırım "şimdi dönmeden önce ona ne olacağını görelim". İlk örnekte aksine aslında bilmek bundan da fazla okumak gerekmez bu iade edilecek gidiyor değişken, ve ben bunu anlamak istiyorsanız fonksiyon vücutta takip etmek istiyorum.

Sorunuzla ilgili olan Spartalı Programlama hakkında okumak isteyebilirsiniz .


8
"Zorglub çok kötü bir seçimdir" için +1. Değişken bir isme sahip olmak için, hiçbir şekilde, herhangi bir bağlamda, bu tip isimle aynı değildir (başlangıç ​​sermayesi eksi). Bu bildirim size değişkenin türünü söyler - değişkeninizi türünüzden sonra adlandırmak değişkenlerinizi x1, x2, x3 vb. Çağırmaktan daha iyi değildir. Herhangi bir değişkenin adı, değişkenin ne için olduğunu veya ne yaptığını ifade etmelidir. Bu özel durumda bir değişken için tercih ettiğim isim: Geri Döndür - çünkü değişken, döndürülecek nesneye başvurur. Aslında değişken isimlerimin çoğu "to" ile başlar.
Dawood ibn Kareem

21
@DavidWallace - bu çok mutlak bir şey. Ben denilen bir sınıf var Container. Miktarı değiştiren bir yönteme sahipsem, yöntemin var container = getContainer(id); container.Quantity += 1; içeriğinin yalnızca tek bir kapta çalışması durumunda kesinlikle okunabilir olduğunu söyleyebilirim , hepsi bu. Bunu aramak theContainerWeAreGoingToAdjustTheQuantityOfsadece saçma.
Scott Whitlock

4
@David, katılmıyorum. Her biri farklı türden birkaç yerel değişkeninizin olduğu bir durumu ele alalım (Diyelim ki Kullanıcı, Yönetici ve Bölüm). Ve görevin görevi kullanıcıyı departmana ve yönetici ekibine bağlamak olduğunu varsayalım. IMHO, bu Kullanıcı örneğini basitçe çağırmak için tamamen sorun değil user(aksine userToJoinThisDepartmentAndManager? Veya seçiminiz ne olurdu?)
Péter Török

10
Küçük nitpick: "ret" veya "rv" veya sonuç / returnValue kısaltılmış diğer çeşitlerini görmekten nefret ediyorum. "sonuç" çok uzun sürmez ve kimsenin karakterleri korumasına gerek yoktur.
Kristopher Johnson,

2
@KristopherJohnson: "sonuç" çok uzun değil, aynı zamanda "dönüş değeri" anlamına da gelmiyor. Getiri değerleri her zaman hesaplamaların sonucu değildir ve tam tersine, hesaplamaların sonuçları her zaman iade-değer değildir. Sanırım dönüş değerinizi isimlendirebilirsiniz returnValue, ancak rettıpkı intve tıpkı geleneksel bir şeydir char.
ruakh

12

İkinci örneğinizde, sonucun türünü ne olduğu ile karıştırıyorsunuz .

Zorglub zorglub;

Sadece bana iki kere bir Zorglub olduğunu söyledi. Metod dönüş tipini okumak için uğraşıyorsam üç kere. Ancak,

double variance;

örneğin, bana neyi dönüş değeri hakkında bir ipucu verir araçlarının programı semantik açısından. resultYöntemin boyutuna bağlı olarak, sadece onu çağırmaktan daha açık bir ifadesi olabilir veya olmayabilir - bu, her bir IMO yöntemi için bir yargılama çağrısıdır.


8

Eğer Zorglub sizin yöntemlerinde nesneleri birçok ile oynamak, bir hata yaparsanız ve yanlış bir dönüş, ve / veya başkalarına isim cazip olabilir "olabilir" zorglub1, zorglub2vb

Eğer adını resultverirseniz, böyle bir hata yapma şansınız yoktur. Artı, bunun iyi bir isim olduğunu düşünüyorum; Ben de gördüm returnedValueya da returnedObjectbirkaç kez, biraz uzun da olsa net.


5

Ben şahsen resultdeğişken isim olarak kullanmaktan tamamen emin değilim . Yeterince adil, ilgili değerin bazı hesaplamaların sonucu olduğunu söylüyor - ancak bunun bir programda kullanılan değişkenlerin / alanların yaklaşık% 90'ına (veya daha fazla) doğru olduğunu tahmin ediyorum.

Ayrıca, birkaç başka cevabın da belirtildiği gibi, bir yöntemden / fonksiyondan döndürülecek değeri işaretlemek için kullanılabilir. Ancak, yöntemlerimi kısa tutarsam, yalnızca bir şeyi yapmaya ve sürekli olarak tek bir soyutlama düzeyinde kalmaya odaklanırsam, çok fazla yerel değişkenim olmayacak ve bir yöntemin geri döneceğini görmek önemsiz olacak.

Bu yüzden metotlarımı kısa ve temiz tutmayı tercih ediyorum ve değişkenlerimin isimlendirme metodundaki yerel rolü yerine, sahip oldukları değerin anlamını ifade etmek için isimlendirmeyi tercih ediyorum . Ancak, (örneğin eski kodda) Zorglub resultkesinlikle anlaması daha kolay olabilir Zorglub zorglub.


12
Bu çağrılmaz resulto sonucudur, çünkü bazı hesaplama; denir resultçünkü bu hesaplamanın sonucudur . Bu ayrıca mümkün olan en belirgin anlamı olmasa bile, anlamı IMO olarak çalışır. Anlam ifade etmek altındır, ancak niyet ve deyimler de değerli olabilir. Bu durumda biraz takas.
Supr

@Supr: Sadece bir ya da iki ifadede kullanılacak olan başka bir hesaplamanın sonucunu tanımlamak için hangi ismi kullanırsınız (örneğin if (result >= 0) numChars+=result; else break;, söz konusu hesaplamada anlamı belli olacak mı?) Aklımdaki değer o olacak döndürülmesini bu çağrılmalıdır fonksiyonu retdeğeri ise edilmiş son denen işlevinden döndürülen olmalıdır result. resultİşlevin dönüş değeri örneğin bir miktar veya bir hata kodu gösterebilirse, daha uzun bir addan daha anlamlı olabileceğini unutmayın .
supercat

@supercat, hesaplamanın ne olduğuna veya değerin ne için kullanıldığına bağlı olarak adlandırırdım. Sadece bir sonraki hesaplamasında kullanılsa bile, iyi isimlendirilmişse okunabilirliğe yardımcı olur. Örnekte, ne anlama resultgeldiği veya kodun gerçekte daha yüksek düzeyde ne yaptığı hakkında hiçbir fikrim yok. Değerinin nereden geldiğini ve ne olduğunu görmek için nerede ayarlanmış olduğunu belirtmek zorunda kalacağım. Gibi bir şey addedCharsya matchedCharsda daha şeffaf olacak ve kodun ne yaptığını ortaya koymaya yardımcı olacak ve bu ve bununla ilgili zihinsel olarak hokkabazlık gerektirmeyecek result = ...:)
Supr

@Supr: Sorun şu ki, çoğu durumda, farklı getiri değerleri aralıkları farklı anlamlara gelebilir. Örneğin, bir paketi belirtilen boyutta bir tampon belleğe okumak için bir rutin, eğer bir paket alınmışsa, bir paketin tampon için çok büyük olduğunu beklemekte olan bir paketin alındığını (veya yine de beklediğini) belirten negatif bir sayı verebilir. veya başka bir hatayı belirtmek için gerçekten büyük bir negatif sayı. Geri dönüşün saklanması resultve ardından bu kriterlere göre kontrol edilmesi, hepsini kapsayan açıklayıcı bir isim bulmaya çalışmaktan daha doğal görünecektir.
supercat

@supercat, retyerine kullanmak resultbana göre iyi görünüyor. Benim görüşüme göre biraz daha az açık çünkü kısaltılmış ve isim benzeri değil, fakat eğer sürekli kullanılıyorsa o zaman eşdeğerdir result.
Supr

1

resultİşlev / yöntemden döndürülecek değerin ismini şahsen kullanırım . Döndürülecek değer olduğunu açıkça belirtiyor. Türüne göre adlandırmak işe yaramıyor çünkü aynı tipte birden fazla değişken olabilir.


Uhm, kesinlikle geri dönmeden önce 'geri dönüş' diyecek olması yeterince açık mı? Bununla ne yapacağınızı, şimdi 'nasıl' olduğunu tanımlamanız gerekir. Neden toplam, sonuç veya amacın açıklayıcı başka bir şeyi olarak adlandırılmıyorsa, kodunuz "toplam geri dönüş" veya benzeri bir şey hazırlar ...
Dave,

@Dave Zorunlu olmamakla birlikte, özellikle de aynı türden döndürülecek olan tüm nesneleriniz varsa, yöntemin amacı, hangisinin geri döndürüleceğini bulmaktır.
Andy,

@Andy Amacınızı anlıyorum ama gerçekte, böyle bir işlev yazmayı düşünemiyorum. Eğer böyle bir fonksiyon yazmanın sebebi buysa, daha küçük ve anlaşılabilir fonksiyonlara bölünmüş gibi geliyor.
Dave,

1

Fark ne? orada sadece 2 farklı kelime var, aynı şeyi yapacak yani asıl sorun hangisinin size daha net geldiği?

"Sonuç" veya "zorglub".

Sonuçların elde edebileceğiniz diğer sonuçlarla karşılaştırılmasının daha kolay ZorglubResultolduğunu ve sonuç olarak gördüğünüz sonucu görmek için bir başlangıç yapmayı tercih ederim Zorglub.


1

türüne göre adlandırmalı mıyım?

Hayır asla. Buna Macarca Sistem adı verilir ve ihtiyaç duyduğunuzda herhangi bir değişkenin türünü görüntüleyebilecek bir program kullanma fikri önemsiz biçimde eskidir.


1

Kodda herhangi bir şeyi adlandırmanız gerektiğinde, açıklayıcı, anlamlı ve okunabilir adlar sağlamanız gerekir. Bir geri dönüş değişkeni söz konusu olduğunda, insanların adlandırma konusunda endişeli olma eğiliminde olduklarının iyi bir örneği vardır.

Açıkça adlandırılmış bir işleve sahipseniz ve yalnızca tek bir kod satırına ihtiyacınız varsa, adı tamamen atlayabilirsiniz. Yöntemlerinizi kısa ve tek bir amaç haline getirmek, her zaman hedef almanız gereken idealdir. Bununla birlikte, bazen birkaç kod satırı içeren bir işlevi tamamlamanız gerekebilir. Bu gibi durumlarda, işlevin amacına uygun değişkeni adlandırmanız her zaman tavsiye edilir.

Eğer işlevin amacı bir hesaplama veya karar algoritmasının sonucunu döndürmekse, resultdeğişkeninizin kullanması için mükemmel bir addır, fakat ya işleviniz bir listeden bir öğe döndürüyorsa? İşleviniz matematikle veya listelerle ilgisi olmayan başka bir amaca hizmet ediyorsa? Bu gibi durumlarda, değişkene, fonksiyonun neden yaratıldığına ilişkin anlamlı bir isim vermek daha iyidir. Elbette, eğer istersen, başka bir şeyle çakışması muhtemel olmayan bir isim, çünkü okunabilirlik perspektifinden değişkenine daha anlamlı ve bağlamsal bir isim vermek daha mantıklı olur.


0

Onları birleştirmeyi seviyorum, ne olduğunu ve iade edilmek istendiğini gösteriyor.

yani örneğinizde sonuçZorglub olurdu

Eğer gerçekten ne olduğu önemli değil, sadece sonuçtan daha önemliyse (resultString değil)


Fena değil ama dönüş tipi değişirse değişkeninizi yeniden adlandırmanız gerekecek. Modern IDE ile sanırım yine de bir veya iki tıklamayla yapılır.
Jalayn

@Jalayn Evet, ancak türün adı dışında tutulması durumunda, yapılması gereken bir değişiklik olmazdı. (Bir yöntem basit bir adın net olmadığı yeterince uzunsa, muhtemelen çok uzun olur ve yeniden uygulanmalıdır.)
Donal Fellows

@DonalFellows Size tamamen katılıyorum. Kaynak havuzundan güncelleme yaparken ne kadar az değişiklik görürseniz, o kadar iyidir.
Jalayn

Tamam, geri dönüş türünü değiştirdiğinizde, değişken adına da değiştirmeyi unutabileceğinizi kabul etti, bu bir sorun. Şimdiye kadar benim için hiç sorun olmadı. Ben hala ismin içinde çift niyet göstermeyi seviyorum ama daha küçük zaten iyi gösterilen niyet kodu ile de overkill olabilir. Siz ikiniz beni ikna ettiniz. Bundan sonra değişkenlerimi bu şekilde arama ihtiyacım olduğunu hissedersem, daha fazla ihtiyaç hissedene kadar refactor olurum. Thanks
KeesDijk

0

Bir noktada bir dönüş değeri ayarlamak ve sonra onu değiştirebilecek tüm kodları atlamak için koşullu kullanmak ile hemen kullanmak arasında bir fark göremiyorum return, bu yüzden doğrudan dönüş için gidiyorum, dolayısıyla resultdeğişken yok .

Koşullu kodla değiştirilebilecek veya değiştirilemeyecek bir ara değeriniz varsa, o zaman bir sonuç (henüz) değildir, bu nedenle kesinlikle adlandırılmaması gerekir.


0

C ++ 'da çalışırken ve sanırım Java'da da geçerli olabilir.

Örneğin

int Width() const
{
    Requires(....);
    Requires(....);

    //calculation

    Ensures(...);
    Ensures(...);
    return Result;
}

Bu, garantinin yöntemin sonunda olması gerektiği için sözleşmeyle tasarlanır. Ancak dönüş son olmalı. Sonuç bloğunu sağlamak için, mutlak bloğu takip edebilecek tek şey buydu.


0

Özyinelemeli bir işlevde, bir kuyruk çağrısı optimizasyonu yapmak için sonucu adım adım adım taşımak etkilidir. Kullanıcıya bir parametre sağlamaya gerek olmadığını belirtmek için, bir "sonuç" parametresinin adlandırılması makul olabilir:

def removeOccurence [A] (slice: Seq[A], original: Seq[A]) = {
  @scala.annotation.tailrec
  def remove (leftOriginal: Seq[A], result: Seq[A]) : Seq[A] =
    trimStart (slice, leftOriginal) match {
      case (h :: tail) => remove (tail, h +: result)
      case (Nil)       => result.reverse
    }
    remove (original, Nil)
}

Ancak daha çok, vahşi doğada gördüğüm ve fikri çoğu zaman daha da iyi taşıyan “taşıma” ve “sofar” kullanıyorum.

Elbette, ikinci bir neden, eğer konunuz '' sonuç '' kelimesini önerirse, örneğin, aritmetik değerlendirme yaparsanız. Formülü ayrıştırabilir, değişkenleri değerlerle değiştirebilir ve sonunda bir sonuç hesaplayabilirsiniz.

Üçüncü bir neden daha önce belirtildi, ancak küçük bir sapma var: Bir iş yapan bir yöntem yazıyorsunuz, diyelim ki '' max '' şeklini değerlendirdiğini diyelim.

def max = {
  val result = somethingElseToDo
  if (foo) result else default 
}

'' Sonuç '' sonucunu çağırmak yerine '' max '' diyebiliriz, ancak bazı dillerde bir yöntem çağrılırken parantezi ihmal edebilirsiniz, bu nedenle max yöntemin kendisine tekrarlı bir çağrı olacaktır.

Genelde sonucun ne olduğunu söyleyen bir ismi tercih ederdim. Fakat eğer bu isim zaten birden fazla değişken, öznitelik veya metot tarafından alınmışsa, bir GUI alanı olduğundan, bir dize temsili, sayısal ve bir diğeri veritabanı için, bir diğeri kullanmak karışıklık olasılığını arttırır. 3 ila 7 satırlık kısa yöntemlerde, '' sonuç '' bir isim için sorun olmamalıdır.


0

Nesne Pascal'da bu bir seçim değildir. Resultİşlevin kodundaki bir yere değişkene değer atamanız gerekir .

Örnek:

function AddIntegers( A,B: Integer): Integer;
begin
  Result := A + B; 
end; 

Bu yüzden benim için oldukça doğal bir dönüş değeri almak için bir "Sonuç" (veya "Retorno", dilin ayrılmış sözcükleriyle isim çakışmasından kaçınmak için Portekizce'yi hecelediğim için) var.

Tabii ki, eğer C'den türetilmiş bir dilde çok basit bir ifade ise, bir sonuç değişkeni bildirmekle uğraşmayacağım - ifadeyi doğrudan geri döndürmek.


0

Sadece sonucu ne adlandırdığınla değil ('r' ye özgüdür), ama aynı zamanda nasıl kullanıldığı. örneğin, bir dönüş değişkenine sahip olacaksanız, her return ifadesi bunu döndürmelidir. 'return r;' yok sonunda, ancak yöntem / işlev boyunca 'return m * x + b; "gibi şeyler serpin." r = m * x + b; yerine r; "dön.


-1

sonuç iyi. İlk bakışta kodu anlayabiliyorum, böylece değişken ismi bu amaca hizmet etti.

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.