예를 들어, 광범위하게 공유되는 클래스가있는 응용 프로그램이 있다고 가정 해 보겠습니다 User
. 이 클래스는 사용자, ID, 이름, 각 모듈에 대한 액세스 수준, 시간대 등에 대한 모든 정보를 제공합니다.
사용자 데이터는 분명히 시스템 전체에서 광범위하게 참조되지만, 어떤 이유로 든이 사용자 개체를이 클래스에 의존하는 클래스로 전달하는 대신 개별 속성 만 전달하도록 시스템이 설정됩니다.
사용자 ID가 필요한 클래스는 GUID userId
를 매개 변수로 필요 로하며 때로는 사용자 이름도 필요할 수 있으므로 별도의 매개 변수로 전달됩니다. 경우에 따라 개별 메소드로 전달되므로 값이 클래스 레벨에서 전혀 유지되지 않습니다.
매번 User 클래스에서 다른 정보에 액세스해야 할 때마다 매개 변수를 추가하여 변경해야하며 새 오버로드 추가가 적절하지 않은 경우 메서드 또는 클래스 생성자에 대한 모든 참조도 변경해야합니다.
사용자는 하나의 예일뿐입니다. 이것은 우리 코드에서 널리 실행됩니다.
이것이 Open / Closed 원칙을 위반한다고 생각하는 것이 맞습니까? 기존 클래스를 변경하는 작업뿐만 아니라 처음에 클래스를 설정하여 향후 광범위한 변경이 필요할 가능성이 높습니까?
방금 User
객체를 전달하면 작업중인 클래스를 약간 변경할 수 있습니다. 매개 변수를 추가해야하는 경우 클래스에 대한 참조를 수십 번 변경해야 할 수도 있습니다.
이 관행으로 인해 다른 원칙이 어겨 집니까? 의존성 역전? 추상화를 참조하지는 않지만 한 종류의 사용자 만 있으므로 사용자 인터페이스를 가질 필요가 없습니다.
기본 방어 프로그래밍 원칙과 같은 다른 비 SOLID 원칙을 위반하고 있습니까?
내 생성자가 다음과 같아야합니다.
MyConstructor(GUID userid, String username)
아니면 이거:
MyConstructor(User theUser)
포스트 편집 :
질문은 "Pass ID 또는 Object?"에서 대답하는 것이 좋습니다. 이것은 어느 쪽이든 결정이이 질문의 핵심 인 SOLID 원칙을 따르려는 시도에 어떻게 영향을 미치는지에 대한 질문에는 대답하지 않습니다.
I
는 SOLID
어떻습니까? MyConstructor
기본적으로 지금은 " Guid
와 a 가 필요합니다"라고 말합니다 string
. 그래서 이유를 제공하는 인터페이스가없는 Guid
과가 string
,하자 User
그 인터페이스를 구현하자 MyConstructor
그 인터페이스를 구현하는 인스턴스에 의존을? MyConstructor
변경 이 필요한 경우 인터페이스를 변경하십시오. -인터페이스를 제공 업체가 아닌 소비자 와 "소유"하는 데 크게 도움이되었습니다 . 따라서 " 소비자 로서 " 제공자 로서 이것을 할 수 있는 것 "대신"이것과 저것을하는 것이 필요합니다 "라고 생각하십시오 .