2013-08-12 9 views
32

Biorąc pod uwagę ten sposób, czy to przedstawiają niektóre skandaliczne stylistyczne lub semantyczne faux pas:W odniesieniu do sprawozdania przełącznika Java - używając zwrotu i pomijając przerwy w każdym przypadku

private double translateSlider(int sliderVal) { 
    switch (sliderVal) { 
     case 0: 
      return 1.0; 
     case 1: 
      return .9; 
     case 2: 
      return .8; 
     case 3: 
      return .7; 
     case 4: 
      return .6; 
     default: 
      return 1.0; 
    } 
} 

To nie jest wyraźnie zgodne z tutoriali Java here.

Jednak to jasne, zwięzłe i jak dotąd wydało dokładnie to, czego potrzebuję. Czy istnieje przekonujący, pragmatyczny powód, aby utworzyć zmienną lokalną, przypisać jej wartość w każdym przypadku, dodać przerwę do każdego przypadku i zwrócić wartość na końcu metody?

+2

To wygląda dobrze do mnie. Instrukcja switch jest jedyną zawartością tej metody i jest czytelna i czytelna, więc ma to sens. – Michelle

Odpowiedz

43

Przypisanie wartości zmiennej lokalnej, a następnie zwrócenie jej na końcu jest uważane za dobrą praktykę. Metody posiadające multiple exits are harder to debug i mogą być trudne do odczytania.

To powiedziawszy, to jedyny plus do tego paradygmatu. Powstał wtedy, gdy w pobliżu znajdowały się tylko niskie języki proceduralne. I wtedy miało to więcej sensu.

Podczas gdy jesteśmy na temat, musisz check this out. To ciekawa lektura.

+0

Zaakceptowany, aby zapewnić jak najwięcej/najlepsze referencje. Dzięki! – NickAbbey

+6

Łączy wpis SO i mówi, że wiele wyjść jest zła. Najwyżej głosowana odpowiedź na to pytanie zaczyna się od "w dużej mierze sprowadza się do osobistych preferencji", a kończy się na "egzekwowaniu pojedynczego punktu wyjścia jest bezprzedmiotowym lub wręcz przeciwnego do zamierzonego ograniczeniem IMHO". -_- * długie westchnienie * –

+0

@MillieSmith Ani jedna rzecz ani żadna inna rzecz nie jest wymieniona w żadnej z głosujących odpowiedzi. Przegapiłem coś? – Ungeheuer

1

Jest to całkowicie w porządku, jeśli nie masz kodu podążającego za blokiem przełącznika w metodzie.

Ale jako ogólna dobra praktyka programistyczna powinieneś unikać zbyt wielu instrukcji zwrotnych, ponieważ zmniejsza to czytelność twojego kodu.

0

Nie, to, co masz, jest w porządku. Możesz również zrobić to jako formułę (sliderVal < 5 ? (1.0 - 0.1 * sliderVal) : 1.0) lub użyć Map<Integer,Double>, ale to, co masz, jest w porządku.

+3

Nie da to tej samej wartości zwracanej, co w przypadku kodu OP. '0.1' nie ma dokładnej reprezentacji binarnej, a pomnożenie jej przez' sliderVal' powoduje kompilację błędu precyzji. –

+0

@RohitJain W ogólnym przypadku na pewno; ale w tym przypadku otrzymasz te same wartości dla '0 <= i <= 10': http://ideone.com/3F9y8K. Jeśli OP będzie pracował z debelami, to istnieje duża szansa, że ​​pojawią się inne błędy zaokrąglania, z którymi należy sobie poradzić, ponieważ są one parami dla kursu. – yshavit

+0

the? Operator jest zniechęcony: Twoje propsoded rozwiązanie rozwiązuje wiele warunek powrotu, ale uruchamia? Ostrzeżenie operatora – AlexWien

0

Sugeruję, aby nie używać literałów.

Poza tym sam styl wygląda dobrze.

+0

Gdzie to porównanie? Przełącznik znajduje się na int. – yshavit

+0

W moim własnym oszołomionym umyśle :) źle odczytano, uważałem, że podwójny zwrot był stwierdzeniem "case". –

0

Jeśli masz metodę, która po prostu uruchamia przełącznik, a następnie zwraca pewną wartość, to w ten sposób działa. Ale jeśli chcesz przełączać się z innymi elementami w metodzie, nie możesz użyć return, a reszta kodu wewnątrz metody nie zostanie wykonana. Zauważ w samouczku, jak ma wydruk po kodzie? Twój nie mógłby tego zrobić.

0

Dlaczego po prostu nie

private double translateSlider(int sliderval) { 
if(sliderval > 4 || sliderval < 0) 
    return 1.0d; 
return (1.0d - ((double)sliderval/10.0d)); 
} 

lub podobne?

+1

To nie jest tak "szybkie" obliczeniowo jak twoje rozwiązanie, więc jeśli chcesz oszczędzać cykle, operacje zmiennoprzecinkowe mogą nie być tak dobrym wyborem - lub jeśli szukasz więcej "konfiguracji" (czyli matematyka nie zawsze będzie działać tak dobrze). – SubSevn

+0

Z odpowiednimi kontrolami kursu ... dodane. – SubSevn

+0

@SubSeven nigdy nie trzeba oszczędzać cykli, gdy użytkownik przesuwa suwak wolnymi palcami. nawet najwolniejsze urządzenie wbudowane przewyższa znacznie swój palec. czytelność i przejrzystość kodu to maksymalny czas. – AlexWien

0

Tak, to dobrze. Samouczki nie zawsze są dokładne i zadbane. Co więcej, tworzenie zmiennych lokalnych to marnowanie miejsca i nieefektywne przetwarzanie

+0

Powinieneś się skoncentrować, żeby nie marnować sobie mózgu, nie przejmować się lokalną zmienną, sprawić, by kod był odczytywany, a nie o twardym kodowaniu. – AlexWien

+3

IDK, gdzie nauczyłeś się takich hakerów, ale lokalne pliki varables są zawsze usuwane przez Garbage Collector i pozostają tylko w kontekście metody, jak się ją nazywa, nigdy nieefektywnej ani "marnującej się przestrzeni". –

6

Z ludzkiego punktu widzenia twój kod jest w porządku. Z widoku narzędzi analizy statycznego kodu istnieje wiele zwrotów, co utrudnia debugowanie. np. nie można ustawić jednego i jedynego punktu przerwania nieudanego przed powrotem.

Co więcej, nie trudno zakodować 4 etapów suwaka w profesjonalnej aplikacji. Albo obliczyć wartości za pomocą max - min, etc., lub wyszukać je w tablicy:

public static final double[] SLIDER_VALS = {1.0, 0.9, 0.8, 0.7, 0.6}; 
public static final double SLIDER_DEFAULT = 1.0; 


private double translateSlider(int sliderval) { 
    double ret = SLIDER_DEFAULT; 
    if(sliderval >= 0 && sliderval < SLIDER_VALS.length) { 
     ret = SLIDER_VALS[sliderval]; 
    } 
    return ret; 
} 
0

myślę, że to, co masz napisane jest w porządku. Nie widzę też problemu z czytelnością z wieloma zwrotami. Zawsze wolałbym powrócić z punktu w kodzie, gdy wiem, że wróci, a to pozwoli uniknąć logiki poniżej zwrotu. Jednak może istnieć argument dotyczący pojedynczego punktu powrotu do debugowania, a także ewentualnego rejestrowania. Ale w twoim kodzie nie ma problemu z debugowaniem i rejestrowaniem, jeśli go używamy. jest bardzo prosty i czytelny tak, jak napisałeś.

1

najlepszym przypadku dla ludzkiej logiki generowany komputerowo kodu bajtowego byłoby wykorzystać kod jak poniżej:

private double translateSlider(int sliderVal) { 
    float retval = 1.0; 

    switch (sliderVal) { 
    case 1: retval = 0.9; 
    case 2: retval = 0.8; 
    case 3: retval = 0.7; 
    case 4: retval = 0.6; 
    case 0: 
    default: break; 
    } 
    return retval; 
} 

Zatem elminating multible wyjścia z wykorzystaniem metody i język logicznie. (np. gdy sliderVal jest zakresem interweniującym 1-4 zmiany wartości zmiennoprzecinkowej, jeśli wartość sliderVal wynosi 0, a wszystkie inne wartości, retval pozostaje ta sama wartość zmienna równą 1,0)

Jednak coś takiego z każdą wartością całkowitą sliderVal będącą (n-(n/10)) jeden naprawdę można po prostu zrobić lambda i uzyskać szybsze rezultaty:

private double translateSlider = (int sliderVal) -> (1.0-(sliderVal/10)); 

Edit: moduł 4 mogą być w celu utrzymania logiki (tj (n-(n/10))%4))

Powiązane problemy