Dividir a Classe?

6 respostas
X

Opa

Tenho essa classe, teria como dividir ela?

package modelo;

import java.util.ArrayList;

public class JogoDeTruco {
	private JogadorDeTruco jogador1, jogador2;
	private Baralho baralho;
	private ArrayList<Carta> maoJ1 = new ArrayList<Carta>(),
			maoJ2 = new ArrayList<Carta>();
	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);

	}

}

6 Respostas

I

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!

X

tem como criar uma interface, ou uma classe abstrata?

X

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

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!

X

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!

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

ctosin

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!

Criado 11 de junho de 2010
Ultima resposta 14 de jun. de 2010
Respostas 6
Participantes 3