Skrev tenta i grundläggande Java, kritik någon?

Permalänk
Medlem

Skrev tenta i grundläggande Java, kritik någon?

Tjenare, imorse skrev jag en tenta i grundläggande Java på distans. Programmeringsuppgiften var följande och man fick 6h på att skicka in en lösning.

Citat:

Du ska skriva ett program som hjälper till med att träna multiplikationstabellen,
1:ans tabell till och med 12:ans tabell.
Tanken är att man ska kunna välja en multiplikationstabell att öva på.
Programmet slumpar fram ett tal (t.ex. 7x9) och användaren skriver in svaret och
får även veta om man svarat rätt eller fel.
Användaren ska fortsätta besvara tal tills man svarat rätt på alla tal i
multiplikationstabellen exakt 3 gånger. Alltså måste programmet kunna hålla reda
på hur många gånger ett visst tal besvarats korrekt. Har ett tal besvarats rätt tre
gånger ska detta tal inte kunna slumpas fram igen under pågående övning.
När man är klar med en multiplikationstabell så ska man få statistik på hur många
gånger man svarat fel på ett visst tal.
Tänkt scenario:
1. Användaren väljer 7:ans multiplikationstabell
2. Programmet slumpar fram 4x7
3. Användaren svarar rätt vilket innebär att 4x7 ska slumpas fram två gånger
till innan användaren är klar med tabellen
4. Programmet slumpar fram 9x7
5. Användaren svarar fel vilket innebär att 9x7 ska slumpas fram tre gånger
till innan användaren är klar med tabellen
6. När användaren svarat rätt tre gånger vardera på talen 1x7, 2x7, 3x7, 4x7,
5x7, 6x7, 7x7, 8x7, 9x7, 10x7, 11x7 och 12x7 eller om användaren
matar in en nolla (0) så är användaren klar med tabellen och kan välja att
öva på en ny tabell eller att avsluta programmet.
Använd metoder för att lösa uppgiften, i övrigt ska följande regler respekteras:
- Beskriv i klassbeskrivningen hur du tolkat uppgiften och eventuella
förenklingar/förändringar du gör i uppgiften.
- Metodbeskrivningar och kommentarer vid kluriga delar i koden är
mycket viktigt. Tänk också på att ha beskrivande namngivning på klasser,
metoder och variabler.
- Tentamen är individuell och även om du får ta hjälp av Internet för att
hämta idéer till möjliga lösningar så är det du som ska lösa uppgiften på
egen hand. Ange alltid källa om du hittar något på Internet som du
använder dig av.
- Inga globala variabler (variabler utanför metoderna) ska användas om
detta inte är väl motiverat och korrekt utfört (motiverar gör du i
kommentarer)

Så här blev min lösning

import java.util.Random; import javax.swing.*; public class Multiplikationstabell { // Av ******* (*****@student.gu.se) // Hur många gånger man får svara på samma fråga. Jag deklarerar konstanten // här så är den lätt att hitta static final int numberOfQuerys = 3; public static void main(String[] args) { // Jag brukar alltid samla alla meddelanden till användaren på ett // ställe så man lätt kan hitta dem String menuQuestion = "Vilken tabell vill du träna på?", menuHeader = "Multiplikationstabell", queryQuestion = "Hur mycket är ", badFormat = "Felaktigt format", messageQuestionsLeft = " frågor kvar att svara rätt på.", statisticHeader = "Statistik över dina svar", messageRight = "Rätt!", messageWrong = "Fel!", statisticTableHeader = "Fråga \t Antal felsvar"; // Lagrar vilken tabell man valt att träna på int tableToTrainOn; // statisticArray[] är en tabell över hur många gånger man besvarat en // fråga fel int[] statisticArray; while (true) { // Låter användaren välja tabell tableToTrainOn = askWhichTable(menuQuestion, menuHeader); // Låter användaren göra provet och sparar felstatistiken i en array statisticArray = Query(tableToTrainOn, queryQuestion, messageQuestionsLeft, badFormat, messageRight, messageWrong); // Visar felstatistiken showStatistics(statisticArray, statisticHeader, statisticTableHeader, tableToTrainOn); } } private static int[] Query(int tableToTrainOn, String question, String header, String badAnswer, String messageRight, String messageWrong) { // answerStatistics är en tabell över hur många gånger man besvarat // en fråga fel int[] answerStatistics = new int[11]; Random r = new Random(); /* * Jag antar att multiplikationstabellen går upp till 10*talet , även om * man i det här fallet kunde tänka sig att det går upp till 12*12. När * alreadyAnsweredCorrectly[int]=numberOfQuerys har man klarat tabellen * för int. */ int[] alreadyAnsweredCorrectly = new int[11]; int answer;// Användarinmatning int factor; // Totalt måste man svara rätt numberOfQuerys*10 gånger innan metoden // avbryts int correctAnswersLeftBeforeExit = numberOfQuerys * 10; // Denna sträng läggs till nästa fråga beroende på om man svarat rätt // eller fel String showRightOrWrong = ""; while (correctAnswersLeftBeforeExit > 1) { while (true) { factor = r.nextInt(10) + 1; if (alreadyAnsweredCorrectly[factor] < numberOfQuerys) { break; } } // Ställer en viss fråga till användaren med en viss rubrik och // lagrar svaret i en variabel answer = getAnswer(showRightOrWrong + question + " " + factor + " * " + tableToTrainOn + "?", correctAnswersLeftBeforeExit + header, badAnswer); if (answer == factor * tableToTrainOn) { // Användaren svarade rätt alreadyAnsweredCorrectly[factor]++; correctAnswersLeftBeforeExit--; // Nästa fråga ska börja med "Rätt!" showRightOrWrong = messageRight + "\n"; } else { // Användaren svarade fel answerStatistics[factor]++; // Nästa fråga ska börja med "Fel!" showRightOrWrong = messageWrong + "\n"; } } return answerStatistics; } private static int askWhichTable(String question, String header) { // Denna metod frågar vilken tabell man vill träna på // Skapar en meny med värden 1 till 12 Object[] menuTable = new Object[12]; for (int x = 1; x < 13; x++) { menuTable[x - 1] = x; } Object s = JOptionPane.showInputDialog(null, question, header, JOptionPane.QUESTION_MESSAGE, null, menuTable, null); if (s == null) { // Avslutar preogrammet om man klickar på Avbryt finish(); } return (Integer) s; } private static void finish() { // Metod för att avsluta programmet System.exit(0); } private static void showStatistics(int[] statisticArray, String header, String tableHeader, int tableToTrainOn) { // Visar statistik String output = tableHeader; for (int x = 1; x < 11; x++) { /* * Nedan försökte jag använda \t, men det fungerade inte hos mig * (Eclipse Indigo, Java 1.7, Lucid Lynx). JOptionPane skrev inte ut * det korrekt */ output = output + "\n" + x + " * " + tableToTrainOn + " " + statisticArray[x]; } JOptionPane.showMessageDialog(null, output, header, JOptionPane.INFORMATION_MESSAGE); } public static int getAnswer(String question, String header, String badFormat) { // Denna metod är samma som jag använde för att fråga efter klockslag i // inläningsuppgift 2, jag ändrade på den lite för att passa bättre i // detta sammanhang int i; while (true) { // Loopar tills tal matats in i rätt format. try { // Försöker läsa in ett svar String input = JOptionPane.showInputDialog(null, question, header, JOptionPane.QUESTION_MESSAGE); // Avslutar om användaren klickar på avbryt if (input == null) finish(); i = Integer.parseInt(input); // Hoppar ur loopen när ett tal i rätt format matats in. break; } catch (Throwable badInput) { // Ett värde i felaktigt format har matats in JOptionPane.showMessageDialog(null, badFormat); } } return i; } }

Tyckte att det gick bra med tanke på att jag alltid haft svårt att hantera tidspress. Men jag är som sagt nybörjare på Java, så jag undrar vad ni som är erfarna programmerare har för kritik? Har programmerat en del i BASIC tidigare och har svårt för det här med objektorinetering, dock ingår det inte i den här kursen.

Permalänk
Medlem

Eftersom det är grundkurs så hoppar jag över allt om OO och design etc.
Ser helt ok för å vara nybörjarkod men några saker.

  • Klassnamnet är på svenska, aj aj :s

  • Kommentarer på svenska, brukar vara bra å hålla sig till engelska, men det kan man ha överseende med här iof eftersom det är en tenta, vem vet, läraren kanske suger på engelska

  • Query metoden har börjar med bokstav, lite petigt men men

  • Skulle nog döpt om getAnswer till något annat, försöka endast använda metoder med get/setX för just getters och setters, ingen större grej men iaf.

  • Strängarna i början av main() bör du istället deklarera som konstanter eftersom de ändå inte ska ändras, blir snyggare så.

  • Main bör även inte gör annat än att "starta" själva programmet, även om du inte har så mkt kod där hade lösningen varit OO så hade detta varit mer självklart dock, så är väl ingen större grej nu

  • query-metoden är rätt stor, hade nog varit snyggare att dela upp den lite mer genom att göra mindre metoder, en för varje ändåmål typ lite "single responsibility" tänk.

Annars överlag helt oki, inget som direkt va jättekonstigt, vilket brukar förekomma hos nybörjare hade själv löst den på ett lite annorlunda sätt men men, har man mer erfarenhet så är det ju lättare att se andra lösningar hoppas det gick bra för dig!

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem
Skrivet av Gnejs:

* Klassnamnet är på svenska, aj aj :s

Kan ju faktiskt vara ett krav att det ska gå att köra applikationen genom ett gemensamt klassnamn.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
  • Vid en första titt känns det som om det är väl mycket kommentarer. En kommentar om varför du inte använde \t är bra. En kommentar som berättar vad catch (Throwable badInput) gör för något är dålig. Man ska kunna förutsätta att den som läser koden vet vad catch gör, så en extra kommentar förvirrar bara - tex är getAnswer dubbelt så lång mot vad det skulle vara utan kommentarer.

  • askWhichTable krashar programmet om man skriver in en bokstav.

  • Varför skickar du runt alla texterna? Det tillför ingenting i ditt fall, bara att du måste skicka in ett helt gäng argument till dina metoder. Du skulle lika gärna kunna flytta ut dom till samma ställe som numberOfQuerys finns.

  • När du bygger en sträng i en loop brukar det vara bäst o använda en StringBuilder istället för att bygga strängen med + eftersom kompilatorn inte själv kan optimera det till en stringbuilder och + är väldigt långsamt. (i just ditt fall spelar det iof inte jättestor roll, inte som att programmet går trögt ändå)

  • Alla dina textsträngar ligger på en ensam rad vilket gör dom väldigt jobbiga o läsa.

  • Verkar som om du försökt använda 80 tecken per rad. Personligen tycker jag att max 80 tecken är lite föråldrat nu för tiden, speciellt i Java som är ett så pratigt språk med pratiga konventioner.

Permalänk
Medlem
Skrivet av Gnejs:

Eftersom det är grundkurs så hoppar jag över allt om OO och design etc.
Ser helt ok för å vara nybörjarkod men några saker.

  • Klassnamnet är på svenska, aj aj :s

  • Kommentarer på svenska, brukar vara bra å hålla sig till engelska, men det kan man ha överseende med här iof eftersom det är en tenta, vem vet, läraren kanske suger på engelska

  • Query metoden har börjar med bokstav, lite petigt men men

  • Skulle nog döpt om getAnswer till något annat, försöka endast använda metoder med get/setX för just getters och setters, ingen större grej men iaf.

  • Strängarna i början av main() bör du istället deklarera som konstanter eftersom de ändå inte ska ändras, blir snyggare så.

  • Main bör även inte gör annat än att "starta" själva programmet, även om du inte har så mkt kod där hade lösningen varit OO så hade detta varit mer självklart dock, så är väl ingen större grej nu

  • query-metoden är rätt stor, hade nog varit snyggare att dela upp den lite mer genom att göra mindre metoder, en för varje ändåmål typ lite "single responsibility" tänk.

Annars överlag helt oki, inget som direkt va jättekonstigt, vilket brukar förekomma hos nybörjare hade själv löst den på ett lite annorlunda sätt men men, har man mer erfarenhet så är det ju lättare att se andra lösningar hoppas det gick bra för dig!

Haha, du hade inte gillat den kod jag och en kompis redovisade på KTH. Alla variablar, metoder och klasser etc hette typ Leffe, Uffe, Roffe eller dothatshit, dothething, kabaam etc haha. Fick godkänt ändå så klart för det var så jäkla snyggt gjort med någon egenkonstruerad lösning av partiella diffekvationer eller vad det nu var.

Sorry för OT men kände det passade här.

Permalänk
Medlem
Skrivet av Teknocide:

Kan ju faktiskt vara ett krav att det ska gå att köra applikationen genom ett gemensamt klassnamn.

Kan vara ja men med tanke på att det inte stod nåt om det i citatet från läraren så är det tveksamt, tror mer på att det var ett val gjort av TS. Om nu så var fallet är det ju bara att ignorera punkten

Skrivet av cracko:

Haha, du hade inte gillat den kod jag och en kompis redovisade på KTH. Alla variablar, metoder och klasser etc hette typ Leffe, Uffe, Roffe eller dothatshit, dothething, kabaam etc haha. Fick godkänt ändå så klart för det var så jäkla snyggt gjort med någon egenkonstruerad lösning av partiella diffekvationer eller vad det nu var.

Sorry för OT men kände det passade här.

Hoppas det var en av d första kurserna iaf inte bra med dåliga vanor, kan dock erkänna att mina variabelnamn i grundkursen i C var mindre genomtänkta

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Datavetare

Är egentligen bara ett fel i denna, rent teoretiskt skulle detta program kunna hamna i en evighetsloop här

while (true) { factor = r.nextInt(10) + 1; if (alreadyAnsweredCorrectly[factor] < numberOfQuerys) { break; }

i praktiken lär man ju för eller senare generera "rätt" slumptal, om det inte är så att slumptalsgenerator är dålig.

Att du kör med 80 tecken per rad har redan kommenterats och på moderna skärmar så är inte det fullt så viktigt. Men det finns ändå två stora anledningar till att köra med 80 tecken per rad även idag

  1. det gör sig mycket bättre i tryck om du någsin vill lägga in din kod i ett dokument / tidskrift

  2. det är lättare för människor att läsa korta rader

Precis som det står i uppgiftsspecifikationen så ska man bara kommentera varför man gör saker på ett visst sätt när det inte är uppenbart. Kommenterar som "Låter användaren välja tabell" känns rätt onödig när man anropar en metod med namnet "askWhichTable()".

Som kuriosa, samma uppgift löst med Python

Edit: vb, du har helt rätt. Glömde bort att Python inte optimerar svans-rekursion. Och missade att man inte ska slumpa en ny fråga oavsett rätt svar eller ej. Eftersom jag bemödade mig att posta första versionen så är det enda rimliga att posta en rättad version.

import random def get_num(prompt): while True: try: return int(raw_input(prompt)) except ValueError: print "You have to write a number" def rehearsal(table, n): answer = get_num("%d x %d = " % (n, table)) if answer == table * n: print "Correct!" return True print "Wrong answer" return False def practice_on_table(table, max_multiplier=10): errors = [ 0 for _ in range(max_multiplier) ] multipliers = range(1, max_multiplier+1) * 3 while len(multipliers) > 0: random.shuffle(multipliers) n = multipliers[0] if rehearsal(table, n): multipliers.pop(0) else: errors[n-1] += 1 print "Result\nQuestion\tErrors" for n in range(1, max_multiplier+1): print "%d x %d = %d\t%d" % (n, table, n*table, errors[n-1]) if __name__ == '__main__': try: while True: practice_on_table(get_num("Quiz on multiplication table: ")) except KeyboardInterrupt: print "\nBye!"

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Man kan skriva om practice_on_table genom att förkorta hur errors och multipliers skapas. På så sätt behövs inte gen_multipliers och koden blir lite enklare och kortare:

def practice_on_table(table, max_multiplier=10): errors = [0] * max_multiplier multipliers = range(1,max_multiplier+1) * 3 ...

För övrigt tror jag den gör lite fel, svarar man fel får man ju samma fråga igen tills man klarar den. Det känns som en förenkling jämfört med ursprungsuppgiften

Lite onödigt att använda rekursion i rehearsal oxå, är man riktigt usel (fel ~1000 gånger i rad) kraschar programmet.

Permalänk
Medlem

Jag skrev samma tenta så jag postar min lösning också, hoppas det är lugnt! Använde inte swing så programmet är inte så spännande att använda, men men

Gjorde en fullösning för vektorn som lagrar felaktiga svar. Ville göra den lika stor som antalet fel, men tidspressen ställde till det så jag skapade den med 100 element... Sen tolkade jag uppgiften som så att varje tabell går upp till 12, så svarar man rätt 36 gånger (12*3) är man färdig med tabellen.

Har tagit bort alla kommentarer, dels för att koden var överkommenterad (på begäran av läraren), och dels för att de var skrivna under stress ( = rörigt värre ).

import java.util.*; public class MultiplicationTrainer { public static void showStat (int[] result, int[] wrong, int table) { System.out.println(); System.out.println("*******************"); System.out.println("Antal rätt: " + result[0]); System.out.println("Antal fel: " + result[1]); System.out.println("*******************"); System.out.println(); System.out.println("Du hade fel på följande tal:"); System.out.println(); for (int i = 0; i < wrong.length; i++) { if (wrong[i] == 0) { break; } System.out.println("|*|\t" + wrong[i] + "x" + table + "\t|*|"); } } public static void multiTable (int table) { Scanner in = new Scanner(System.in); int[] noOfTimes = new int[36]; int[] result = new int[2]; int[] wrong = new int[100]; int count = 0; int answer; System.out.println("Du har valt " + table + ":ans tabell!"); while (count < 36) { int num = genNum(); if (countNum(noOfTimes, num) == 3) { continue; } String equation = num + "x" + table; System.out.println(); System.out.println("Vad blir " + equation + "?"); System.out.print("Svar: "); answer = in.nextInt(); in.nextLine(); if (answer == 0) { break; } if (answer == (num * table)) { System.out.println("Rätt svar!"); addNum(noOfTimes, num); result[0]++; count++; } else { System.out.println("Fel svar!"); addNum(wrong, num); result[1]++; } } showStat(result, wrong, table); } private static void addNum (int[] array, int num) { for (int i = 0; i < array.length; i++) { if (array[i] == 0) { array[i] = num; break; } } } private static int countNum (int[] noOfTimes, int num) { int count = 0; for (int i = 0; i < noOfTimes.length; i++) { if (noOfTimes[i] == num) { count++; } } return count; } private static int genNum () { int num; num = (int) (Math.random() * 12) + 1; return num; } public static void main (String args[]) { Scanner in = new Scanner(System.in); int choice = 1; while (choice != 0) { System.out.println(); System.out.print("Vilken multiplikationstabell vill du öva på? (1 - 12, avsluta med 0): "); choice = in.nextInt(); in.nextLine(); System.out.println(); switch (choice) { case 1: multiTable(choice); break; case 2: multiTable(choice); break; case 3: multiTable(choice); break; case 4: multiTable(choice); break; case 5: multiTable(choice); break; case 6: multiTable(choice); break; case 7: multiTable(choice); break; case 8: multiTable(choice); break; case 9: multiTable(choice); break; case 10: multiTable(choice); break; case 11: multiTable(choice); break; case 12: multiTable(choice); break; case 0: choice = 0; break; default: System.out.println("Välj ett tal mellan 1 - 12 eller 0 för att avsluta!"); break; } } } }

Permalänk
Medlem
Skrivet av rile:

Jag skrev samma tenta så jag postar min lösning också, hoppas det är lugnt! Använde inte swing så programmet är inte så spännande att använda, men men

Gjorde en fullösning för vektorn som lagrar felaktiga svar. Ville göra den lika stor som antalet fel, men tidspressen ställde till det så jag skapade den med 100 element... Sen tolkade jag uppgiften som så att varje tabell går upp till 12, så svarar man rätt 36 gånger (12*3) är man färdig med tabellen.

Har tagit bort alla kommentarer, dels för att koden var överkommenterad (på begäran av läraren), och dels för att de var skrivna under stress ( = rörigt värre ).

...

Inte orkat gå in på så mycket detaljer, man kan säga att din switch sats i main är helt onödig iaf

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem
Skrivet av Gnejs:

Inte orkat gå in på så mycket detaljer, man kan säga att din switch sats i main är helt onödig iaf

Oj, nej det var inte så smart, vet inte hur jag tänkte...

Något i den här stilen hade kanske vart bättre?

if (choice == 0) { break; } else if (choice >= 1 && choice <= 12) { multiTable(choice); } else { System.out.println("Välj ett tal mellan 1 - 12 eller 0 för att avsluta!"); }

Edit: Med lösningen ovan kanske jag skulle haft "while(true)" istället för "choice != 0" också.

Permalänk
Medlem
Skrivet av rile:

Oj, nej det var inte så smart, vet inte hur jag tänkte...

Nej det kan man allt undra hur du gjorde Skämt åsido. If-lösningen är ju definitivt snyggare men tänkte bara passa på att informera om att du kan "stacka" case-uttryck också när man väl behöver använda dem.

switch(choice) { case 1: case 2: case 8: multiTable(choice); break; default: .... }

//C

Permalänk
Avstängd
Skrivet av conio:

Nej det kan man allt undra hur du gjorde Skämt åsido. If-lösningen är ju definitivt snyggare men tänkte bara passa på att informera om att du kan "stacka" case-uttryck också när man väl behöver använda dem.

switch(choice) { case 1: case 2: case 8: multiTable(choice); break; default: .... }

//C

Behöver du nånsin switch-satser är det ett tecken på att du gjort fel.. tex
Fel sätt

public void DoSomething(Somethings whichSomething) { switch(whichSomething) { case Somethings.DoOne: //code break; case Somethings.DoTwo: //Code break; } }

Rätt sätt (Finns fler rätt sätt förstås)

public class DoIt { private readonly IEnumerable<IDoSomethingHandler> doSomethingHandlers; public DoIt(IEnumerable<IDoSomethingHandler> doSomethingHandlers) { this.doSomethingHandlers = doSomethingHandlers; } public void DoSomething(Somethings whichSomething) { var handler = doSomethingHandlers.Single(handler => handler.Handels == whichSomething); handler.Execute(); } }

Visa signatur
Permalänk
Medlem
Skrivet av CyberVillain:

Behöver du nånsin switch-satser är det ett tecken på att du gjort fel.. tex
Fel sätt

public void DoSomething(Somethings whichSomething) { switch(whichSomething) { case Somethings.DoOne: //code break; case Somethings.DoTwo: //Code break; } }

Rätt sätt (Finns fler rätt sätt förstås)

public class DoIt { private readonly IEnumerable<IDoSomethingHandler> doSomethingHandlers; public DoIt(IEnumerable<IDoSomethingHandler> doSomethingHandlers) { this.doSomethingHandlers = doSomethingHandlers; } public void DoSomething(Somethings whichSomething) { var handler = doSomethingHandlers.Single(handler => handler.Handels == whichSomething); handler.Execute(); } }

*ehm* Kursen var i "Grundläggande Java"

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Avstängd
Skrivet av Gnejs:

*ehm* Kursen var i "Grundläggande Java"

Sorry jag kan inte Java, men C# och Java har rätt lik syntax...

Visa signatur
Permalänk
Medlem
Skrivet av conio:

Nej det kan man allt undra hur du gjorde Skämt åsido. If-lösningen är ju definitivt snyggare men tänkte bara passa på att informera om att du kan "stacka" case-uttryck också när man väl behöver använda dem.

switch(choice) { case 1: case 2: case 8: multiTable(choice); break; default: .... }

//C

Tack för tipset! Man har ju en del att lära sig, speciellt så här i början... Fortsättningskursen går in på OOP, det ska bli intressant!

Permalänk
Medlem
Skrivet av CyberVillain:

Behöver du nånsin switch-satser är det ett tecken på att du gjort fel.. tex
Fel sätt

public void DoSomething(Somethings whichSomething) { switch(whichSomething) { case Somethings.DoOne: //code break; case Somethings.DoTwo: //Code break; } }

Rätt sätt (Finns fler rätt sätt förstås)

public class DoIt { private readonly IEnumerable<IDoSomethingHandler> doSomethingHandlers; public DoIt(IEnumerable<IDoSomethingHandler> doSomethingHandlers) { this.doSomethingHandlers = doSomethingHandlers; } public void DoSomething(Somethings whichSomething) { var handler = doSomethingHandlers.Single(handler => handler.Handels == whichSomething); handler.Execute(); } }

Ok så du läser in en int, sedan tolkar du om den till ett enum-värde, sedan måste du ha tolv funktioner för att hantera respektive multiplikationstabell. Varje funktion måste vara medveten om scope eftersom det enda de gör är att anropa multiplikationsmetoden, med det värde du tidigare omvandlat till en enum.

Hur exakt är detta en bättre lösning? Hur får du ut resultatet av multiplikationsmetoden? Etc.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Avstängd

Jag snackar om switchar lilla vännen.. inte uppgiften som sådan.. Ett factory pattern av något slag är oftast bättre än en switchar eller ifs

Visa signatur
Permalänk
Medlem
Skrivet av CyberVillain:

Jag snackar om switchar lilla vännen.. inte uppgiften som sådan.. Ett factory pattern av något slag är oftast bättre än en switchar eller ifs

Ja, du pratar om switchar och ifs, det är det jag kommenterar på. Vi har en int. Är dess värde mellan 1 och 12 ska vi skicka den till en metod, annars exita. Det är fan inte rocket science. Din dåligt implementerade version av visitor pattern löser ingenting. Det är för övrigt inte ens factory pattern.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Avstängd

Det är mitt ditt tankesätt som vi får klasser på 1000 rader och mer.

public DoIt(IEnumerable<IDoSomethingHandler> doSomethingHandlers)

Denna kollektion injiceras med ett DI verktyg, vilket betyder att varje handler kan ha helt egna beroenden vilket gör varje implementation av en handler mindre komplex, ökar separationen och på köpet får man ökad läsbarhet. Men du min vän jobbar ju inte i stora enterprise projekt där man som arkitekt måste tänka på att man har 10 eller fler utvecklare som ska utveckla mot samma kodbas, det hör ju jag. Jag jobbar som lösningsarkitekt i ett större projekt, och det är åsikter som dina att företagen har massor med spaghettikod. Men nu ska vi inte bråka

edit: Du har dock rätt i att det inte är 100% ett factory pattern, ett dynamiskt strategy pattern beroende på indata?

Visa signatur
Permalänk
Medlem
Skrivet av CyberVillain:

Det är mitt ditt tankesätt som vi får klasser på 1000 rader och mer.

public DoIt(IEnumerable<IDoSomethingHandler> doSomethingHandlers)

Denna kollektion injiceras med ett DI verktyg, vilket betyder att varje handler kan ha helt egna beroenden vilket gör varje implementation av en handler mindre komplex, ökar separationen och på köpet får man ökad läsbarhet. Men du min vän jobbar ju inte i stora enterprise projekt där man som arkitekt måste tänka på att man har 10 eller fler utvecklare som ska utveckla mot samma kodbas, det hör ju jag. Jag jobbar som lösningsarkitekt i ett större projekt, och det är åsikter som dina att företagen har massor med spaghettikod. Men nu ska vi inte bråka

edit: Du har dock rätt i att det inte är 100% ett factory pattern, ett dynamiskt strategy pattern beroende på indata?

1. Detta är en tenta i Java, inte ett enterpriseprojekt.

2. Du hävdar att en switch-case alltid är fel och ger ett rent ut sagt uruselt exempel som svar. Ett exempel som har beroenden på injektionsramverk (vilket du inte nämner) och ÄNDÅ inte löser problemet.

Jag är glad att jag inte jobbar med dig, du verkar vara en självgod navelskådare.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Avstängd

Och jag är glad att jag inte jobbar med dig (Det du kallar för jobb är väll att sitta i ett garage och jobba på timme för 400 kronor), du är uppenbart inte en professionell utvecklare och vet inte hur man bygger upp en arkitektur för stora projekt. Exemplet är inte uselt, däremot har du rätt i att det är off topic, så vi kanske ska sluta gnabbas och låta TS ha sin tråd?

Jag självgod, kul, du är den som ofta är självgod i de trådar jag sett i denna del av forumet.

Visa signatur
Permalänk
Medlem

Finns en anledning till att enterprisey ofta nämns på thedailywtf.. Och det beror inte på att typiska enterprise-lösningar är enkla och tydliga

Permalänk
Medlem

Tack så mycket för era svar!