코드 중복제거
조회수 231회
abstract class AirUnit extends Unit {
private int power;
public AirUnit(String name, int tribal, Point location, BaseStat baseStat, int power, double speed) {
super(name, tribal, location, baseStat, speed);
setPower(power);
}
// 공중공격
public void airAttack(AirUnit airTarget) {
System.out.println(this.getName() + "의 공격!");
System.out.println(airTarget.getName() + "에게 " + power + "의 데미지를 입혔다!");
// 내 공격력에서 적의 방어력을 깜
int remainDamage = power - airTarget.getBaseStat().getDef();
if(remainDamage > 0) {
airTarget.getBaseStat().setDef(0); /
remainDamage = airTarget.getHp() - remainDamage;
airTarget.setHp(remainDamage);
if(remainDamage < 0) {
airTarget.setHp(0);
}
} else {
airTarget.getBaseStat().setDef(- remainDamage);
}
System.out.println(airTarget.getName() + "의 HP / def : " + airTarget.getHp() + " / " + airTarget.getBaseStat().getDef());
}
//지상공격
public void groundAttack(GroundUnit groundTarget) {
System.out.println(this.getName() + "의 공격!");
System.out.println(groundTarget.getName() + "에게 " + power + "의 데미지를 입혔다!");
if(groundTarget.getTribal() == PROTOSS) { // 타겟의 종족이 프로토스면
int remainDamage = power - ((ShieldStat)groundTarget.getBaseStat()).getShield();
if(remainDamage > 0) { // 내 공격력이 더 쎄면
((ShieldStat)groundTarget.getBaseStat()).setShield(0);
remainDamage = remainDamage - groundTarget.getBaseStat().getDef();
groundTarget.setHp(groundTarget.getHp() - (remainDamage >= 0 ? remainDamage : 0));
System.out.println(groundTarget.getName() + "의 HP: " + groundTarget.getHp());
} else {
((ShieldStat)groundTarget.getBaseStat()).setShield(- remainDamage);
System.out.println(groundTarget.getName() + "의 HP / Shield : " + groundTarget.getHp() + " / " + ((ShieldStat)groundTarget.getBaseStat()).getShield());
}
} else { // 프로토스말고 다른 종족
System.out.println(this.getName() + "의 공격!");
System.out.println(groundTarget.getName() + "에게 " + power + "의 데미지를 입혔다!");
int remainDamage = power - groundTarget.getBaseStat().getDef();
if(remainDamage > 0) {
groundTarget.getBaseStat().setDef(0); // 적의 방어력 0
remainDamage = groundTarget.getHp() - remainDamage;
groundTarget.setHp(remainDamage);
if(remainDamage < 0) {
groundTarget.setHp(0);
}
} else {
groundTarget.getBaseStat().setDef(- remainDamage);
}
System.out.println(groundTarget.getName() + "의 HP / def : " + groundTarget.getHp() + " / " + groundTarget.getBaseStat().getDef());
}
}
공중공격 메서드가 지상공격의 else부분(프로토스말고 다른 종족 else)이랑 코드가 동일한데 코드 중복으로 안좋게 생각할까요..?! 저런 건 어떻게 중복을 제거해야 하는지 궁금합니다 !
1 답변
-
중복 코드를 제거하는 가장 간단한 방법은 메서드나 함수로 빼는건데요.
작성한 코드의 경우
GroundUnit
과AirUnit
의 부모인Unit
으로 업캐스팅 하는 방식을 쓰면 됩니다. 단,Unit
에getName()
,getBaseStat()
,getHp()
,setHp()
메서드가 있어야 합니다.//지상공격 public void groundAttack(GroundUnit groundTarget) { // 생략 if(groundTarget.getTribal() == PROTOSS) { // 타겟의 종족이 프로토스면 // 생략 } else { // 프로토스말고 다른 종족 executeMe(groundTarget); // 받는 쪽이 Unit으로 선언돼 있어서 자동으로 업캐스팅 됨 } } private void executeMe(Unit target) { System.out.println(this.getName() + "의 공격!"); System.out.println(target.getName() + "에게 " + power + "의 데미지를 입혔다!"); int remainDamage = power - target.getBaseStat().getDef(); if(remainDamage > 0) { target.getBaseStat().setDef(0); // 적의 방어력 0 remainDamage = target.getHp() - remainDamage; target.setHp(remainDamage); if(remainDamage < 0) { target.setHp(0); } } else { target.getBaseStat().setDef(- remainDamage); } System.out.println(target.getName() + "의 HP / def : " + target.getHp() + " / " + target.getBaseStat().getDef()); }
댓글 입력