Como EU faria:
Passo 1 - Ao invés de usar System.out.println()
, colocaria isso tudo em uma função que retorna int (pontuação)
Passo 2 - Escreveria testes unitários usando a biblioteca JUnit do Java para ter certeza que o comportamento dessa função está de acordo com o que eu espero (incluindo cenários alternativos)
Passo 3 - Começaria a refatorar começando pelos statements de dentro do if.
Por exemplo: letras[i] == 'Q' || letras[i] == 'Z'
o que a letra Q
e Z
tem em comum? Você consegue ver que esse padrão(isso || aquilo
) se repete muito?
Tente procurar padrões no que você tem e refatore métodos para isso.
Dica: Se apoie nos testes unitários do Passo 2 para garantir que tudo continua funcionando
Passo 3 - Depois eu partiria para limpar esses if/else if.
essencialmente no final gostaria de ter um método mais ou menos assim:
public static void main(String[] args) {
String palavra = "teste";
String palavraUpper = palavra.toUpperCase();
char[] letras = palavraUpper.toCharArray();
int pontuação = getPontuacaoDasLetras(letras)
}
public static int getPontuacaoDasLetras(char[] letras) {
int pontuacao = 0;
for (int i = 0; i < letras.length; i++) {
pontuacao += getPontuacaoDaLetra(letras[i]);
}
return pontuacao;
}
getPontuacaoDaLetra()
poderia ser um simples método que olha um mapa hardcoded.
sendo assim mapa['A']
retornaria int 2
e assim por diante.
Só precisaria mapear todas as letras e a pontuação correspondente
Exemplo completo do descrito acima:
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TabNewsExercise1Test {
@Test
public void test1() {
TabNewsExercise1 ex = new TabNewsExercise1();
assertEquals(5, ex.doExercise("teste"));
}
@Test
public void test2() {
TabNewsExercise1 ex = new TabNewsExercise1();
assertEquals(14, ex.doExercise("Iuri"));
}
@Test
public void test3() {
TabNewsExercise1 ex = new TabNewsExercise1();
assertEquals(16, ex.doExercise("tabnews"));
}
}
public class TabNewsExercise1 {
public static int doExercise(final String input) {
int score = 0;
for (char letter : input.toUpperCase().toCharArray()) {
score += Letters.valueOf(Character.toString(letter)).getLetterScore();
}
return score;
}
}
public enum Letters {
A(1),
B(3),
C(3),
D(2),
E(1),
F(4),
G(2),
H(4),
I(5),
J(8),
K(5),
L(1),
M(3),
N(5),
O(1),
P(3),
Q(10),
R(1),
S(1),
T(1),
U(3),
V(4),
W(4),
X(8),
Y(4),
Z(10);
private final int score;
private Letters(int letterScore) {
this.score = letterScore;
}
int getLetterScore() {
return score;
}
}