违反ISP

时间:2017-10-23 15:36:09

标签: java oop solid-principles interface-segregation-principle

我问question关于使用策略模式和LSP,但答案是混合的,从长远来看,这不是一个好主意。然而,我的问题底部的评论指出,虽然我没有违反LSP,但我违反了Interface Segregation Principle which states

  

不应强迫客户端实现他们不实现的接口   使用。而不是一个胖接口,优选许多小接口   基于方法组,每个方法服务一个子模块。

假设我有一个像这样的武器类:

public final Weapon{

    private final String name;
    private final int damage;
    private final List<AttackStrategy> validactions;
    private final List<Actions> standardActions;

    public Weapon(String name, int damage, List<AttackStrategy> standardActions, List<Actions> attacks)
    {
        this.name = name;
        this.damage = damage;
        standardActions = new ArrayList<Actions>(standardActions);
        validAttacks = new ArrayList<AttackStrategy>(validActions);
    }

    public void standardAction(String action){} // -- Can call reload or aim here.  

    public int attack(String action){} // - Call any actions that are attacks. 

}

接口和实施:

public interface AttackStrategy{
    void attack(Enemy enemy);
}

public class Shoot implements AttackStrategy {
    public void attack(Enemy enemy){
        //code to shoot
    }
}

public class Strike implements AttackStrategy {
    public void attack(Enemy enemy){
        //code to strike
    }
}

使用:

List<AttackStrategy> actions = new ArrayList<AttackStrategy();
actions.add(new Shoot())

List<Actions> standardActionactions = new ArrayList<Actions>();
actions.add(new Reload(10))

Weapon rifle = new Weapon("Sniper Rifle", 5, standardActionactions, actions);

List<AttackStrategy> actions = new ArrayList<AttackStrategy();
actions.add(new Swing())

List<Actions> standardActionactions = new ArrayList<Actions>();
actions.add(new Drop())

Weapon sword = new Weapon("Standard Sword", 10, standardActionactions, actions);

我有两个武器,两者都有不同的行为,两者都可以用来攻击,两者都有针对每种类型的不同行动。例如,Sword 不应,根据我的收藏逻辑,无法调用或实施重新加载。

在我的文本冒险游戏中,如果将“reload”传递给sword.standardAction("reload"),内部逻辑将检查List是否包含重新加载对象,如果是,则执行此操作,如果没有,武器不具备,因此不能,所以它忽略它。

我是否违反了ISP?

我的剑永远不会实现reload,除非客户决定实施它,我不强迫客户接受Sword知道Reload方法他们永远不会使用。

1 个答案:

答案 0 :(得分:0)

听起来武器抽象有点过于笼统。我会把它分解成更小的抽象

  1. 武器(抽象或界面 - 接受你的选择)

    • 攻击
  2. GunBasedWeapon(扩展武器)(枪支,步枪,激光枪,80年代威震天)

    • 目标
    • 重载
    • 攻击(抛出OutOfBulletException)
  3. 手持武器(扩展武器)(剑,棍棒,链等)

    • 攻击(在没有洗剂的情况下100次命中后抛出CallousesOnHandHurtException)
    • applyLotion
  4. ThrowableWeapon(扩展武器)(飞去来器)

    • 攻击(抛出SomebodyElseCaughtMyBoomerangException,然后是ImHosedException)
  5. WeaponAction - 每个武器类现在可以有一个有效动作列表,如果某人将“applyLotion”传递给GunBasedWeapon,只有Gun类会知道它无效。