Co to jest magiczna liczba i dlaczego jest zła? [zamknięte]

zamknięte . To pytanie jest oparte na opinii . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Zaktualizuj pytanie, aby mogło być odpowiedź z faktami i cytatami przez edytując ten post .

Zamknięte 1 rok temu .

Popraw to pytanie Co to jest magiczna liczba?

Dlaczego należy tego unikać?

Czy są przypadki, w których jest to właściwe?

Author: Mark Amery, 2008-09-06

15 answers

Liczba magiczna jest bezpośrednim użyciem liczby w kodzie.

Na przykład, jeśli masz (w Javie):

public class Foo {
    public void setPassword(String password) {
         // don't do this
         if (password.length() > 7) {
              throw new InvalidArgumentException("password");
         }
    }
}

To powinno być refakturowane do:

public class Foo {
    public static final int MAX_PASSWORD_SIZE = 7;

    public void setPassword(String password) {
         if (password.length() > MAX_PASSWORD_SIZE) {
              throw new InvalidArgumentException("password");
         }
    }
}

Poprawia czytelność kodu i jest łatwiejszy w utrzymaniu. Wyobraź sobie przypadek, w którym ustawiłem rozmiar pola hasła w interfejsie graficznym. Jeśli używam magicznej liczby, za każdym razem, gdy zmienia się maksymalny rozmiar, muszę zmienić w dwóch miejscach kodu. Jeśli zapomnę jednego, doprowadzi to do niespójności.

JDK jest pełen przykłady jak w Integer, Character i Math klasy.

PS: narzędzia do analizy statycznej, takie jak FindBugs i PMD, wykrywają użycie magicznych liczb w kodzie i sugerują refaktoryzację.

 603
Author: Marcio Aguiar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-04 16:06:10

Liczba Magiczna to kodowana na twardo wartość, która może ulec zmianie na późniejszym etapie, ale może być trudna do aktualizacji.

Załóżmy na przykład, że masz stronę, która wyświetla ostatnie 50 zamówień na stronie przeglądu "Twoje zamówienia". 50 to magiczna liczba, ponieważ nie jest określona przez standard lub konwencję, jest to liczba, którą wymyśliłeś z powodów określonych w specyfikacji.

Teraz masz 50 w różnych miejscach-Twój skrypt SQL (SELECT TOP 50 * FROM orders), Twoja strona (Twój Ostatnie 50 zamówień), login twojego zamówienia (for (i = 0; i < 50; i++)) i prawdopodobnie wiele innych miejsc.

Co się stanie, gdy ktoś zmieni 50 na 25? albo 75? albo 153? Teraz musisz wymienić 50 we wszystkich miejscach i bardzo prawdopodobne jest, że go przegapisz. Find / Replace może nie działać, ponieważ 50 może być używane do innych rzeczy, a ślepe zastąpienie 50 przez 25 może mieć inne złe skutki uboczne (np. Twoje wywołanie Session.Timeout = 50, które jest również ustawione na 25 i użytkownicy zaczynają zgłaszać zbyt częste timeouty).

Także, kod może być trudny do zrozumienia, np. "if a < 50 then bla "- Jeśli napotkasz, że w środku skomplikowanej funkcji inni programiści, którzy nie są zaznajomieni z kodem, mogą zadać sobie pytanie " WTF to 50???"

Dlatego najlepiej mieć tak niejednoznaczne i dowolne liczby dokładnie w 1 miejscu - "const int NumOrdersToDisplay = 50", ponieważ to sprawia, że kod jest bardziej czytelny ("if a < NumOrdersToDisplay", oznacza to również, że trzeba go zmienić tylko w 1 dobrze zdefiniowanym miejscu.

Miejsca, w których magiczne liczby są odpowiednie, to wszystko, co jest zdefiniowany przez standard, tj. SmtpClient.DefaultPort = 25 lub TCPPacketSize = whatever (Nie wiem, czy jest on standaryzowany). Ponadto wszystko zdefiniowane tylko w ramach 1 funkcji może być dopuszczalne, ale to zależy od kontekstu.

 150
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-11 15:29:56

Przyjrzałeś się wpisowi w Wikipedii dla magiczna liczba?

To jest trochę szczegółów na temat wszystkich sposobów odniesienia magicznej liczby. Oto cytat o magicznej liczbie jako złej praktyce programistycznej

Pojęcie liczby magicznej odnosi się również do złej praktyki programowania polegającej na używaniu liczb bezpośrednio w kodzie źródłowym bez wyjaśnienia. W większości przypadków utrudnia to czytanie, rozumienie i utrzymywanie programów. Chociaż większość przewodników tworzy wyjątek dla liczb zero i jeden, jest dobrym pomysłem, aby zdefiniować wszystkie inne liczby w kodzie jako nazwane stałe.

 35
Author: somas1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-25 23:01:54

Liczba Magiczna Vs. stała symboliczna: kiedy zastąpić?

Magia: nieznana semantyka

Stała symboliczna - > dostarcza zarówno poprawnego semantycznego, jak i poprawnego kontekstu do użycia

Semantyczne: znaczenie lub cel rzeczy.

"Stwórz stałą, nazwij ją według znaczenia i zamień liczbę na nią."--Martin Fowler

Po pierwsze, magiczne liczby to nie tylko liczby. Każda podstawowa wartość może być "magiczna". Podstawowymi wartościami są jawne byty, takie jak liczby całkowite, liczby rzeczywiste, podwaja, pływaki, daty, ciągi znaków, booleans, znaki i tak dalej. Problemem nie jest typ danych, ale "magiczny" aspekt wartości, jaki pojawia się w naszym tekście kodu.

Co rozumiemy przez "magię"? Aby być precyzyjnym: poprzez "magię" zamierzamy wskazać semantykę (znaczenie lub cel) wartości w kontekście naszego kodu; że jest ona nieznana, niepoznawalna, niejasna lub myląca. To jest pojęcie "magii". Wartość podstawowa nie jest magiczna, gdy jej znaczenie semantyczne lub cel istnienia-jest szybko i łatwo znany, zrozumiały i zrozumiały (nie mylący) z kontekstu przestrzennego bez specjalnych słów pomocniczych (np. stała symboliczna).

Dlatego identyfikujemy magiczne liczby, mierząc zdolność czytnika kodów do poznania, bycia jasnym i zrozumienia znaczenia i celu podstawowej wartości z otaczającego ją kontekstu. Im mniej znany, mniej czytelny i bardziej zdezorientowany jest czytelnik, tym bardziej" magiczna " jest podstawowa wartość.

Pomocny Definicje

  • mylić: spowodować (ktoś), aby stać się oszołomiony lub zakłopotany.
  • oszołomiony: przyczyna (ktoś), aby stać się zakłopotany i zdezorientowany.
  • zakłopotany: całkowicie zdumiony; bardzo zdziwiony.
  • zdumiony: całkowicie oszołomiony lub zakłopotany.
  • zdziwiony: niezdolny do zrozumienia; zakłopotany.
  • zrozumieć: dostrzec zamierzone znaczenie (słów, języka lub mówcy).
  • znaczenie: co oznacza słowo, tekst, pojęcie lub akcja.
  • [[30]}oznaczało: zamierzać przekazać, wskazać lub odnieść się do (określonej rzeczy lub pojęcia); oznaczać.
  • oznacza: być wskazaniem.
  • wskazanie: znak lub informacja, która wskazuje coś.
  • wskaż: wskaż; Pokaż.
  • znak: przedmiot, jakość lub zdarzenie, którego obecność lub wystąpienie wskazuje na prawdopodobną obecność lub wystąpienie czegoś innego.

Podstawy

Mamy dwa scenariusze dla naszej magicznej podstawy wartości. Tylko drugi ma podstawowe znaczenie dla programistów i kodu:

  1. pojedyncza wartość podstawowa (np. liczba), z której jej znaczenie jest nieznane, niepoznawalne, niejasne lub mylące.
  2. podstawowa wartość (np. liczba) w kontekście, ale jej znaczenie pozostaje nieznane, niepoznawalne, niejasne lub mylące.

Nadrzędną zależnością "magii" jest to, że pojedyncza podstawowa wartość (np. liczba) nie ma powszechnie znanego semantycznego (jak Pi), ale lokalnie znanego semantycznego (np. Twój program), który nie jest do końca jasny z kontekstu lub może być nadużywany w dobrym lub złym kontekście (- ach).

Semantyka większości języków programowania nie pozwoli nam używać pojedynczych podstawowych wartości, z wyjątkiem (być może) jako danych (tj. tabel danych). Kiedy spotykamy "magiczne liczby", zwykle robimy to w kontekście. Dlatego odpowiedź na

"czy zamieniam tę magiczną liczbę na stałą symboliczną?"

Jest:

" Jak szybko można ocenić i zrozumieć znaczenie semantyczne numer (jego cel istnienia) w jego kontekście?"

Rodzaj magii, ale nie do końca

Mając to na uwadze, możemy szybko zobaczyć, jak liczba taka jak Pi (3.14159) nie jest "magiczną liczbą", gdy jest umieszczona w odpowiednim kontekście (np. 2 x 3.14159 X Promień lub 2*Pi*r). Tutaj Liczba 3.14159 jest umysłowo rozpoznawana Pi bez symbolicznego identyfikatora stałej.

/ Align = "center" / 3,14159 stały identyfikator jak Pi ze względu na długość i złożoność liczby. Aspekty długości i złożoności Pi (w połączeniu z potrzebą dokładności) zwykle oznaczają, że identyfikator symboliczny lub stała jest mniej podatna na błędy. Uznanie " Pi " jako nazwy jest po prostu wygodnym bonusem, ale nie jest głównym powodem posiadania stałej.

Tymczasem: powrót na ranczo

Pomijając zwykłe stałe, takie jak Pi, skupmy się przede wszystkim na liczbach o specjalnych znaczeniach, ale które te znaczenia są ograniczone do wszechświata naszego systemu oprogramowania. Taką liczbą może być "2" (jako podstawowa wartość całkowita).

Jeśli użyję liczby 2 sama, moje pierwsze pytanie może brzmieć: co oznacza "2"? Znaczenie "2" samo w sobie jest nieznane i niepoznawalne bez kontekstu, pozostawiając jego użycie niejasne i mylące. Chociaż posiadanie tylko " 2 " w naszym oprogramowaniu nie będzie miało miejsca z powodu semantyki języka, chcemy zobaczyć, że "2" samo w sobie nie niesie ze sobą specjalnej semantyki albo oczywistym celem samotności.

Let 's put our lone" 2 "in a context of: padding := 2, where the context is a "GUI Container". W tym kontekście znaczenie 2 (jako pikseli lub innej jednostki graficznej) pozwala nam szybko odgadnąć jego semantykę (znaczenie i cel). Możemy zatrzymać się tutaj i powiedzieć, że 2 jest w porządku w tym kontekście i nie ma nic więcej musimy wiedzieć. Jednak być może w naszym świecie oprogramowania nie jest to cała historia. Jest tego więcej, ale "padding = 2" jako kontekst nie może ujawnij to.

Załóżmy dalej, że 2 jako piksel padding w naszym programie jest z odmiany" default_padding " w całym naszym systemie. Dlatego pisanie instrukcji padding = 2 nie jest wystarczająco dobre. Pojęcie "default" nie jest ujawnione. Dopiero kiedy piszę: padding = default_padding jako kontekst, a potem gdzie indziej: default_padding = 2, w pełni uświadamiam sobie lepsze i pełniejsze znaczenie (semantyczne i celowe) 2 w naszym systemie.

Powyższy przykład jest całkiem dobry, ponieważ " 2 " samo w sobie może być czymkolwiek. Tylko wtedy, gdy ograniczamy zakres i domenę zrozumienia do "mojego programu", gdzie 2 jest default_padding w części GUI UX "mojego programu", czy w końcu mamy sens" 2 " w jego właściwym kontekście. Tutaj "2" jest liczbą "magiczną", która jest uwzględniana jako stała symboliczna default_padding w kontekście interfejsu GUI UX" mój program " w celu uczynienia jej szybko zrozumiałą w szerszym kontekście kodu.

Zatem każda wartość podstawowa, której znaczenie (semantyczne i celowe) nie może być wystarczająco i szybko zrozumiałe jest dobrym kandydatem na stałą symboliczną w miejscu wartości podstawowej (np. liczby magicznej).

Idąc Dalej

Liczby w skali również mogą mieć semantykę. Na przykład udawaj, że tworzymy grę D&D, w której mamy pojęcie potwora. Nasz obiekt potwora ma funkcję o nazwie life_force, która jest liczbą całkowitą. Liczby mają znaczenia, które nie są poznawalne lub jasne bez słów dostarczających znaczenia. Zaczynamy więc od arbitralnie powiedzenie:

  • full_life_force: INTEGER = 10 -- very alive (and unharted)
  • minimum_life_force: INTEGER = 1 -- ledwo żywy (bardzo zraniony)
  • dead: INTEGER = 0 -- Dead
  • undead: INTEGER = -1 -- Min undead (almost dead)
  • Zombie: liczba całkowita = -10 -- Max undead (very undead)
[13]} z powyższych symbolicznych stałych zaczynamy uzyskiwać mentalny obraz żywości, martwości i "nieumarłości" (oraz możliwych konsekwencji i konsekwencji) dla nasze potwory w naszej grze D&D. Bez tych słów (stałych symbolicznych) pozostaje nam tylko Liczba z zakresu -10 .. 10. Tylko zakres bez słów pozostawia nas w miejscu prawdopodobnie wielkiego zamieszania i potencjalnie z błędami w naszej grze, jeśli różne części gry mają zależności od tego, co ten zakres liczb oznacza dla różnych operacji, takich jak attack_elves lub seek_magic_healing_potion.

Dlatego szukając i rozważając zastąpienie "liczb magicznych" chcemy zapytać bardzo szczegółowe pytania dotyczące liczb w kontekście naszego oprogramowania, a nawet tego, jak liczby oddziałują ze sobą semantycznie.

Podsumowanie

Przyjrzyjmy się jakie pytania powinniśmy zadać:

Możesz mieć magiczną liczbę, jeśli ...

  1. czy podstawowa wartość może mieć specjalne znaczenie lub cel w Twoim wszechświecie oprogramowania?
  2. Czy szczególne znaczenie lub cel może być Nieznany, niepoznawalny, niejasny lub mylący, nawet w jego właściwym kontekst?
  3. czy właściwa wartość podstawowa może być niewłaściwie użyta ze złymi konsekwencjami w niewłaściwym kontekście?
  4. czy Niewłaściwa wartość podstawowa może być właściwie użyta ze złymi konsekwencjami we właściwym kontekście?
  5. czy wartość podstawowa ma związek semantyczny lub celowy z innymi wartościami podstawowymi w określonych kontekstach?
  6. czy podstawowa wartość może istnieć w więcej niż jednym miejscu w naszym kodzie z różnymi semantykami w każdym, co powoduje, że nasz czytelnik zamieszanie?

Zbadaj autonomiczne stałe podstawowe w tekście kodu. Zadawaj każde pytanie powoli i rozważnie o każdym przypadku o takiej wartości. Rozważ siłę swojej odpowiedzi. Wiele razy odpowiedź nie jest czarno-biała, ale ma odcienie niezrozumianego znaczenia i celu, szybkość uczenia się i szybkość rozumienia. Istnieje również potrzeba, aby zobaczyć, jak łączy się z maszyną programową wokół niego.

W końcu odpowiedź na zastąpienie jest odpowiadaj na miarę (w twoim umyśle) siły lub słabości czytelnika, aby nawiązać połączenie (np. "zdobądź to"). Im szybciej zrozumieją znaczenie i cel, tym mniej masz "magii".

Wniosek: Zastąp podstawowe wartości stałymi symbolicznymi tylko wtedy, gdy magia jest wystarczająco duża, aby spowodować trudne do wykrycia błędy wynikające z zamieszania.

 25
Author: Larry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-25 13:59:17

Liczba magiczna jest sekwencją znaków na początku formatu pliku lub wymiany protokołu. Ten numer służy jako sprawdzenie zdrowia psychicznego.

Przykład: Otwórz dowolny plik GIF, zobaczysz na samym początku: GIF89. "GIF89" to magiczna liczba.

Inne programy potrafią odczytać kilka pierwszych znaków pliku i prawidłowo zidentyfikować gify.

Niebezpieczeństwo polega na tym, że losowe DANE binarne mogą zawierać te same znaki. Ale jest to bardzo mało prawdopodobne.

Co do protokołu exchange, możesz go użyć, aby szybko zidentyfikować, że bieżąca "wiadomość" przekazywana do ciebie jest uszkodzona lub nieprawidłowa.

Magiczne liczby są nadal przydatne.

 17
Author: Brian R. Bondy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-06 22:27:11

W programowaniu "liczba magiczna" jest wartością, która powinna mieć nazwę symboliczną, ale zamiast tego została wrzucona do kodu jako literalna, zwykle w więcej niż jednym miejscu.

Jest źle z tego samego powodu SPOT (Single Point of Truth) jest dobry: jeśli chcesz później zmienić tę stałą, musisz przeszukać swój kod, aby znaleźć każdą instancję. Jest też źle, ponieważ może nie być jasne dla innych programistów, co oznacza ta liczba, stąd "Magia".

Ludzie czasami eliminacja liczby magicznej jest kontynuowana, przenosząc te stałe do osobnych plików, aby działać jako Konfiguracja. Czasami jest to pomocne, ale może również tworzyć więcej złożoności niż jest to warte.

 13
Author: Nick Retallack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 06:30:14

Problem, o którym nie wspomniano przy użyciu magicznych liczb...

Jeśli masz ich bardzo dużo, szanse są dość duże, że masz dwa różne cele , do których używasz magicznych liczb, gdzie wartości są takie same.

A następnie, oczywiście, musisz zmienić wartość... tylko w jednym celu.

 11
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-13 00:12:27

Magiczna liczba może być również liczbą ze specjalną, twardą semantyką. Na przykład, kiedyś widziałem system, w którym identyfikatory rekordów > 0 były traktowane normalnie, 0 samo było "nowym rekordem", -1 było "to jest root", a -99 było "to zostało utworzone w roocie". 0 i -99 spowodowałyby, że WebService dostarczy nowy identyfikator.

Złe w tym jest to, że używasz ponownie spacji (podpisanych liczb całkowitych dla identyfikatorów rekordów) dla specjalnych umiejętności. Może nigdy nie będziesz chciał utworzyć rekordu o ID 0 lub z negatywny identyfikator, ale nawet jeśli nie, każda osoba, która spojrzy albo na kod, albo na bazę danych, może natknąć się na to i na początku być zdezorientowana. Nie trzeba dodawać, że te szczególne wartości nie były dobrze udokumentowane.

, 22, 7, -12 i 620 również liczą się jako liczby magiczne. ;-)

 10
Author: Sören Kuklau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 07:23:23

Zakładam, że jest to odpowiedź na Moje ODPOWIEDŹ na twoje wcześniejsze pytanie. W programowaniu liczba magiczna jest osadzoną stałą liczbową, która pojawia się bez wyjaśnienia. Jeśli pojawia się w dwóch różnych miejscach, może prowadzić do okoliczności, w których jedna instancja zostanie zmieniona, a nie inna. Z obu tych powodów ważne jest, aby wyizolować i zdefiniować stałe liczbowe poza miejscami, w których są używane.

 4
Author: Kyle Cronin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:13

Zawsze używałem terminu "magiczna liczba" inaczej, jako niejasnej wartości przechowywanej w strukturze danych, które można zweryfikować jako szybkie sprawdzenie ważności. Na przykład pliki gzip zawierają 0x1f8b08 jako pierwsze trzy bajty, pliki klas Java zaczynają się od 0xcafebabe, itd.

Często widzisz magiczne liczby osadzone w formatach plików, Ponieważ pliki mogą być wysyłane raczej rozwiązująco i tracą wszelkie metadane o tym, jak zostały utworzone. Jednak magiczne liczby są również czasami używane do struktury danych w pamięci, takie jak wywołania ioctl ().

Szybkie sprawdzenie magicznej liczby przed przetworzeniem pliku lub struktury danych pozwala na wczesne zasygnalizowanie błędów, a nie schlep całą drogę przez potencjalnie długie przetwarzanie w celu ogłoszenia, że wejście było kompletne balderdash.

 3
Author: DGentry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 02:46:27

Warto zauważyć, że czasami chcesz nie konfigurowalne "hard-coded" numery w kodzie. Istnieje wiele znanych , w tym 0x5F3759DF, który jest używany w zoptymalizowanym algorytmie odwrotnego pierwiastka kwadratowego.

W rzadkich przypadkach, gdy znajduję potrzebę użycia takich magicznych liczb, ustawiam je jako const w moim kodzie i dokumentuję, dlaczego są używane, jak działają i skąd pochodzą.

 2
Author: Rob Rolnick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-06 22:59:22

A co z inicjalizacją zmiennej u góry klasy z wartością domyślną? Na przykład:

public class SomeClass {
    private int maxRows = 15000;
    ...
    // Inside another method
    for (int i = 0; i < maxRows; i++) {
        // Do something
    }

    public void setMaxRows(int maxRows) {
        this.maxRows = maxRows;
    }

    public int getMaxRows() {
        return this.maxRows;
    }

W tym przypadku 15000 jest liczbą magiczną(według CheckStyles). Dla mnie ustawienie wartości domyślnej jest w porządku. Nie chce mi sie robic:

private static final int DEFAULT_MAX_ROWS = 15000;
private int maxRows = DEFAULT_MAX_ROWS;
Czy to utrudnia czytanie? Nigdy tego nie rozważałem, dopóki nie zainstalowałem CheckStyles.
 2
Author: Ascalonian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-12 13:34:13

@eed3si9n: sugerowałbym nawet, że ' 1 ' to magiczna liczba. :-)

Zasada związana z liczbami magicznymi jest taka, że każdy fakt, z którym ma do czynienia Twój kod, powinien być zadeklarowany dokładnie raz. Jeśli używasz magicznych liczb w swoim kodzie (takich jak przykład długości hasła, który podał @marcio, możesz łatwo zakończyć duplikację tego faktu, a gdy twoje zrozumienie tego faktu ulegnie zmianie, masz problem z konserwacją.

 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-06 23:07:04

A co ze zmiennymi zwrotnymi?

Szczególnie uważam, że jest to trudne podczas implementacji procedur składowanych .

Wyobraź sobie następną procedurę składowaną (błędna składnia, wiem, żeby pokazać przykład):

int procGetIdCompanyByName(string companyName);

Zwraca identyfikator firmy, jeśli istnieje w określonej tabeli. W przeciwnym razie zwraca -1. W jakiś sposób to magiczna liczba. Niektóre z rekomendacji, które do tej pory przeczytałem, mówią, że naprawdę będę musiał zrobić coś takiego:

int procGetIdCompanyByName(string companyName, bool existsCompany);

Przy okazji, co należy zwrócić, jeśli firma nie istnieje? Ok: ustawi existesCompany jako false , ale zwróci również -1.

Opcja Antohera polega na wykonaniu dwóch oddzielnych funkcji:

bool procCompanyExists(string companyName);
int procGetIdCompanyByName(string companyName);
Zatem warunkiem wstępnym dla drugiej procedury składowanej jest istnienie firmy.

Ale obawiam się współbieżności, ponieważ w tym systemie firma może zostać utworzona przez innego użytkownika.

Reasumując: co sądzisz o używaniu tego rodzaju " magii liczby", które są stosunkowo znane i bezpieczne, aby powiedzieć, że coś jest nieudane lub że coś nie istnieje?

 0
Author: Oskytar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-18 22:15:34

Kolejna zaleta wyodrębnienia liczby magicznej jako stałej daje możliwość jasnego udokumentowania informacji biznesowych.

public class Foo {
    /** 
     * Max age in year to get child rate for airline tickets
     * 
     * The value of the constant is {@value}
     */
    public static final int MAX_AGE_FOR_CHILD_RATE = 2;

    public void computeRate() {
         if (person.getAge() < MAX_AGE_FOR_CHILD_RATE) {
               applyChildRate();
         }
    }
}
 0
Author: jguiraud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-09 21:38:37