정적 메소드가있는 정적 클래스는 SOLID로 간주됩니까?


27

SOLID 에는 "프로그램의 개체를 해당 프로그램의 정확성을 변경하지 않고 하위 유형의 인스턴스로 대체 할 수 있어야합니다"라는 개념을 가진 Liskov 대체 원칙 이 포함되어 있습니다.

정적 메소드가있는 정적 클래스 (클래스와 약간 비슷 함 Math)에는 인스턴스가 전혀 없으므로 정적 메소드가있는 정적 클래스가 있으면 시스템이 SOLID로 간주됩니까?


이 질문이 훌륭하다고 생각합니다. 지역 사회가 제공하는 것을 보자.
Saeed Neamati

1
Math 클래스에는 상태가 포함되지 않습니다. 따라서이 유형의 객체를 실제로 전달하지 마십시오. 그래서 이것이 얼마나 관련성이 있는지 잘 모르겠습니다.
Martin York

정적 클래스가 실제로 순수한 SOLID라고 말할 수는 없지만 (이미 언급 한 것과 같은 여러 가지 이유로) DRY 원칙에 대한 훌륭한 옹호자 및 도구라고 생각합니다.
dreza

2
어떻게 요? 내 경험상 정적 클래스를 과도하게 사용하면 사람들이 하나의 전역 정적 신 객체를 영구적으로 조작하는 코드의 절반으로 항상 반복됩니다.
back2dos

1
공통 코드를 제공하기 위해 유틸리티 클래스 측면에서 더 많이 생각하고 있습니다. 나는 그것들이 쉽고 자주 잘못 사용된다는 데 동의하지만 여전히 국가가 문제가되지 않는 공통 코드를 그룹화하는 유용한 수단을 제공 할 수 있다고 생각합니다.
dreza

답변:


27

LSP는 클래스의 인스턴스를 메서드에 전달하는 데 적용되며, 메서드가 해당 인스턴스와 관련된 작업을 수행하고 종종 일종의 결과를 생성합니다. C #에서는 정적 클래스의 인스턴스를 만들 수 없으므로 정적 클래스는 중요하지 않습니다.

더 중요한 것은 정적 클래스 가 봉인되어 상속 될 수 없다는 것입니다. 이것은 C #이 진행되는 한 귀하의 질문을 혼란스럽게 만듭니다.

정적 클래스는 해당 원칙을 위반하는 서브 클래스를 생성 할 수 없으므로 항상 LSP를 준수한다고 말할 수 있습니다. 정적 클래스는 같은 이유로 LSP를 준수하지 않는다고 말할 수도 있습니다.


Java에서 정적 클래스는 약간 다릅니다. 최상위 클래스를 "정적"으로 표시 할 수 없으므로 C #의 정적 클래스와 유사한 유틸리티 클래스를 만들려면 클래스를 선언 final하고 생성자를 숨겨야합니다. 일단 그렇게하면 C #과 유사하게 동작하므로 인스턴스화하거나 서브 클래스화할 수 없습니다. 내부 클래스를로 선언 할 수 static있지만 C #에서와 같은 의미는 아닙니다. 단순히 중첩 된 최상위 클래스 를 나타냅니다 .

VB.NET 은이 경우 C #과 정확히 동일한 방식으로 작동합니다.


다른 원칙에 관심이 있는지 언급하지는 않았지만 완벽 성을 기하기 위해이를 포함시킬 것입니다.

S 화롯불 책임 원리 : 정적 클래스는 쉽게 원리를 따릅니다.
O 펜 / 폐쇄 원칙 : 정적 클래스가 봉인되어 있기 때문에, 그들도이 원리를 따를 수 없습니다.
L 이스 코프 치환 원리 : 상기와 같이.
I nterface의 분리 원칙 이 원칙을 다음 향해 단계가 될 수있는 하나의 클래스에 적용되지만 작고, 더 전문들로 분할 하나 개의 큰 정적 클래스하지 않습니다.
D ependency 반전 원리 : 그것을 사용하는 모든 클래스는 항상 시간에 존재하는 어떤 구현에 따라 달라집니다 그래서 정적 클래스, 인터페이스를 구현할 수 없습니다. 따라서 정적 클래스는이 원칙을 위반합니다.

정적 클래스는 5 가지 기준을 모두 만족하지 않으므로 SOLID가 아닙니다.


SOLID는 5 가지 기준을 모두 충족해야한다는 의미이므로 SOLID가 아님을 의미하지 않습니까?
Pacerier

1
@Pacerier 네,하지만 필요하지 않은 경우 항상 클래스를 SOLID에 삽입하려고 시도해서는 안됩니다. 그것은 수업의 상황에 달려 있습니다. 유틸리티 클래스이거나 무언가 인 경우 "SOLID"가 아니더라도 괜찮습니다. 그러나 특정 도메인을 사용하는 실제 도메인 클래스라면 ...
Wayne Molina

4

나는 객체 지향 지향과 같은 클래스를 분류하지 않기 때문에 객체 지향 디자인의 원칙을 충족시킬 수 없으며 시도해서는 안된다고 말하고 싶습니다.

이러한 클래스는 Java 및 C #과 같은 언어로 클래스 외부에서 코드를 제공 할 수없는 경우의 해결 방법 일뿐입니다. 가능한 경우 객체 지향의 이점을 얻지 못하므로 독립형 함수로 정의해야합니다.


수업 밖에서 독립형 기능을 사용하는 것에 동의하지 않습니다. 공통 이름으로 관련 기능을 그룹화하는 간단한 기능 (정적이든 아니든)은 가독성에 유용합니다. 수학 함수는 계산서에 완벽하게 맞습니다.
jojo

2
@jojo 동의합니다. 클래스 외부에서 정의 된 함수를 지원하는 언어도 이러한 함수의 논리적 그룹 (예 : C ++의 네임 스페이스)을 지원합니다.
Gyan 일명 Gary Buy 3

2

당신은 어떤 언어를 지정하지 않기 때문에 그것은 C에서 ++는 것을, 언급 할만큼 가치의 정적 멤버 액세스 템플릿을 통해 해당 구성원을 가지고있는 주위 클래스를 통과, 따라서 단지 정적 멤버와 클래스를 대체 할 수 있으며, 틀림없이, 방법 "인터페이스"라는 형식이라고합니다.


vb.net / c # / java
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.