Değişkenleri tekrar kullanmalı mıyım?


59

Değişkenleri tekrar kullanmalı mıyım?

Pek çok en iyi uygulamanın bunu yapmamanız gerektiğini söylediğini biliyorum, ancak daha sonra, farklı geliştirici kodun hatalarını ayıklarken ve birbirine benzeyen 3 değişken bulunduğunda ve tek fark, kodda farklı yerlerde oluşturulduklarıdır. Şaşkın. Ünite testi buna harika bir örnektir.

Ancak, ben do iyi uygulamalar buna karşı çoğu zaman olduğunu biliyoruz. Örneğin, yöntem parametrelerini "geçersiz kılmama" diyorlar.

En iyi uygulamalar bile önceki değişkenleri sıfırlamaya karşıdır (Java'da null, değişkene atadığınızda , Java 6'dan beri çöp toplayıcıyı çağırmak için yapmanız gerekmediğine dair bir uyarı veren Sonar vardır . Her zaman kontrol edemezsiniz. Hangi uyarıların kapatıldığı, varsayılanın açık olduğu zamanların çoğu


11
Java 6'dan beri mi? Java'nın herhangi bir sürümündeki değişkenlere boş değer atamanız gerekmez. Bir değişken kapsam dışına çıktığında, başvuruyu kendi nesnesine bırakır.
Kevin Panko

35
değişkenlerin yeniden kullanılması, kod
düşürücülerin

7
Değişkenlerin yeniden kullanımı değişkenlerinize uygun tanımlayıcıları seçmekle çelişir. Modern dillerde, iyi tanımlayıcılara sahip olmanın yararlarından ağır basan değişken yeniden kullanımı için gerçekten bir avantaj yoktur.
Joren,

4
Ayrıca, tüm yeniden kullanımların yeniden kullanım olmadığına dikkat edin. Eski FORTRAN programcıları, diğer dillere kaymış olanlar bile, rutin olarak tüm DO döngülerimiz için I, J, K, L, M, N (ya da i, j, k, l, m, n) kullanırlar. döngü) sayaçlar. SUM = SUM + A (I, K) * B (K, J) veya toplam + = a [i] [k] * b [k] [j]; gibi şeyleri görmeye alışkınız.
John R. Strohm

1
Değişkenlerin yeniden kullanımı, çok sınırlı kaynaklara (birkaç kByte RAM) sahip mikrodenetleyicileri programlarken gerekçelendirilebilir.
m.Alin

Yanıtlar:


130

Sorununuz yalnızca yöntemleriniz uzun olduğunda ve bir sırayla birden fazla iş yaparken ortaya çıkıyor. Bu, kodu kendi başına anlaması (ve dolayısıyla sürdürmesi) zorlaştırır. Değişkenleri tekrar kullanmak, bunun üzerine ekstra bir risk unsuru ekler, bu da kodun takip edilmesini zorlaştırır ve hataya daha açık hale getirir.

IMO'nun en iyi uygulaması, tüm sorunu ortadan kaldıran, yalnızca bir şeyi yapan kısa yöntemleri kullanmaktır.


birim testinden ne haber? örneğin, yöntemi ikinci kez çalıştırdıktan sonra hala beklendiği gibi çalışıp çalışmadığını test etmem gerekiyor.
IAdapter

20
@IAdapter, birim test kodu, standartların üretim kodundan daha rahat olabileceği farklı bir konudur. Yine de, okunabilir ve bakımı kolay hale getirmek yüksek önceliklidir. Ünite testlerinizden de metotları çıkarabilir (ve yapmanız gerekir) , kısa ve kolay okunması için (ve değişkenleri tekrar kullanma ihtiyacını ortadan kaldırmak için).
Péter Török,

3
@IAdapter, senaryo için ben ederim tarif değil bir değişken yeniden kullanın. Uygun olan şey result1 = foo(); result2 = foo(); Assert.AreEqual(result1, result2);, bu durumda bir değişkeni tekrar kullanmanız gereken çok fazla yer görmemem gibi bir şey olabilir.
JSB

1
@IAdapter (int i = 0; i <2; i ++) {result = foo (); assertEquals (expectedResult, result);}
Bill K

2
+1 - Bu, daha küçük yöntemlerin ne zaman yapılacağına dair iyi bir kod kokusu.

49

Bir yöntemde değişken yeniden kullanım, onu yeniden ayırmanız / bölmeniz gerektiğine dair güçlü bir işarettir.

Bu yüzden benim cevabım, onları tekrar kullanmamanız gerektiğidir, çünkü yaparsanız daha sonra yeniden düzenlemek çok daha zor olacaktır.


19

Değişir.

Bazı değişkenler, bir işlevin yürütülmesi sırasında değişebilen belirli bir veri türünün tutulması amacıyla oluşturulabilir. Dönüş kodları burada akla geliyor, örneğin:

void my_function() {
    HRESULT errorcode;
    errorcode = ::SomeWindowsApiFunction();
    if (FAILED(errorcode)) { /* handle error */ }
    errorcode = ::AnotherWindowsApiFunction();
    if (FAILED(errorcode)) { /* handle error */ }
}

Değişken ismi, bu değişkenin ne saklaması gerektiğini açıkça ortaya koyar. Bunun gibi diğer kullanım olanaklarının mümkün olduğunu düşünüyorum; burada değişken, kavramsal olarak bir fonksiyonun seyri sırasında çok benzer şeylerin farklı örnekleri tarafından mantıksal olarak kullanılan bir konteynerdir.

Bununla birlikte, genel olarak, bu yalnızca kodun olası okuyucuları için kesinlikle net olduğu durumlarda yapılmalıdır. Hiçbir durumda, kodun okunaklılığına bakılmaksızın aşırı optimizasyon dışında, değişken yalnızca tür uygun olduğu için yeniden kullanılmamalıdır.

Bunların hepsi temelde değişken adlandırmadaki iyi uygulamalardan kaynaklanmaktadır. İsimler kendileri için konuşmalı. Tüm yeniden kullanımlar için kesin amacı kısa bir isimle koymak zorsa, sadece farklı değişkenleri kullanmak en iyisidir.


15

Değişkenleri tekrar kullanmamamın en büyük nedeni (özellikle birim testlerde), test edilmesi ve hata ayıklaması zor olan gereksiz bir kod yolunu tanıtmasıdır. İyi bir birim testi diğer testlerden bağımsız olmalı ve bir birim test armatüründe sınıf (örnek) seviye değişkenini tekrar kullandığınızda, her testten önce durumlarını belirtmeyi sağlamalısınız. İyi bir birim testi ayrıca hataları izole eder, böylece teoride her test durumu (yöntem) sadece test edilen sistem için 1 davranış göstermelidir. Test yöntemleriniz bu şekilde yazılırsa, nadiren bir yöntem seviyesi değişkenini tekrar kullanmak için bir ihtiyaç veya fayda yoktur. Son olarak, kapanışları ve eşzamansız işlemeyi destekleyen dillerde, bir yöntemde değişkenleri yeniden kullanıyorsanız, cehennem olup bittiğini düşünmek gerçekten zor.


bu yüzden -testSomething gibi tek bir yöntem çağrısı için test yöntemleri yazmalıyım -testSomethingTwoInvocations ve sadece ikinci çağrı için iddia ediyor?
IAdapter

2
Evet. Başarısız olan ilk veya ikinci yineleme olup olmadığını belirlemenize yardımcı olur. mspec bunun için yardımcı olabilir, miras ağacı çok faydalı olacaktır.
Bryan Boettcher

Eğer "sınıf değişkeni" veya "örnek değişkeni" derken "değişken" kullanıyorsanız, kendinizi daha net ifade etmeniz gerekir.
gnasher729

13

Farklı değişkenler kullanmalısın. Meslektaşınızın kafasının karışacağından endişeleniyorsanız, rollerini açıkça belirten isimler verin.
Değişkenleri tekrar kullanmak, gelecekte muhtemel bir karışıklık kaynağıdır; Şimdi temizlemek için daha iyi.
Bazı durumlarda, aynı değişken adı tekrar kullanılabilir; örneğin ibasit bir sayma döngüsünde. Bu durumlarda, elbette değişkenlerin kendi kapsamlarında olduklarından emin olmalısınız.

EDIT: Değişkenleri tekrar kullanmak bazen Tek Sorumluluk İlkesinin ihlal edildiğinin bir işaretidir . Yeniden kullanılan değişkenin aynı rolde kullanılıp kullanılmadığını kontrol edin. Eğer öyleyse, hiçbir zaman yeniden kullanılamaz (söz konusu değişkenlerin kapsamını sınırlamak için iki farklı değişkene sahip olmasının hala tercih edilebilir olmasına rağmen). Farklı rollerde kullanılıyorsa, elinizde bir SRP ihlali vardır.


4

Diğer cevapların verdiği önerilerden bağımsız olarak bir değişkeni tekrar kullanmak isteyebileceğiniz bir durum vardır: derleyicinizin yardım için bir el gerektiğinde.

Bazı durumlarda, derleyiciniz, belirli bir sicile ayrılmış değişkenin artık kodun bir sonraki kısmı tarafından kullanılmadığını anlayacak kadar akıllı olmayabilir. Bu nedenle, bir sonraki değişkenler için teorik olarak ücretsiz kayıt olanağını kullanmayacak ve üretilen kod alt-optimal olabilir.

Bu durumu doğru şekilde yakalayamayan mevcut ana akım derleyicileri bilmediğime dikkat edin, derleyicinizin alt-optimal kod ürettiğini bilmediğiniz sürece asla, asla, asla bunu yapmayın. Özel derleyiciler içeren özel gömülü sistemler için derleme yapıyorsanız, yine de bu sorunla karşılaşabilirsiniz.


17
-1, bunun gerçekleştiği ve bir değişkeni tekrar kullanmanın kayda değer bir fark yarattığı gerçek dünyaya bir durum gösteremediğiniz sürece. Bu teorik bir soruna teorik bir çözümdür ve bu konuda çok iyi bir sorun değildir. Derleyicinin değişken koymaya karar verdiği durumlarda derleyicinin sorunu; derleyiciniz zayıf kod oluşturuyorsa ve gerçekten bir fark yaratıyorsa, derleyiciyi düzeltin veya değiştirin.
Caleb

3
@Caleb - özellikle tescilli gömülü platformlar için, geliştirmekte olduğunuz platformun derleyici kaynak koduna her zaman erişemezsiniz. Ben de MUYDUNUZ herhangi anki popüler derleyici biliyor (ya da aslında tercüman / VM) doğru ben baktım her durumda bu Canlılık analizi gerçekleştirmek yok olmadığını cevabım söylüyorlar. Ancak, ben var çok geçmişte çıplak kemikleri (10 yıl önce ya da öylesine) idi özel derleyicileriyle tescilli gömülü sistemlerde çalıştı. Sistemin kabiliyeti çok sınırlıydı ve derleyici de öyleydi, dolayısıyla bu durum orada gerçekleşti.
Joris Timmermans

2
+1 Geçmiş projede tam olarak böyle bir yeniden kullanım yaptım (ANSI C'de yazılmış oldukça optimize edilmiş medya kodu). Hatırladığım kadarıyla fark montajda kolayca görülebilir ve ölçütlerde ölçülebilirdi. Asla yapmadım ve umarım Java'da böyle bir yeniden kullanımı asla yapmak zorunda kalmayacaksınız.
gnat

@Caleb derleyiciyi sabitlemek veya değiştirmek, birkaç nedenden dolayı bir seçenek olmayabilir ve elinizde olanları yapmanız yeterlidir.

@ ThorbjørnRavnAndersen Öyle mi akla tek bir kötü derleyici kullanmak zorunda kalabileceğini ve dahası performansın ikinci derleyici tahmin ve kayıt yeniden kullanmak amacıyla kodunuzu işlemek isteyeceğiniz kadar kritik olabileceğini? Evet. Öyle mi olasılıkla ? Hayır. MadKeithV, gerçek bir dünya örneği sağlayamayacağını kabul etti. Bir mı iyi uygulama ? Öyle mi iyi tarzı ? Kod kalitesinin bir göstergesi mi? Kesinlikle hayır. Bu, soruya yazılı olarak yararlı bir cevap mı? MadKeithV'e saygı duyuyorum ama sanmıyorum.
Caleb

2

HAYIR derdim.

Bu senaryoyu düşünün: programınız çöktü ve temel bir dökümü inceleyerek ne olduğunu çözmeniz gerekiyor ... farkı görebiliyor musunuz? ;-)


Çekirdek dökümünüz optimize edilmiş bir derlemeden geliyorsa, değişkenler yine de belleği paylaşıyor olabilir. Yani o zaman daha az yardımcı olabilir.
Winston Ewert,

Tabii ki, optimize edilmiş bir yapı hata ayıklama için çok kullanışlı değil! ama yine de hata ayıklama yapısını kullanma seçeneğiniz hala var ... Ve hata ayıklayıcısını taktığınızda, değişkenlerin nasıl değiştiğini görmek için bir işlevin başlangıcından adım adım ilerlemeniz gerekmez, çünkü yapma! :-D
fortran

2

Hayır, makinenin çalıştığı kodu geliştirmiyorsunuz (... montaj kodu). Derleyicinin derleyicideki değişken için kullandığı hafızayı tekrar kullanmayı bırakın. Çoğu zaman bir kayıt olacak ve yeniden kullanmak size hiçbir şey almadı. Kodun okunmasını kolaylaştırmaya odaklanın.


0

Değişir. Türün değişkenler yerine değerlerde bulunduğu dinamik bir dilde, sonra örneğin bir dize olan bir işleve iyi adlandırılmış bir argüman varsa, Algoritmadaki bir değişiklik, her zaman bir tamsayı olarak yorumlandıktan sonra kullanıldığını, ardından ilk taslak olarak,

scrote = int (yazdı)

Ama sonunda fonksiyona gönderilen tipi değiştirmeye ve parametre tipindeki değişikliği not etmeye çalışırdım.


1
Uzun bir kod grubunun ortasına "scrote = int (scrote)" gibi bir satır koymak, bakım programcılarını çılgına çevirmek için harika bir yoldur.
07'de jhocking

Sorunun bahsettiğiniz "uzun kod grubu" ile olma olasılığı daha yüksektir.
Paddy3118 11:11

Kabul edilen cevapların not ettiği gibi, değişkenleri tekrar kullanmak sadece uzun kod dizileriyle ilgilidir. Temel olarak, "scrote = int (scrote)" gibi bir şey yazacağınız herhangi bir durumda int (scrote) 'i yeni bir değişkene koymayı ya da int (scrote)' i yeni bir fonksiyona geçirmeyi tercih ederim.
jhocking

0

İlk olarak, geliştirme ortamınıza bakın. Hata ayıklamada sorun yaşıyorsanız, farklı adlarda aynı adlara sahip beş değişkeniniz varsa ve hata ayıklayıcı size bu değişkenlerden hangisinin ihtiyacınız olduğunu göstermiyorsa, aynı adı taşıyan beş değişken kullanmayın. Bunu başarmanın iki yolu vardır: Bir değişken kullanın veya beş farklı isim kullanın.

Hata ayıklayıcınız, birçok değişkene sahip bir fonksiyonun hata ayıklamasını da acı verici hale getirebilir. 20 değişkenli bir işlevin 16 değişkenli bir hata ayıklaması daha zorsa, 5 değişkeni bir tane ile değiştirmeyi düşünebilirsiniz. ("Göz önünde bulundurun", "her zaman" olması gerektiği ile aynı değildir).

Değişken her zaman aynı amaca sahip olduğu sürece, birden fazla yerde kullanılan bir değişkeni kullanmak sorun değildir. Örneğin, on işlev çağrısı her çağrı için hemen işlenen bir hata kodu döndürürse, 10 değil bir değişken kullanın. Ancak aynı değişkeni tamamen farklı şeyler için kullanmayın. Bir müşteri adı için "isim" kullanmak, bir şirket adı için aynı değişkeni kullanmaktan sonra 10 satır kullanmak, bu kötüdür ve başınızı belaya sokar. Daha kötüsü, bir müşteri adı için "customerName" 'i ve 10 satır sonra da aynı şirket adı için "customerName" değişkenini kullanarak.

Önemli olan, hiçbir şey bir demir kuralı değildir. Her şeyin avantaj ve dezavantajları vardır. "En iyi uygulamalar" bir şeyi öneriyorsa ve bunun sizin durumunuz için kötü bir fikir olduğunu söylemek için nedenleriniz varsa, bunu yapmayın.


0

İlk olarak, geliştirme ortamınıza bakın. Hata ayıklamada sorun yaşıyorsanız, farklı adlarda aynı adlara sahip beş değişkeniniz varsa ve hata ayıklayıcı size bu değişkenlerden hangisinin ihtiyacınız olduğunu göstermiyorsa, aynı adı taşıyan beş değişken kullanmayın. Bunu başarmanın iki yolu vardır: Bir değişken kullanın veya beş farklı isim kullanın.

Hata ayıklayıcınız, birçok değişkene sahip bir fonksiyonun hata ayıklamasını da acı verici hale getirebilir. 20 değişkenli bir işlevin 16 değişkenli bir hata ayıklaması daha zorsa, 5 değişkeni bir tane ile değiştirmeyi düşünebilirsiniz. ("Göz önünde bulundurun", "her zaman" olması gerektiği ile aynı değildir).

Değişken her zaman aynı amaca sahip olduğu sürece, birden fazla yerde kullanılan bir değişkeni kullanmak sorun değildir. Örneğin, on işlev çağrısı, her çağrı için hemen işlenen bir hata kodu döndürürse, bir değişken kullanın ve 10 değil, bununla ilgili bir sorun vardır: Genellikle, derleyici başlatılmamış bir değişken kullandığınızda size söyler. Ancak burada, 6 çağrısı sonrasında hata kodunu okursanız, ancak değişken 5 çağrısından sonra değişmediyse, derleyici sizi uyarmadan işe yaramaz veriler elde edersiniz. Çünkü değişken, şimdi işe yaramaz olan verilerle başlatıldı.

Önemli olan, hiçbir şey bir demir kuralı değildir. Her şeyin avantaj ve dezavantajları vardır. "En iyi uygulamalar" bir şeyi öneriyorsa ve bunun sizin durumunuz için kötü bir fikir olduğunu söylemek için nedenleriniz varsa, bunu yapmayın.


-2

Bir durumu korumanız veya sabitleri tutmanız gerektiğinde global değişkenleri kullanın. Değişkenleri yeniden kullanarak, sadece bellekte bir yere işaret eden ismi yeniden kullanıyorsunuzdur. İlklendirmelerdeki açıklayıcı isimler yalnızca size netlik kazandırabilir (Java varsa ve ilkel OKB olmadığında).

El ile veya diğer geliştiricileri rahatsız edici şekilde kodlamada sakıncası yoksa.

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.