코드 중복제거

조회수 337회
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 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    중복 코드를 제거하는 가장 간단한 방법은 메서드나 함수로 빼는건데요.

    작성한 코드의 경우 GroundUnitAirUnit의 부모인 Unit으로 업캐스팅 하는 방식을 쓰면 됩니다. 단, UnitgetName(), 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());
    }
    
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)