Codereview. Powiedzcie mi, czy robie gdzieś źle.

0

Po kilkuletniej przerwie od programowania wróciłem do tej zabawy i chciałbym, abyście mi wskazali jakieś błędy, czego unikać, na co zwrócić uwage. Program jest dość krótki, ale myśle, że i wy z tego coś wyciągniecie :P

Program to zabawa "PigLatin". W skrócie, jeśli pierwsza litera jest spółgłoską to przenoszę ją na koniec, podobnie z drugą i dodaje na koncu ay, jeśli samogłoska to nic nie przenosze i dodaje yay.

import java.util.Scanner;

public class PigLatin{
	public static void main(String[] args){
                Scanner skaner = new Scanner(System.in);
		while(true)
		{
			String word = skaner.nextLine();
			boolean tmp=false; //sprawdzam czy pierwsza litera byla spolgloska, by wiedziec czy dodac ay czy yay
			for(int i=0;i<2;i++) if(check_letter(word.charAt(0))==0){
				word = place_at_end(word);
				tmp=true;
			}
			word+=tmp?"ay":"yay";
			System.out.println(word);
			
		}
		
	}

	private static String place_at_end(String word) {
		StringBuilder a = new StringBuilder(word);
		for(int i=0;i<word.length();i++) {
			try{	
				a.setCharAt(i, word.charAt(i+1));
			}catch(StringIndexOutOfBoundsException e) {};
		}
		a.setCharAt(word.length()-1, word.charAt(0));
		return a.toString();
		
	}

	private static int check_letter(char charAt) {
		char[] vowel = new char[]{'a','e','i','u','o','y'};
		for(int i=0;i<6;i++){
			if(charAt==vowel[i]) return 1;
		}
		return 0;
	}

}

Ja wiem, że pewnie można zrobić to na milion innych, szybszych sposobów, ale tu chciałbym usłyszeć "tego się nie używa!", "tu możesz mieć wyjątek i program się wysypać!"

Zanim porzuciłem programowanie, to mój poziom też nie był wysoki, wiec można powiedzieć, że startuje od zera. Bez niepotrzebnego hejtu proszę :)

0

Jeśli chodzi o merytoryczność:

  1. Jak łapiesz wyjątek, to rób coś. Chociażby loguj do loggera.
  2. A co jak ktoś da duże litery? Przed iterowaniem w poszukiwaniu samogłoski proponuję dać .toLowerCase()
 
for(int i=0;i<word.length();i++) {
            try{    
                a.setCharAt(i, word.charAt(i+1));
            }catch(StringIndexOutOfBoundsException e) {};
        }

Powinieneś iterować do word.length() - 1 , bo inaczej będzie raczej IndexOutOfBoundException
4) Ten twój łapany wyjątek StringOutOfBoundException jest typu Runtime, więc nie ma sensu go catchować. Równie dobrze 80% kodu możemy umieścić w catchu do NullPointera.
5) Metoda check_letter powinna zwracać typ boolean a nie int

Jeśli chodzi o wygląd kodu:

  1. Nie pisz po polsku, nawet w komentarzach
  2. w javie preferujemy camelCase zamiast używania_podkreślników
  3. zastosuj jakiś formatter bo brzydko wygląda jak nie ma spacji między niektórymi znakami

To tak z grubsza na szybko tyle :)

0

trochę w main się pogubiłeś -

  1. brakuje klamry za pętlą for
  2. sprawdzasz tylko pierwszy znak w tej pętli jeśli tak ma być to ta pętla jest Ci niepotrzebna, ale jeśli chcesz sprawdzić też drugi to powinno być raczej:
for (int i = 0; i < 2; i++) {
if (check_letter(word.charAt(i)) == 0){ // tylko nie zero a false
......}
}
  1. ale wtedy tmp wyjdzie z tej pętli z wynikiem wywołania checkLetter (użyj camelCase) dla drugiego znaku czyli np. dla znaków "as" będzie false i dodasz ay zamiast yay

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