Dividir a Classe?

Opa

Tenho essa classe, teria como dividir ela?

[code]package modelo;

import java.util.ArrayList;

public class JogoDeTruco {
private JogadorDeTruco jogador1, jogador2;
private Baralho baralho;
private ArrayList maoJ1 = new ArrayList(),
maoJ2 = new ArrayList();
protected Carta umaCarta, outraCarta, cartaVirada;
protected int numeroUmaCarta, naipeUmaCarta, numeroOutraCarta,
naipeOutraCarta, j1FezPrimeiro = 0, j2FezPrimeiro = 0, rodada = 0,
tentos;

public JogoDeTruco(JogadorDeTruco j1, JogadorDeTruco j2) {
	jogador1 = j1;
	jogador2 = j2;
	baralho = Baralho.obterBaralho();
}

public void darCartas() {
	for (int i = 0; i <= 2; i++) {
		umaCarta = baralho.retirarCarta();
		jogador1.receberCarta(umaCarta);
		maoJ1.add(umaCarta);
		umaCarta = baralho.retirarCarta();
		jogador2.receberCarta(umaCarta);
		maoJ2.add(umaCarta);
	}
	cartaVirada = baralho.retirarCarta();
}

public void darCartas(ArrayList<Carta> j1, ArrayList<Carta> j2,
		Carta cVirada) {
	for (int i = 0; i < j1.size(); i++) {
		umaCarta = j1.get(i);
		jogador1.receberCarta(umaCarta);
		maoJ1.add(umaCarta);
	}
	for (int i = 0; i < j2.size(); i++) {
		umaCarta = j2.get(i);
		jogador2.receberCarta(umaCarta);
		maoJ2.add(umaCarta);
	}

	cartaVirada = cVirada;
}

public Carta compararCartas() {

	if (umaCarta.ehManilha(cartaVirada)) {
		if (!outraCarta.ehManilha(cartaVirada)) {
			return umaCarta;
		} else if (naipeUmaCarta > naipeOutraCarta) {
			return umaCarta;
		}
		return outraCarta;

	}
	if (outraCarta.ehManilha(cartaVirada))
		return outraCarta;

	if (numeroOutraCarta == numeroUmaCarta)
		return null;

	if (numeroUmaCarta > numeroOutraCarta)
		return umaCarta;

	return outraCarta;
}

public void cartaVirada(Carta c) {
	cartaVirada = c;
}

public void quantoValeOTento() {
	tentos = 1;
	if (jogador1.trucado && !jogador2.correu || jogador2.trucado
			&& !jogador1.correu)
		tentos = 3;
	if (jogador2.pediuSeis && !jogador1.correu || jogador2.pediuSeis
			&& !jogador1.correu)
		tentos = 6;
	if (jogador1.pediuNove && !jogador2.correu || jogador2.pediuNove
			&& !jogador1.correu)
		tentos = 9;
	if (jogador1.pediuDoze && !jogador2.correu || jogador2.pediuDoze
			&& !jogador1.correu)
		tentos = 12;
}

public void darOPonto(Carta vUmaCarta, Carta vOutraCarta) {
	quantoValeOTento();

	rodada++;
	umaCarta = vUmaCarta;
	outraCarta = vOutraCarta;
	numeroUmaCarta = umaCarta.obterNumero().getArabico();
	naipeUmaCarta = umaCarta.obterNaipe().getArabico();
	numeroOutraCarta = outraCarta.obterNumero().getArabico();
	naipeOutraCarta = outraCarta.obterNaipe().getArabico();

	umaCarta = compararCartas();
	for (int i = 0; i < maoJ1.size(); i++) {
		if (umaCarta == maoJ1.get(i)) {
			jogador1.receberPontoNaRodada();
			if (j2FezPrimeiro == 0)
				j1FezPrimeiro = 1;

		}
		if (umaCarta == maoJ2.get(i)) {
			jogador2.receberPontoNaRodada();
			if (j1FezPrimeiro == 0)
				j2FezPrimeiro = 1;

		}
	}
	if (rodada == maoJ1.size()) {
		ganharOTento();
		maoJ2.clear();
		maoJ1.clear();
		j1FezPrimeiro = 0;
		j2FezPrimeiro = 0;
		rodada = 0;
		jogador1.terminarRodada();
		jogador2.terminarRodada();
	}
}

public void ganharOTento() {
	if (jogador1.informeNumeroDePontos() > jogador2.informeNumeroDePontos())
		jogador1.ganharTentos(tentos);
	if (jogador2.informeNumeroDePontos() > jogador1.informeNumeroDePontos())
		jogador2.ganharTentos(tentos);
	if (jogador1.informeNumeroDePontos() == 1
			&& jogador2.informeNumeroDePontos() == 1)
		if (j1FezPrimeiro == 1)
			jogador1.ganharTentos(tentos);
		else
			jogador2.ganharTentos(tentos);

}

public void fimDaRodada() {
	quantoValeOTento();

	if (jogador1.correu)
		jogador2.ganharTentos(tentos);
	if (jogador2.correu)
		jogador1.ganharTentos(tentos);

}

}
[/code]

Claro que tem xiiiter, mas preciso saber como exatamente você pretende dividir, se todos os método um uma outra classe ou alguns em uma classe e outros em outra e quais!

tem como criar uma interface, ou uma classe abstrata?

e em orientação a objetos, como ficaria?

Eu acho que a pergunta não é como dividir a classe que você implementou, mas sim como criar um modelo de classes para um jogo de truco, e depois implementar. Você perguntou sobre a criação de interface ou classe abstrata… Não sei se neste caso estes conceitos se aplicariam.

Olhando para o seu modelo, você tem as classes JogadorDeTruco, Baralho e JogoDeTruco. O modelo e a forma como você implementou parecem razoáveis para mim (eu enxergo que poderia haver uma classe Rodada também, por exemplo). Qual o motivo de você querer dividir a classe?

Abraço!

[quote=ctosin]Eu acho que a pergunta não é como dividir a classe que você implementou, mas sim como criar um modelo de classes para um jogo de truco, e depois implementar. Você perguntou sobre a criação de interface ou classe abstrata… Não sei se neste caso estes conceitos se aplicariam.

Olhando para o seu modelo, você tem as classes JogadorDeTruco, Baralho e JogoDeTruco. O modelo e a forma como você implementou parecem razoáveis para mim (eu enxergo que poderia haver uma classe Rodada também, por exemplo). Qual o motivo de você querer dividir a classe?

Abraço![/quote]

Estou tentando utilizar tdd para criar o jogo, e deixar o jogo em OO. Eu acho que por essa classe ter muitas linhas eu poderia dividir ela. Sei lá, talvez transformar a Classe JogoDeTruco em uma Classe Abstrata e aí sim criar a classe Rodada, e uma outra Regras, ou algo do tipo. Seria certo fazer isso?
Abraço

Você já tem orientação a objetos funcionando no seu código. Mas se deseja refinar mais a modelagem e diminuir o tamanho das classes, acho que você pode fazer algumas coisas. Os métodos darCartar() e compararCartas(), por exemplo, podem ir para a classe Baralho, já que estão relacionadas com ele. Você pode também criar uma classe Jogada e colocar nela o método quantoValeOTento(), por exemplo. Enfim, não existe uma modelagem certa ou errada. É tudo questão de você definir até onde quer modelar e de que forma.

Classes abstratas e interfaces são usadas em casos onde pretende-se ter polimorfismo (comportamente diferente de objetos que, aparentemente, parecem iguais). Neste caso não vejo onde você poderia ter isso. Não é necessário que um código tenha classes abstratas e/ou interfaces para ser considerado orientado a objetos.

Abraço!