Bu kod parçasında, bu arada, bu şekilde kısaltılabilen birkaç sorun vardır:
public List<Money> getMoneyByPersons() {
return persons.size() == 1 ?
moneyService.getMoneyIfHasOnePerson() :
moneyService.getMoney();
}
Bir kişinin neden özel bir durum olduğu belirsizdir. Bir kişiden para almanın birkaç kişiden para almanın radikal bir şekilde farklı olduğunu söyleyen özel bir iş kuralı olduğunu düşünüyorum. Ancak, her ikisine de bakmalıyım getMoneyIfHasOnePerson
ve getMoney
neden farklı vakalar olduğunu anlamayı umuyorum.
İsim getMoneyIfHasOnePerson
doğru görünmüyor. Adından, yöntemin tek bir kişi olup olmadığını kontrol etmesini ve bu durumda ondan para almasını beklerim; aksi takdirde hiçbir şey yapmayın. Kodunuzdan bu gerçekleşen şey değildir (ya da koşulu iki kez yapıyorsunuz).
List<Money>
Koleksiyondan ziyade geri dönmek için herhangi bir neden var mı ?
Geri sorunuzun, çünkü bir kişi için özel bir tedavi yoktur neden belli değildir, basamaklı bir, bir sabit değiştirilmesi gerektiğini sürece kurallar açık hale getirmek için başka bir yolu yoktur. Burada, kişi diğer sihirli numaralardan çok da farklı değildir. Özel tedavinin bir, iki veya üç kişi veya sadece on iki kişiden fazlası için geçerli olduğunu belirten iş kurallarınız olabilir.
En iyi çözümü seçmek için bağlamı nasıl ayırt edebilirim?
Kodunuzu daha açık hale getiren her şeyi yaparsınız.
örnek 1
Aşağıdaki kod parçasını düşünün:
if (sequence.size() == 0) {
return null;
}
return this.processSequence(sequence);
Burada sıfır büyülü bir değer midir? Kod oldukça açıktır: dizide hiçbir öğe yoksa, onu işlemeyelim ve özel bir değer döndürelim. Ancak bu kod şu şekilde de yeniden yazılabilir:
if (sequence.isEmpty()) {
return null;
}
return this.processSequence(sequence);
Burada, artık sabit değil ve kod daha da net.
ÖRNEK 2
Başka bir kod parçası alın:
const result = Math.round(input * 1000) / 1000;
round(value, precision)
Aşırı yükü olmayan JavaScript gibi dillerde ne yaptığını anlamak çok fazla zaman almaz .
Şimdi, bir sabiti tanıtmak isterseniz, buna nasıl denir? Bulabileceğiniz en yakın terim Precision
. Yani:
const precision = 1000;
const result = Math.round(input * precision) / precision;
Okunabilirliği artırır mı? Olabilir. Burada, bir sabitin değeri oldukça sınırlıdır ve kendinize yeniden düzenlemeyi gerçekten yapmanız gerekip gerekmediğini sorabilirsiniz. Buradaki güzel şey şu ki, hassasiyet sadece bir kez ilan edildi, bu yüzden değişirse, aşağıdaki gibi bir hata yapma riskiniz yoktur:
const result = Math.round(input * 100) / 1000;
bir konumdaki değeri değiştirmek ve diğerinde yapmayı unutmak.
ÖRNEK 3
Bu örneklerden, sayıların her durumda sabitlerle değiştirilmesi gerektiği izlenimini edinebilirsiniz . Bu doğru değil. Bazı durumlarda, sabit olması kodun geliştirilmesine yol açmaz.
Aşağıdaki kod parçasını alın:
class Point
{
...
public void Reset()
{
x, y = (0, 0);
}
}
Sıfırları bir değişkenle değiştirmeye çalışırsanız, zorluk anlamlı bir isim bulmak olacaktır. Nasıl adlandırırdın? ZeroPosition
? Base
? Default
? Burada bir sabitin girilmesi kodu hiçbir şekilde geliştirmez. Biraz daha uzun sürerdi ve sadece bu.
Ancak bu tür vakalar nadirdir. Kodda bir sayı bulduğunuzda, kodun nasıl yeniden düzenlenebileceğini bulmaya çalışın. Kendinize bu sayının bir ticari anlamı olup olmadığını sorun. Evetse, bir sabit zorunludur. Hayır ise, numarayı nasıl adlandırırsınız? Anlamlı bir isim bulursanız, bu harika. Değilse, sabitin gereksiz olduğu bir durum buldunuz.
persons
geliyor ve ne anlatıyor? Kodunuzun herhangi bir yorumu yok, bu yüzden ne yaptığını tahmin etmek zor.