2013-04-02 3 views
0

"우수 사례"유형 과정에서 대학에서 배운 것을 토대로 가능하면 상속보다 구성을 선호하는 경향이 있습니다. 클래스 D는 "이 좋지 않다"이전 개발자가 작성한 클래스 A의 공용 속성을 사용하고 있습니다 : 위의 예에서상속 - 하위 클래스의 변수 초기화

Public Class A 
    Protected _Name As String 
    Public Property Name() As String 
     Get 
      Return _Name 
     End Get 
     Set(ByVal value As String) 
      _Name = value 
     End Set 
    End Property 
End Class 

Public Class B 
    Inherits A 
End Class 

Public Class C 
    Inherits B 
End Class 

Public Class D 
    Inherits C 

    Public Sub SomeMethod() 
     'This isn't good 
     Name = "Ian" 
    End Sub 

    Public Shared Sub Main() 
     Dim d As New D 
     d.SomeMethod() 
    End Sub 

End Class 

:이처럼 보이는 응용 프로그램의 일부 코드에서 찾고 클래스 D에서 이름의 초기화를 넘었습니다. 저는이 주석을 작성한 이유가 비즈니스 규칙에 기인한다고 생각합니다. 클래스 D에 a.Name의 값을 할당 한 것은 아닙니다. 그러나, 위의 코드에 문제가있는 것입니다. a.Name은 모든 서브 클래스가 공유합니다. 클래스 B, C 및 D에는 많은 오버로드 된 메서드가 포함되어 있으므로 상속이이 경우에 올바른 디자인 선택이라고 생각합니다.

이전 개발자가 더 많은 문서를 남기고 싶습니다.

+1

아마도 이전 개발자의 이름이 Ian이 아니었을 것입니다 .-) –

+0

하드 코딩 된 문자열''Ian "'때문에 생각합니다. 여기에 상속과 관련하여 잘못된 것은 없습니다. –

+0

@ 아이바 슬라 보프, 감사합니다. 내가 질문을 설명하는 "이안"을 harcoded있다. 이름은 실제로 응용 프로그램의 데이터 계층에서 추출됩니다. 답변을 쓸 수 있습니까? – w0051977

답변

1

파생 클래스의 부모 속성에 값을 할당해도 부모 형식의 예상 동작을 위반하지 않는 경우에는 아무런 문제가 없습니다 (Liskov substitution principle 참조). 예제의 D 유형은 여전히 ​​클래스 A로 처리 될 수 있습니다. Name 속성의 변경이 클래스 A에 대한 금지 된 동작이 아니라면 (해당 속성에 대한 설정자가 있기 때문에) 믿을 수 없습니다. 문제.

아마도 이전 개발자가 자신의 의견에서 언급 한 문제는 비즈니스 계층이 아니라 데이터 계층에서 직접 가치를 얻는 것이었을까요?

관련 문제