Yapılar, Java'da bile kendi yerlerine sahiptir. Bunları yalnızca aşağıdaki iki şey doğruysa kullanmalısınız:
- Sadece herhangi bir davranışı olmayan verileri toplamanız gerekir, örneğin bir parametre olarak geçmek için
- Toplanan verilerin ne tür bir değeri olduğu önemli değil.
Bu durumda, alanları halka açık hale getirmeli ve alıcıları / ayarlayıcıları atlamalısınız. Alıcılar ve ayarlayıcılar yine de sıkıntılıdır ve Java, kullanışlı bir dil gibi özelliklere sahip olmadığı için aptalcadır. Yapı benzeri nesneniz zaten herhangi bir yönteme sahip olmamalı olduğundan, ortak alanlar en mantıklı olanıdır.
Ancak, bunlardan herhangi biri geçerli değilse, gerçek bir sınıfla karşı karşıya kalırsınız. Bu, tüm alanların özel olması gerektiği anlamına gelir. (Daha erişilebilir bir kapsamda kesinlikle bir alana ihtiyacınız varsa, bir alıcı / alıcı kullanın.)
Sözde yapınızın davranış olup olmadığını kontrol etmek için alanların ne zaman kullanıldığına bakın. Söylemeyi ihlal ediyor gibi görünüyorsa , sormayın , o zaman bu davranışı sınıfınıza taşımalısınız .
Verilerinizden bazılarının değişmemesi gerekiyorsa, tüm bu alanları kesinleştirmeniz gerekir. Sınıfınızı değişmez kılmayı düşünebilirsiniz . Verilerinizi doğrulamanız gerekiyorsa, ayarlayıcılarda ve kurucularda doğrulama sağlayın. (Yararlı bir püf noktası, özel bir belirleyici tanımlamak ve yalnızca o belirleyiciyi kullanarak alanınızdaki sınıfınızı değiştirmek.)
Şişe örneğiniz muhtemelen her iki testte de başarısız olur. Şuna benzer bir kod (olabilir) olabilir:
public double calculateVolumeAsCylinder(Bottle bottle) {
return bottle.height * (bottle.diameter / 2.0) * Math.PI);
}
Bunun yerine olmalı
double volume = bottle.calculateVolumeAsCylinder();
Yüksekliği ve çapı değiştirdiyseniz, aynı şişe olur mu? Muhtemelen değil. Bunlar kesin olmalı. Çap için negatif bir değer tamam mı? Şişen geniş olduğundan daha uzun olmalı mı? Kapak null olabilir mi? Hayır? Bunu nasıl onaylıyorsunuz? Müşterinin aptal ya da kötü olduğunu varsayalım. ( Farkı söylemek mümkün değil. ) Bu değerleri kontrol etmeniz gerekiyor.
Yeni Bottle sınıfınız şöyle görünebilir:
public class Bottle {
private final int height, diameter;
private Cap capType;
public Bottle(final int height, final int diameter, final Cap capType) {
if (diameter < 1) throw new IllegalArgumentException("diameter must be positive");
if (height < diameter) throw new IllegalArgumentException("bottle must be taller than its diameter");
setCapType(capType);
this.height = height;
this.diameter = diameter;
}
public double getVolumeAsCylinder() {
return height * (diameter / 2.0) * Math.PI;
}
public void setCapType(final Cap capType) {
if (capType == null) throw new NullPointerException("capType cannot be null");
this.capType = capType;
}
// potentially more methods...
}