Istnieje kilka problemów z tym fragmentem kodu, który, nawiasem mówiąc, można skrócić w następujący sposób:
public List<Money> getMoneyByPersons() {
return persons.size() == 1 ?
moneyService.getMoneyIfHasOnePerson() :
moneyService.getMoney();
}
Nie jest jasne, dlaczego jedna osoba jest przypadkiem szczególnym. Przypuszczam, że istnieje konkretna reguła biznesowa, która mówi, że otrzymywanie pieniędzy od jednej osoby różni się radykalnie od otrzymywania pieniędzy od kilku osób. Muszę jednak zajrzeć do środka getMoneyIfHasOnePerson
i getMoney
mieć nadzieję, że zrozumiem, dlaczego istnieją różne przypadki.
Nazwa getMoneyIfHasOnePerson
nie wygląda dobrze. Po nazwisku spodziewałbym się, że metoda sprawdzi, czy jest jedna osoba, a jeśli tak, to dostanie od niego pieniądze; w przeciwnym razie nic nie rób. Z twojego kodu nie dzieje się tak (lub wykonujesz ten warunek dwa razy).
Czy istnieje powód, aby zwrócić List<Money>
raczej kolekcję niż kolekcję?
Wracając do twojego pytania, ponieważ nie jest jasne, dlaczego istnieje specjalne traktowanie dla jednej osoby, cyfrę należy zastąpić stałą, chyba że istnieje inny sposób, aby wyjaśnić reguły. Tutaj jedna nie różni się niczym od żadnej innej magicznej liczby. Możesz mieć reguły biznesowe mówiące, że specjalne traktowanie dotyczy jednej, dwóch lub trzech osób, lub tylko więcej niż dwunastu osób.
Jak odróżnić kontekst, aby wybrać najlepsze rozwiązanie?
Robisz wszystko, co czyni kod bardziej wyraźnym.
Przykład 1
Wyobraź sobie następujący fragment kodu:
if (sequence.size() == 0) {
return null;
}
return this.processSequence(sequence);
Czy zero tutaj jest magiczną wartością? Kod jest raczej jasny: jeśli w sekwencji nie ma żadnych elementów, nie przetwarzajmy go i zwróć specjalną wartość. Ale ten kod można również przepisać w następujący sposób:
if (sequence.isEmpty()) {
return null;
}
return this.processSequence(sequence);
Tutaj nie ma już stałej, a kod jest jeszcze wyraźniejszy.
Przykład 2
Weź inny fragment kodu:
const result = Math.round(input * 1000) / 1000;
Nie trzeba wiele czasu, aby zrozumieć, co robi w takich językach, jak JavaScript, których nie ma round(value, precision)
przeciążenia.
Teraz, jeśli chcesz wprowadzić stałą, jak by się nazywała? Najbliższy termin, jaki można uzyskać, to Precision
. Więc:
const precision = 1000;
const result = Math.round(input * precision) / precision;
Czy poprawia to czytelność? Może być. Tutaj wartość stałej jest raczej ograniczona i możesz zadać sobie pytanie, czy naprawdę musisz przeprowadzić refaktoryzację. Zaletą jest to, że teraz precyzja jest deklarowana tylko raz, więc jeśli się zmieni, nie ryzykujesz popełnienia błędu, takiego jak:
const result = Math.round(input * 100) / 1000;
zmieniając wartość w jednym miejscu i zapominając o zrobieniu tego w drugim.
Przykład 3
Z tych przykładów możesz mieć wrażenie, że liczby należy w każdym przypadku zastąpić stałymi . To nie jest prawda. W niektórych sytuacjach posiadanie stałej nie prowadzi do poprawy kodu.
Weź następujący fragment kodu:
class Point
{
...
public void Reset()
{
x, y = (0, 0);
}
}
Jeśli spróbujesz zamienić zera na zmienną, trudność polegałaby na znalezieniu sensownej nazwy. Jak byś to nazwał? ZeroPosition
? Base
? Default
? Wprowadzenie stałej tutaj nie poprawiłoby w żaden sposób kodu. Wydłużyłoby to nieco czas i tylko tyle.
Takie przypadki są jednak rzadkie. Tak więc za każdym razem, gdy znajdziesz numer w kodzie, postaraj się znaleźć sposób, w jaki kod może być refaktoryzowany. Zadaj sobie pytanie, czy liczba ma znaczenie biznesowe. Jeśli tak, stała jest obowiązkowa. Jeśli nie, jak nazwałbyś numer? Jeśli znajdziesz sensowną nazwę, to świetnie. Jeśli nie, istnieje prawdopodobieństwo, że stała jest niepotrzebna.
persons
pochodzi i co opisuje? Twój kod nie ma żadnych komentarzy, więc trudno zgadnąć, co robi.