Herkese açık, korumalı, özel kullanım için en iyi uygulamalar?


12

Bir şeyi privatekodlarken her şeyi en üst düzeye çıkarmanın iyi bir uygulama olduğunu söylemek adil midir?

Ve sonra sadece protectedbir alt sınıfa ihtiyaç duyuyorsa ya publicda başka bir sınıfa ihtiyaç duyuyorsa?


2
Bazı API'lar oluşturuyorsanız, bir arayanın ihtiyaç duyabileceği işlevselliği tahmin etmeniz gerekir. Bu nedenle erişim değiştiricilerinize daha fazla düşünmeniz gerekir. Yazdığınız kodu kimin kullandığına bağlıdır.
Kullanıcı2023861

Yanıtlar:


10

Kısa cevap: Evet

Daha uzun cevap:

Evet, ancak bu, sınıflarınızı özel her şeyle yazarak başlamak için bir öneri olarak yorumlanmamalıdır; bu yaklaşım, bir arayüze yerleşmeden önce uygulama ayrıntılarına odaklanarak sınıf tasarımını ifade eder.

Bir sınıfı tasarlarken dikkate alınması gereken en önemli hususlardan biri, sınıfın nasıl kullanılacağıdır; özel / uygulama ayrıntıları hakkında düşünmeye başlamadan önce genel yöntemlerinizi düşünmeyi içerir.

Dahası, bu yaklaşım genellikle kendinize "Bu sınıf için nasıl bir birim testi yazarım?" Diye sorma şansını kaçırıyor. - bu gerçekten birim testler yazmasanız bile sorulması gereken önemli bir sorudur. (İlgili: "Test edilebilir kodu tanıtan tasarım ilkeleri nelerdir?" )

Bu nedenle, genel arayüzü tanımladıktan sonra, geri kalanını özel olarak varsayılan yapmak iyi bir fikirdir, çünkü bunların çoğu tipik olarak sınıf dışındaki herhangi bir şey için endişe duymayan cesur uygulama detayı olacaktır.


Bu yüzden size söylediklerinizi size özetlemeye çalışacak olsaydım (anlayıp anlamadığımı görmek için), bunun yerine önce halka bakan arayüzü düşünmek iyi bir fikirdir (yani, bu sınıf aslında dışarıda?) ve sonra her şeyi özel yapmak?
AJJ

1
@ArukaJ İyi bir yaklaşım, uygulamayı oluşturmadan önce sınıflarınızı kullanacak kod yazmaktır. Önce birim testleri yazmaya başlayıncaya kadar bu biraz tavuk veya yumurta problemi olabilir.
JimmyJames

1
@ArukaJ Geniş evet; JimmyJames'in bahsettiği gibi, birim testleri yazarken çok daha sezgisel geliyor. Biraz farklı bir zihniyet içerebilir, ancak amaç sınıfınızın neyi temsil ettiği ve girdilerinizin / çıktılarınızın neye benzediğini daha dikkatli düşünmektir - genel olarak tasarım hakkında daha çok "OO" düşünme şekli; yüksek kohezyonlu düzgün kapsüllenmiş sınıflarla sonuçlanma olasılığı daha yüksektir.
Ben Cottrell

Sınıfınızı tasarlamak için birim testleri kullanmaktan keyif alıyorum, çünkü birim testleri gerçekten kullanacak olanlar değil. Ancak, sınıfın nasıl kullanılacağını düşünmede kesinlikle hiç yoktan iyidirler.
user949300

8

"Ve sonra sadece bir alt sınıfa ihtiyaç duyuyorsa onu korumalı hale mi, yoksa başka bir sınıfa ihtiyaç duyarsa herkese açık mı?"

Bu yanlış yaklaşım. Tasarım zamanında, hangi kamu erişimini vermek istediğinizi bilmelisiniz . Genellikle herkese açık erişim sağlarsınız çünkü sınıfınızın tüm amacı budur. Ve korumalı erişim sağlıyorsunuz çünkü alt sınıfların bir şeye erişmesini istiyorsunuz . Ve kimsenin işi olmayan şeyler için özel kullanırsınız.

Birisi Şimdi eğer ihtiyaçları onlar erişemiyor şeyler erişmek, o zaman bu konuda gerçekten zor düşünmek gerekir ihtiyacı . Bu erişime ihtiyaçları olmamalı veya tasarımınız yanlış. Belki tasarım olan yanlış ve bir şey bunu değiştirmek, böylece kamu olması gerektiğini herkese açık değil. Tasarım doğru ise, o zaman birlikte bir terslik mi var ihtiyacı düzeltmek böylece, o tasarımınızı zarar yerine.


Let Diyelim ki şu anda alt sınıf niyetinde değilim (ve bu bir sınıf var demek olabilir gerek kalmayacak) ve eğer bir yöntemi vardı senin sınıf alt sınıf, yararlı olacağını / alt sınıf / tarafından gerekli. Bu yöntemi yapar mıydınız privateyoksa protected?
lfk

Kabul edilen cevap olmalı, düşünmek / tasarlamak istemiyormuşum gibi her şeyi ilk seslerde özel hale getirin.
Niing

1

Nesneye Dayalı programlamanın bu yönünü anlamanın anahtarı, veri kapsülleme kavramıdır . Fikir, bir sınıfın uygulama ayrıntılarını gizleyerek anlaşılmasını kolaylaştırmaktır. Buna veri gizleme denir . Bu nedenle, sadece sınıfı kullanmak için gerekli olan işlevleri ortaya çıkarmak istiyoruz. Bu işlevler sınıfın arabirimidir .

Arabirimi bir arabanın tekerleği gibi düşünün. Tekerleği çevirerek arabanın hangi yöne gittiğine siz karar verirsiniz, ancak kapakların altında tekerleklerin dönüşünü değiştiren döner valfler, hidrolikler, kasnaklar vardır, ancak araba sürmek için makine mühendisi olmanıza gerek yoktur.

Yani sorunuzun cevabı evet. Bir sınıfla ilgili diğer ayrıntıları olabildiğince fazla ayrıntı gizlemek istiyorsunuz. Bir şeyin ne zaman genel, özel veya korunmalı olması gerektiğini anlamak kolaydır, ancak ustalaşması zordur.

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.