Bir nesne örnek değişkeni ne zaman kullanılır, yönteme bir bağımsız değişken iletilirken


93

Bir yönteme bağımsız değişkenler iletmekle bunları nesnenin tüm yöntemleri tarafından görülebilen nesne örnek değişkenleri olarak bildirmek arasında nasıl karar verirsiniz?

Örnek değişkenlerini Sınıfın sonundaki bir listede tutmayı tercih ederim, ancak bu liste programım büyüdükçe uzar. Bir değişken yeterince sık geçirilirse, ona ihtiyaç duyan tüm yöntemler tarafından görülebilmesi gerektiğini düşünüyorum, ama sonra merak ediyorum, "eğer her şey halka açıksa, hiçbir şeyi geçirmeye hiç gerek kalmayacak!"


1
Belirli bir örneğiniz varsa, daha doğrudan yararlı yanıtlar alabilirsiniz
brabster

Yanıtlar:


55

Örnek değişkenlere atıfta bulunduğunuz için, nesne yönelimli bir dilde çalıştığınızı varsayıyorum. Bir dereceye kadar, örnek değişkenlerin ne zaman kullanılacağı, kapsamlarının nasıl tanımlanacağı ve yerel değişkenlerin ne zaman kullanılacağı özneldir, ancak sınıflarınızı her oluştururken izleyebileceğiniz birkaç temel kural vardır.

  • Örnek değişkenleri tipik olarak bir sınıfın öznitelikleri olarak kabul edilir. Bunları, sınıfınızdan yaratılacak nesnenin sıfatları olarak düşünün. Örnek verileriniz nesneyi tanımlamaya yardımcı olmak için kullanılabiliyorsa, muhtemelen bunun iyi bir seçim olduğuna emin olabilirsiniz.

  • Yerel değişkenler, işlerini tamamlamalarına yardımcı olmak için yöntemler kapsamında kullanılır. Genellikle, bir yöntemin amacı bazı verileri elde etmek, bazı verileri döndürmek ve / veya bazı veriler üzerinde bir algoritma işlemek / çalıştırmak olmalıdır. Bazen, bir yöntemin baştan sona ulaşmasına yardımcı olmanın yolları olarak yerel değişkenleri düşünmek yardımcı olur.

  • Örnek değişken kapsamı yalnızca güvenlik için değil, aynı zamanda kapsülleme içindir. "Hedefin tüm değişkenleri gizli tutmak" olduğunu varsaymayın. Kalıtım durumunda, değişkenleri korumalı yapmak genellikle iyi bir alternatiftir. Tüm örnek verilerini herkese açık olarak işaretlemek yerine, dış dünyaya erişilmesi gerekenler için alıcılar / ayarlayıcılar oluşturursunuz. Hepsini, yalnızca ihtiyacınız olanları kullanıma sunmayın. Bu, geliştirme yaşam döngüsü boyunca gerçekleşecek - en başından beri tahmin etmek zor.

Bir sınıfta veri aktarımı söz konusu olduğunda, bazı kodlar görmeden yaptığınız şeyin iyi bir uygulama olduğunu söylemek zordur. Bazen doğrudan örnek verileri üzerinde çalışmak iyidir; diğer zamanlarda değil. Bence bu deneyimle gelen bir şey - nesne yönelimli düşünme becerileriniz geliştikçe biraz sezgiler geliştireceksiniz.


Cevabım bu cevabı H-Man2 cevabına (ömür boyu) eklemek olacaktır. Yalnızca ve ancak nesnenin kalıcı bir durumuysa üye özelliği olmalıdır. Yani, değer, mevcut yöntem yığınının kapsamı dışında kendi başına anlam ifade eder.
David Rodríguez - dribeas

1
İçimden gelen tepkim David ve H-MAn2 ile aynı fikirde olmak. Bununla birlikte, Robert c Martin tarafından "temiz kod" okuyorum ve 3. bölümde, bir şeyi bir yöntem parametresinden bir üye değişkenine taşımak için kodu yeniden işliyor, çünkü birçok parametreye sahip olmak kötüdür. Dengeli olarak, sanırım sınıfınızın sadece tek bir sorumluluğu varsa, o zaman nesnenin ömrü o hesaplamanın yaşam süresiyle aynıdır, bu yüzden belki de asıl cevap, bu soruyu sormanız gerekiyorsa, sınıfınızın çok büyük olmasıdır.
Andy

@ DavidRod Rodríguez-dribeas Yöntem yığını derken neyi kastediyorsunuz?
committedandroider

@committedandroider: Eğer değer mevcut fonksiyon çağrısından daha uzun yaşarsa
David Rodríguez - dribeas

46

Temelde bu, değişkende sakladığınız verilerin yaşam süresine bağlıdır. Veriler yalnızca bir hesaplama sırasında kullanılıyorsa, bunu bir parametre olarak iletin. Veriler nesnenin yaşam süresine bağlıysa, bir örnek değişkeni kullanın.

Değişkenler listeniz çok uzadığında, sınıfın bazı bölümlerini yeni bir sınıfta yeniden düzenlemeyi düşünmek iyi bir nokta olabilir.


21

Benim görüşüme göre, örnek değişkenleri yalnızca veriler aramalar arasında kullanılacağı zaman gereklidir.

İşte bir örnek:

myCircle = myDrawing.drawCircle(center, radius);

Şimdi myDrawing sınıfının görüntülenmesi, myCircle nesnesini oluşturmak için 15 yardımcı işlev kullanır ve bu işlevlerin her birinin merkeze ve yarıçapa ihtiyacı olacaktır. Yine de myDrawing sınıfının örnek değişkenleri olarak ayarlanmamalıdırlar. Çünkü bir daha asla ihtiyaç duyulmayacak.

Öte yandan, myCircle sınıfının hem merkezi hem de yarıçapı örnek değişkenleri olarak saklaması gerekecektir.

myCircle.move(newCenter);
myCircle.resize(newRadius);

MyCircle nesnesinin, bu yeni çağrılar yapıldığında yarıçapının ve merkezin ne olduğunu bilmesi için, yalnızca onlara ihtiyaç duyan işlevlere aktarılmak yerine örnek değişkenleri olarak depolanmaları gerekir.

Yani temel olarak, örnek değişkenler bir nesnenin "durumunu" kaydetmenin bir yoludur. Bir nesnenin durumunu bilmek için bir değişken gerekli değilse, o zaman bir örnek değişken olmamalıdır.

Ve her şeyi halka açık hale getirmeye gelince. Şu anda hayatınızı kolaylaştırabilir. Ama sana musallat olmak için geri gelecek. Pease yapmaz.


Yine de parametreleri (oldCenter, newCenter) kullanmak için sadece hareket tanımlayabilirsiniz.
obesechicken 13

4

BENİM NACİZANE FİKRİME GÖRE:

Değişken, örneğin durumunun bir parçasını oluşturuyorsa, bir örnek değişkeni olmalıdır - sınıf örneği HAS-A örneği değişken.

Kendimi bir örneğin yöntemlerine tekrar tekrar bir şey geçirirken bulursam veya çok sayıda örnek değişkenine sahip olduğumu fark edersem, bir şeyi kaçırmış olsaydım veya bir yerde kötü bir soyutlama yapmış olsaydım, muhtemelen tasarımıma bakmaya çalışırdım.

Umarım yardımcı olur


3

Tabii ki sınıfta genel değişkenlerin büyük bir listesini tutmak kolaydır. Ama sezgisel olarak bile, bunun gidilecek yol olmadığını anlayabilirsiniz.

Her değişkeni kullanmadan hemen önce tanımlayın. Bir değişken belirli bir yöntemin işlevini destekliyorsa, onu yalnızca yöntem kapsamında kullanın.

Ayrıca güvenliği de düşünün, bir genel sınıf değişkeni "dış" koddan istenmeyen değişikliklere karşı hassastır. Ana hedefiniz tüm değişkenleri özel tutmak olmalı ve olmayan herhangi bir değişkenin böyle olması için çok iyi bir nedeni olmalıdır.

Parametreleri yığının sonuna kadar geçirmekle ilgili olarak, bu çok hızlı çirkinleşebilir. Temel kural, yöntem imzalarınızı temiz ve zarif tutmaktır. Aynı verileri kullanan birçok yöntem görürseniz, sınıf üyesi olmak için yeterince önemli olup olmadığına karar verin ve değilse, daha anlamlı olması için kodunuzu yeniden düzenleyin.

Sağduyuya dönüşür. Her yeni değişkeni tam olarak nerede ve neden ilan ettiğinizi, işlevinin ne olması gerektiğini düşünün ve buradan hangi kapsamda olması gerektiğine dair bir karar verin.


Genellikle yöntemlerin halka açık olmasını istersiniz, böylece onları birim test edebilirsiniz.
obesechicken 13
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.