Wątek przeniesiony 2015-03-04 21:37 z C# i .NET przez somekind.

Długi kod z ifami - wyświetlenie komunikatu, jeśli żadna z kombinacji nie jest spełniona

0

Witam!
Napisałem program, konwerter jednostek. Z ogromną ilością ifów. Jest że

If (comboBox1.Text == "Metry" && comboBox2.Text == "Centymetry")

Na takich kobinacjach opiera się cały program. Jest tego ponad 700 linijek.

Jak zrobić aby jeżeli żadna z wielu kombinacji w ifie nie jest spełniona to wyświetla massageboxa ??

Z góry dzięki za pomoc!

dodanie znacznika <code class="csharp"> - @furious programming

0

Na takich kobinacjach opiera się cały program. Jest tego ponad 700 linijek.

WTF?

0

Lepiej pokaż całość.

0

Proponuję stworzyć sobie klasę Distance, która w konstruktorze przyjmie wartość double oraz enum (METER, KILOMETER...). W konstruktorze przeliczaj sobie np. na jednostkę układu SI czyli metry(wywołaj jakąś metodę ze switchem) oraz przypisz tą wartość do pola measure w klasie. Pole measure udostępniaj getterem

7

Za wklejenie kodu jako PDFa na Dropboxie powinno to od razu trafić do Perełek... Do tego służy Pastebin: Pastebin

  1. goto to zło. Zapamiętaj sobie raz na zawsze i nie używaj przez pierwsze 3 lata nauki programowania.
  2. jakbyś pozbył się wszystkich goto i else, to aplikacja działałaby tak samo, za to kod byłby 2 razy krótszy.
  3. jednostki miar to powinien być jakiś enum.
  4. gdybyś pisał tak MessageBox.Show(string.Format("Twój wynik to: {0} centymetrów", wynikDouble));, to nie musiałbyś wcześniej robić zbędnej konwersji z wynikDouble na wynikString.
  5. gdybyś przeliczniki między parą jednostek trzymał w jakimś słowniku, to w całym programie miałbyś JEDNO mnożenie, a długość kodu to byłoby 20 linijek + liczba par jednostek.
2

Mamy enum miar.
Tworzysz mapę w postaci:

var mapplings = new Dictionary<Tuple<Distance, Distance>, double>();
mappings.Add(Tuple.Create(Distance.METR,Distance.KILOMETR), 1000.);
/// i tak dalej

Następnie wystarczy zmapować to co masz w listach w UI na odpowiednie wartości z enuma (pewno się da to zrobić za pomocą getValue czy czegoś takiego) i utworzyć Tuple, który będzie kluczem w mapie. Mapa zawiera mnożniki jakie służą do przeliczania dystansów na zasadzie pierwszy z tupla na drugi z tupla.

3

Ja bym użył jednego odnośnika dla wszystkich jednostek - np. milimetry (lub metry - jak wolisz). Mnożniki te trzymałbym w słowniku gdzie nazwa (lub enum) byłaby kluczem, a wielkość w milimetrach wartością. W ten sposób pozbywasz się wszystkich tych ifów. Samo przeliczenie:

milimeters[sourceUnit] * value / milimeters[destUnit]

dodanie znacznika <code class="csharp"> - @furious programming

5

Przekombinowywacie, kolego @Koziołek. Wasze podejście wymaga układania w głowie tabelki dla wszystkich jednostek, co jest błędotwórcze :-)

Każdą jednostkę (w obrębie danej wielkości fizycznej) można przeliczyć na jednostkę podstawową (bez przedrostka) według układu SI.

i tak metr to jest 1, kilometr to 1000, cal to 0,0254, a centymetr – 0,01.
Mając dwa mnożniki (np. dla kilometra i dla centymetra) dzielimy jeden przez drugi i mamy stosunek jednej jednostki do drugiej.

0

@Azarien to jest tylko uproszczony opis. W Świecie Javy mamy na to specyfikację ;) https://github.com/unitsofmeasurement/

Z drugiej strony przedrostki działają tylko w ramach systemu metrycznego. Przeliczenia jard-cal-mila są już znacznie bardziej porąbane.

0

Jestem, strasznie początkujący i nie czaję o czym wy w ogóle piszecie. Ale chyba i tak wykombinowałem już jak to zrobić za pomocą jednego "goto" (tak wiem, to zło :) ). Zobaczymy czy mi się uda. Jak coś by było nie tak , to będę kombinował :D

0

Kto cię uczył używania goto? Ja na jednym z pierwszych swoich zajęć dostałem zakaz używania tej instrukcji, bez zbędnych wyjaśnień.

4

potrzebujesz słownik Dictionary<string, double>. W tym słowniku trzymasz jaką przelicznik danej jednostki na metry. Słownik wczytujesz z jakiegoś pliku konfiguracyjnego.
Dzięki temu zamiast pisać 100 if-ów, będziesz miał co takiego:

wynikDouble = liczbaDouble/slownik[comboBox1.text]*slownik[comboBox2.text];
MessageBox.Show(String.Format("Twój wynik to: {0} {1}",  wynikDouble, comboBox2.text);

1 użytkowników online, w tym zalogowanych: 0, gości: 1