W jaki logiczny sposób można skrócić tę funkcję? |
W jaki logiczny sposób można skrócić tę funkcję? |
24.03.2013, 15:56:36
Post
#1
|
|
Grupa: Zarejestrowani Postów: 240 Pomógł: 2 Dołączył: 5.12.2010 Skąd: Fulda Ostrzeżenie: (0%) |
Witam, piszę dla szkoły pewną stronę, skupiłem się narazie na działaniu, działa wszystko ładnie pięknie, ale mam mały problem z logiką kodu, wszystkie funkcje składają się z ifów, moje kolejne funkcje posiadają już przeszło 40 ifów i wszytsko działa, ale czy ktoś wie jak to można skrócić w logiczny sposób?
I aby tak samo działało.
-------------------- Moje serwisy: services.itunix.eu | spytajsie.com
Server: Debian; Desktop: Mac Mini 10.8.1, ArchLinux XFCE |
|
|
24.03.2013, 16:00:30
Post
#2
|
|
Grupa: Zarejestrowani Postów: 651 Pomógł: 116 Dołączył: 3.06.2012 Skąd: Lędziny Ostrzeżenie: (0%) |
Do czego Ci to ma służyć?
I nie używaj AND tylko &&, tak samo nie OR tylko || Ten post edytował Michael2318 24.03.2013, 16:02:39 |
|
|
24.03.2013, 16:06:19
Post
#3
|
|
Grupa: Zarejestrowani Postów: 240 Pomógł: 2 Dołączył: 5.12.2010 Skąd: Fulda Ostrzeżenie: (0%) |
Do czego Ci to ma służyć?
Do czego Ci to ma służyć? I nie używaj AND tylko &&, tak samo nie OR tylko || A masz może jakiś pomysł jak zmienić logikę funkcji, aby nie było tysiące ifów? Ten post edytował Saki 24.03.2013, 16:04:19 -------------------- Moje serwisy: services.itunix.eu | spytajsie.com
Server: Debian; Desktop: Mac Mini 10.8.1, ArchLinux XFCE |
|
|
25.03.2013, 20:12:21
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
Cytat A masz może jakiś pomysł jak zmienić logikę funkcji, aby nie było tysiące ifów? Logika dla każdej kombinacji unikalna? Użyć konstrukcji switch, wykona się blok zależny od wysłanych zmiennych a jeśli nie to default. |
|
|
25.03.2013, 22:45:08
Post
#5
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
Pytanie... Po kiego grzyba Ci tyle IFów, które w zależności od danych mogą prowadzić do nieoczekiwanych wyników? Zwróć uwagę na zależności! Mając określone dane możesz wyliczyć tylko określone inne. Sprowadź więc całość do pewnych zależności, sprawdzając co występuje a co nie i zagnieżdżając owe IFy zamiast wypuszczać obok siebie. Zauważ, że Twój kod wielokrotnie liczy to samo, a na dodatek nie sprawdzasz co się dzieje gdy ktoś wprowadzi dane w celu wywalenia całości Jak? Załóżmy, że ktoś poda $u, $i, $g, to $r będzie kilka razy obliczane (linie 3, 15, 24, 31). A co gdy poda wszystkie 4? Zacznij od najmniej zależnych, czyli $g oraz $r.
Czemu tak? Zaczniemy od sprawdzenia czy $g albo $r były podane. Liczenie ma sens w przypadku gdy tylko jedna z nich istnieje. Jeśli są obie lub brak obu - jest to bezcelowe A co gdy ktoś poda obie z powietrza? Przykładowo $r = 10, $g = 50... Skrypt powinien od razu zaprotestować. Na tym etapie może się też okazać, że wciąż nie mamy potrzebnego nam do dalszych obliczeń $r. Może tak być w sytuacji, gdy nie ma ani $r, ani $g potrzebnego do prostego jego wyliczenia. Teraz "trójkącik" Klasyczny $i = $u * $r, gdzie jedna jest zależna od dwóch pozostałych. Tu można prościutko polecieć zagnieżdżeniem. Sprawdzamy która z trzech wartości występuje i jeśli któraś jest, sprawdzamy czy są pozostałe. Jeśli jakiejś brak - obliczamy brakującą. Na końcu może się okazać, że skończyliśmy tylko z $u, $i, $r dla wariantu gdy podano do funkcji $u oraz $i, więc w tym wypadku trzeba obliczyć brakujące $g; I to by było prawie tyle... Ale gdyby ktoś podał tylko jeden parametr do funkcji? Zadanie byłoby niepoliczalne, gdyż za mało danych do policzenia wszystkich. Stąd ostatnie sprawdzenie czy wszystkie dane są niezerowe, które może rzucić wyjątek. Wydaje się o wiele dłuższe? Pozornie. Ty masz zachodzące po kolei 9 ifów, które zawsze się wykonają, niezależnie co byś nie robił. Jak zwróciłem uwagę, niektóre wielokrotnie mogą liczyć to samo. Ja sprawdzam, które obliczenia są faktycznie niezbędne i tylko je wykonuję. Ograniczam się jedynie do niezbędnych, czyli brakujących obliczeń. Co istotne... Nie poprawiam błędów użytkownika. Jeśli wpisze głupoty w stylu: $i = 5, $u = 10, $r = 300, to Twój kod poleci i wypluje dane pozornie prawidłowe... Wiesz dlaczego? Właśnie dlatego, że się nadpisują. Ty tego nie rozumiesz, ale kod skopiowałeś skądś, gdzie taka kolejność została celowo zastosowana. Dane błędne są bowiem nadpisywane prawidłowymi. Problem z tym, że jest to bez Twojej wiedzy i nie masz kontroli nad tym, co ciąg obliczeń uzna za dane prawidłowe. Zależy to bowiem od tego, który IF wykona się pierwszy i nadpisze jaką wartość. Ja w takiej sytuacji sprawdzam, czy ewentualna wyliczona jest zgodna z podaną w parametrze. Jeśli coś jest nie tak - rzucam wyjątek zamiast liczyć głupoty. I pamiętaj, że PHP zaokrągla! Do tego więc co mam najlepiej podejść z uwzględnieniem tego. Poczytaj o błędach zaokrągleń i jak ich uniknąć Kod myślę, że kumaci zrozumieją i nieco poprawią by działał mimo owych problemów
Powód edycji: [thek]: Kilka uwag...
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
26.03.2013, 10:09:35
Post
#6
|
|
Grupa: Zarejestrowani Postów: 64 Pomógł: 6 Dołączył: 20.03.2011 Skąd: Świdnica Ostrzeżenie: (0%) |
Odpal sobie to i testuj. Może ułatwi Ci to pracę z kodem. Ilość IF'ów minimalnie zmniejszyłem ;-). Sprawa jest o tyle ciężka, że tutaj mamy przekazane parametry, które mogą, ale nie muszą być zmieniane w trakcie wykonania funkcji dlatego do funkcji getI, getU itd. trzeba przekazać wszystkie parametry. Jest na to sposób - zastosować klasę i zmienne klasy. Powodzenia.
Ten post edytował LSM 26.03.2013, 10:16:12 -------------------- "I see" - said the blind man.
|
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 20:32 |