2016-12-24 3 views
0

난 그냥 최근에 의존성 반전 원칙 및 제어의 반전에있어, 나는 현재 (내가 틀렸다면 정정 해줘) 알고에서 해당 DIP이다 한은 상태가의존성 삽입 (Dependency Injection) 문제

높은 수준의 모듈/클래스 저수준 모듈/클래스에 의존하지 않아야

높고 낮은 레벨의 모듈의 세부 사항에 의존하지 않아야 (되지이 하나 ??? 수단 무엇인지), 그러나 둘

추상화 (인터페이스)

하지만 간단한 프로그램을 쓰고있을 때 이 원리를 구현하기 위해, 내가 (나중에 설명 할 것이다)

내 프로그램이 문제가

 class Player : ICharacterable { 

    private int _health = 100; 

    public int Health{ 

     get{ 
      return _health; 
     } 

    } 

    public int HealthIncrease(int health){ 
     //increase health 
     return _health + health; 

    } 


} 

class Inventory{ 

    ICharacterable player = null; 

    //constructor injection 
    public Inventory(ICharacterable player) { 

     this.player = player; 

    } 

    //increase player health 
    public void UseHealthPotion(int health) { 

     player.HealthIncrease(health); 

    } 

} 

class Program{ 
static void Main(string[] args) { 

    Player john = new Player(); 
    Inventory inv = new Inventory(john); 

    inv.UseHealthPotion(30); 
    Console.WriteLine(john.Health); 

} 

} 

//interface 
public interface ICharacterable { 

    int HealthIncrease(int health); 

} 

을 "ICharacterable"을 구현하는 인벤토리 및 플레이어의 클래스로 구성

가 콘솔 (100) 을 대신 반환 문제에 달렸다 나는이 문제가 Player 대신 ICharacterable 유형을 주입한다고 선언했기 때문에 발생했음을 알았지 만 (어쨌든 DIP을 위반할 것입니다.) 어쨌든 제가 이것을 할 수 있습니까? 당신의 방법은 추가의 결과를 반환하고의 상태를 변경하지 때문에,

public int HealthIncrease(int health){ 
     //increase health 
     return _health += health; 

    } 
+0

모델 정보가 아니라 "인벤토리 HAS-A 플레이어"가 이상하게 들립니다. 그리고 누가 물약, 선수 또는 재고품을 마십니까? –

+0

왜 'HealthIncrease'가 아무 것도 반환하지 않습니까?나는 상태를 변경 (즉, 플레이어의 건강 분야를 향상)하거나 합계를 수행하고 반환합니다. 두 가지를 모두 수행하지는 않습니다. 이는 부작용입니다. – weston

답변

1

당신은 나쁜 결과를 얻을 : 감사

+0

이봐, 당신은 "당신은 단지 작은 교체를 고려해야합니다, 내 의견으로는 플레이어가 재고가 있어야합니다. 당신은 OOP 디자인 패턴을 따르고 코드가 훨씬 나아질 것입니다. 모든 수업에는 오직 하나의 책임 만 있어야한다고 나는 들었습니다. 어떻게 그 혜택을 볼 수 있습니까? 덕분에 – Lef

+0

@Lef 사실입니다.이 동작은 변경되지 않습니다. 내 말은 - 플레이어가 의존성으로 인벤토리를 가져야한다는 것입니다. –

+0

@Lef 업데이트 된 답변보기 –

2

이것은 의존성 주입의 문제는, 당신은 여기에 코드에서 버그를 가지고 있지 않습니다 그 물체. 그 밖의 모든 것은 정확합니다. 로 변경 : 내 의견으로는, 당신은 작은 교체를 고려해야한다

public int HealthIncrease(int health){ 
    //increase health 
    _health += health; 
    return _health; 
} 

플레이어는해야 오히려 그 반대보다 재고가 포함되어 있습니다. 그렇다면 OOP 디자인 패턴을 따르고 코드가 훨씬 개선 될 것입니다.

고레벨 모듈/클래스 이때 플레이어 = 고레벨 클래스 재고 = 저레벨 클래스에서 낮은 수준 모듈/클래스

의존하지 않아야

상위 및 하위 모듈 모두 세부 사항에 의존해서는 안되며 (이 의미가 무엇인지는 확실하지 않음) 추상화 (인터페이스)

빠른 설명 :

추상화 = 인터페이스 또는 추상 클래스입니다. 이해하기 쉽습니다. 귀하의 ICharactable 인터페이스입니다.

세부 사항 = 구현. 인벤토리 클래스입니다. 귀하의 코드가이 원칙과 호환되는 이유는 무엇입니까?

+0

어쩌면 내가 그, 감사를 놓칠 수 – Lef